eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
2 lines • 10.2 kB
JavaScript
import{isObject}from"#shared/guards.js";import{parseJsonObject}from"#shared/json.js";function githubContinuationToken(e){return e.conversationKind===`issue`?`repo:${e.repositoryId}:issue:${requiredNumber(e.issueNumber,`issueNumber`)}`:e.conversationKind===`pull_request`?`repo:${e.repositoryId}:pull:${requiredNumber(e.pullRequestNumber,`pullRequestNumber`)}`:`repo:${e.repositoryId}:pull:${requiredNumber(e.pullRequestNumber,`pullRequestNumber`)}:review-comment:${requiredNumber(e.reviewThreadRootCommentId,`reviewThreadRootCommentId`)}`}function shouldDispatchGitHubComment(e){return!isIgnoredGitHubComment(e.body,e.author,e.botName)&&extractGitHubCommentTrigger(e)!==null}function extractGitHubCommentTrigger(e){let t=e.botName?.trim();if(!t)return null;let n=RegExp(`@${escapeRegExp(t)}(?=$|[^A-Za-z0-9_-])`,`iu`).exec(e.body);if(n===null)return null;let r=n.index,i=r+n[0].length;return{kind:`mention`,message:`${e.body.slice(0,r)}${e.body.slice(i)}`.trim(),token:n[0]}}function parseGitHubWebhookEvent(e){let t=decodePayload(e.body,e.contentType),n=readHeader(e.headers,`x-github-event`)??inferGitHubWebhookEventName(t);if(n===null)return null;let r=normalizeRepository(t.repository),i=normalizeUser(t.sender);if(r===null||i===void 0)return null;let a={delivery:{event:n,hookId:readHeader(e.headers,`x-github-hook-id`)??readGitHubHookId(t),id:readHeader(e.headers,`x-github-delivery`)??inferGitHubDeliveryId(n,t)},installationId:readInstallationId(t.installation),raw:t,repository:r,sender:i};return n===`ping`?{...a,kind:`ping`}:n===`issue_comment`?parseIssueCommentEvent(a):n===`pull_request_review_comment`?parsePullRequestReviewCommentEvent(a):n===`issues`?parseIssueEvent(a):n===`pull_request`?parsePullRequestEvent(a):n===`check_suite`?parseCheckSuiteEvent(a):n===`check_run`?parseCheckRunEvent(a):n===`workflow_run`?parseWorkflowRunEvent(a):null}function inferGitHubWebhookEventName(e){return isObject(e.hook)&&typeof e.zen==`string`?`ping`:isObject(e.comment)&&isObject(e.issue)?`issue_comment`:isObject(e.comment)&&isObject(e.pull_request)?`pull_request_review_comment`:isObject(e.check_suite)?`check_suite`:isObject(e.check_run)?`check_run`:isObject(e.workflow_run)?`workflow_run`:isObject(e.issue)?`issues`:isObject(e.pull_request)&&!isObject(e.review)?`pull_request`:null}function inferGitHubDeliveryId(e,t){return`inferred:${e}:${readObjectNumber(t.comment,`id`)??readObjectNumber(t.issue,`id`)??readObjectNumber(t.issue,`number`)??readObjectNumber(t.pull_request,`id`)??readObjectNumber(t.pull_request,`number`)??readObjectNumber(t.check_suite,`id`)??readObjectNumber(t.check_run,`id`)??readObjectNumber(t.workflow_run,`id`)??readObjectNumber(t.hook,`id`)??`unknown`}:${readAction(t)||`unknown`}`}function readHeader(e,t){let n=e.get(t)?.trim();return n&&n.length>0?n:void 0}function formatGitHubContextBlock(e){return[`<github_context>`,`repository: ${e.repository.fullName}`,`repository_id: ${e.repository.id}`,...e.issueNumber!==void 0&&e.issueNumber!==null?[`issue_number: ${e.issueNumber}`]:[],...e.pullRequestNumber!==void 0&&e.pullRequestNumber!==null?[`pull_request_number: ${e.pullRequestNumber}`]:[],...e.botName?[`bot_name: ${e.botName}`]:[],...e.isMentioned===void 0?[]:[`is_mentioned: ${e.isMentioned}`],`sender: ${e.sender.login}`,`sender_type: ${e.sender.type}`,...e.commentUrl?[`comment_url: ${e.commentUrl}`]:[],...e.headSha?[`head_sha: ${e.headSha}`]:[],`delivery_id: ${e.deliveryId}`,`</github_context>`].join(`
`)}function parseIssueCommentEvent(e){let t=isObject(e.raw.issue)?e.raw.issue:null,n=isObject(e.raw.comment)?parseJsonObject(e.raw.comment):null,r=typeof t?.number==`number`?t.number:void 0;if(n===null||t===null||r===void 0)return null;let i=isObject(t.pull_request)?r:null,a=readAction(e.raw),o={author:normalizeUser(n.user),body:typeof n.body==`string`?n.body:``,htmlUrl:typeof n.html_url==`string`?n.html_url:void 0,id:typeof n.id==`number`?n.id:0,issueNumber:r,pullRequestNumber:i,raw:n,url:typeof n.url==`string`?n.url:void 0};return{...e,action:a,baseRef:null,baseSha:null,comment:o,conversation:{issueNumber:r,kind:i===null?`issue`:`pull_request`,pullRequestNumber:i},defaultBranch:null,headRef:null,headSha:null,kind:`issue_comment`}}function parsePullRequestReviewCommentEvent(e){let t=isObject(e.raw.comment)?parseJsonObject(e.raw.comment):null,n=isObject(e.raw.pull_request)?e.raw.pull_request:null,r=typeof n?.number==`number`?n.number:void 0;if(t===null||r===void 0)return null;let i=typeof t.id==`number`?t.id:0,a=typeof t.in_reply_to_id==`number`?t.in_reply_to_id:null,o={author:normalizeUser(t.user),body:typeof t.body==`string`?t.body:``,htmlUrl:typeof t.html_url==`string`?t.html_url:void 0,id:i,inReplyToId:a,pullRequestNumber:r,raw:t,reviewThreadRootCommentId:a??i,url:typeof t.url==`string`?t.url:void 0};return{...e,action:readAction(e.raw),baseRef:readPullRequestBaseRef(n),baseSha:readPullRequestBaseSha(n),comment:o,conversation:{issueNumber:null,kind:`review_thread`,pullRequestNumber:r},defaultBranch:readPullRequestDefaultBranch(n),headRef:readPullRequestHeadRef(n),headSha:readPullRequestHeadSha(n),kind:`pull_request_review_comment`}}function parseIssueEvent(e){let t=isObject(e.raw.issue)?e.raw.issue:null,n=typeof t?.number==`number`?t.number:void 0;return n===void 0?null:{...e,action:readAction(e.raw),conversation:{issueNumber:n,kind:`issue`,pullRequestNumber:null},issue:{action:readAction(e.raw),issueNumber:n,raw:parseJsonObject(t)},kind:`issues`}}function parsePullRequestEvent(e){let t=isObject(e.raw.pull_request)?e.raw.pull_request:null,n=typeof t?.number==`number`?t.number:void 0;return n===void 0?null:{...e,action:readAction(e.raw),baseRef:readPullRequestBaseRef(t),baseSha:readPullRequestBaseSha(t),conversation:{issueNumber:null,kind:`pull_request`,pullRequestNumber:n},defaultBranch:readPullRequestDefaultBranch(t),headRef:readPullRequestHeadRef(t),headSha:readPullRequestHeadSha(t),kind:`pull_request`,pullRequest:{action:readAction(e.raw),headSha:readPullRequestHeadSha(t),pullRequestNumber:n,raw:parseJsonObject(t)}}}function parseCheckSuiteEvent(e){let t=readEventObject(e.raw.check_suite);if(t===null)return null;let n=readId(t);if(n===null)return null;let r=normalizeCiEvent(e.raw,t,normalizeApp(t.app));return{...e,checkSuite:{...r,checkSuiteId:n},conversation:ciConversation(r.pullRequests),kind:`check_suite`}}function parseCheckRunEvent(e){let t=readEventObject(e.raw.check_run);if(t===null)return null;let n=readId(t);if(n===null)return null;let r=normalizeCiEvent(e.raw,t,normalizeApp(t.app));return{...e,checkRun:{...r,checkRunId:n},conversation:ciConversation(r.pullRequests),kind:`check_run`}}function parseWorkflowRunEvent(e){let t=readEventObject(e.raw.workflow_run);if(t===null)return null;let n=readId(t);if(n===null)return null;let r=normalizeCiEvent(e.raw,t,{slug:`github-actions`});return{...e,conversation:ciConversation(r.pullRequests),kind:`workflow_run`,workflowRun:{...r,workflowRunId:n}}}function normalizeCiEvent(e,t,n){return{action:readAction(e),app:n,conclusion:readNullableString(t.conclusion),headSha:readNullableString(t.head_sha),pullRequests:readPullRequestNumbers(t.pull_requests),raw:t,status:readNullableString(t.status)}}function readEventObject(e){return isObject(e)?parseJsonObject(e):null}function readId(e){return typeof e.id==`number`?e.id:null}function readObjectNumber(e,t){return isObject(e)&&typeof e[t]==`number`?e[t]:null}function normalizeApp(e){return{slug:isObject(e)&&typeof e.slug==`string`?e.slug:null}}function readNullableString(e){return typeof e==`string`?e:null}function readPullRequestNumbers(e){return Array.isArray(e)?e.flatMap(e=>isObject(e)&&typeof e.number==`number`?[e.number]:[]):[]}function ciConversation(e){return{issueNumber:null,kind:`pull_request`,pullRequestNumber:e[0]??null}}function decodePayload(e,t){if(t?.includes(`application/x-www-form-urlencoded`)===!0){let t=new URLSearchParams(e).get(`payload`)??``;return parseJsonObject(JSON.parse(t))}return parseJsonObject(JSON.parse(e))}function normalizeRepository(e){if(!isObject(e))return null;let t=typeof e.full_name==`string`?e.full_name:``,[n=``,r=``]=t.split(`/`),i=isObject(e.owner)?e.owner:{},a=typeof i.login==`string`?i.login:n,o=typeof e.name==`string`?e.name:r,s=typeof e.id==`number`?e.id:0;return!a||!o?null:{fullName:t||`${a}/${o}`,id:s,name:o,owner:a,private:e.private===!0}}function normalizeUser(e){if(!isObject(e))return;let t=typeof e.login==`string`?e.login:``;if(t)return{htmlUrl:typeof e.html_url==`string`?e.html_url:void 0,id:typeof e.id==`number`?e.id:0,login:t,type:typeof e.type==`string`?e.type:`User`,url:typeof e.url==`string`?e.url:void 0}}function readInstallationId(e){if(isObject(e))return typeof e.id==`number`?e.id:void 0}function readGitHubHookId(e){if(typeof e.hook_id==`number`)return String(e.hook_id);if(typeof e.hook_id==`string`&&e.hook_id.length>0)return e.hook_id;let t=readObjectNumber(e.hook,`id`);return t===null?void 0:String(t)}function readAction(e){return typeof e.action==`string`?e.action:``}function readPullRequestHeadSha(e){let t=isObject(e?.head)?e.head:null;return typeof t?.sha==`string`?t.sha:null}function readPullRequestHeadRef(e){let t=isObject(e?.head)?e.head:null;return typeof t?.ref==`string`?t.ref:null}function readPullRequestBaseRef(e){let t=isObject(e?.base)?e.base:null;return typeof t?.ref==`string`?t.ref:null}function readPullRequestBaseSha(e){let t=isObject(e?.base)?e.base:null;return typeof t?.sha==`string`?t.sha:null}function readPullRequestDefaultBranch(e){let t=isObject(e?.base)?e.base:null,n=isObject(t?.repo)?t.repo:null;return typeof n?.default_branch==`string`?n.default_branch:null}function isIgnoredGitHubComment(e,t,n){if(e.includes(`<!-- eve:github:`))return!0;if(t===void 0)return!1;if(t.type===`Bot`)return!0;let r=n?`${n}[bot]`.toLowerCase():``;return r.length>0&&t.login.toLowerCase()===r}function requiredNumber(e,t){if(typeof e==`number`&&Number.isFinite(e))return e;throw Error(`githubContinuationToken requires ${t}.`)}function escapeRegExp(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,`\\$&`)}export{extractGitHubCommentTrigger,formatGitHubContextBlock,githubContinuationToken,parseGitHubWebhookEvent,shouldDispatchGitHubComment};