eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
2 lines • 4.36 kB
JavaScript
import{isObject,readNonEmptyString}from"#shared/guards.js";import{parseJsonObject}from"#shared/json.js";function linearContinuationToken(e){return`agent-session:${e}`}function parseLinearWebhookEvent(e){let t=parseJsonObject(JSON.parse(e.body)),n={event:e.headers.get(`linear-event`)??void 0,id:e.headers.get(`linear-delivery`)??void 0},r=readNonEmptyString(t.type);if(!r)return null;if(r===`AgentSessionEvent`){let e=readAgentSession(t.agentSession);return e===null?null:{action:readNonEmptyString(t.action)??`created`,agentActivity:readAgentActivity(t.agentActivity),agentSession:e,appUserId:readNonEmptyString(t.appUserId),createdAt:readNonEmptyString(t.createdAt),delivery:n,guidance:readNonEmptyString(t.guidance),kind:`agent_session`,oauthClientId:readNonEmptyString(t.oauthClientId),organizationId:readNonEmptyString(t.organizationId),previousComments:readPreviousComments(t.previousComments),promptContext:readNonEmptyString(t.promptContext),raw:t}}return{action:readNonEmptyString(t.action),delivery:n,kind:`data`,organizationId:readNonEmptyString(t.organizationId),raw:t,type:r}}function messageFromLinearAgentSessionEvent(e){if(e.action===`prompted`){let t=e.agentActivity?.body;if(t!==void 0&&t.trim().length>0)return t}let t=e.promptContext?.trim();if(t!==void 0&&t.length>0)return t;let n=e.agentSession.summary?.trim();if(n!==void 0&&n.length>0)return n;let r=e.agentSession.issue;return r?.title?`${r.identifier?`${r.identifier}: `:``}${r.title}`:`Linear agent session started.`}function formatLinearContextBlock(e){let t=e.agentSession,n=t.issue,r=e.appUserId??t.appUserId;return[`<linear_context>`,`action: ${e.action}`,...r?[`app_user_id: ${r}`]:[],`agent_session_id: ${t.id}`,`agent_session_url: ${t.url??``}`,`organization_id: ${e.organizationId??t.organizationId??``}`,`issue_id: ${t.issueId??n?.id??``}`,`issue_identifier: ${n?.identifier??``}`,`issue_title: ${n?.title??``}`,`issue_url: ${n?.url??``}`,`comment_id: ${t.commentId??``}`,`source_comment_id: ${t.sourceCommentId??``}`,`response_medium: linear_agent_activity`,`</linear_context>`].join(`
`)}function readAgentSession(e){if(!isObject(e)||typeof e.id!=`string`)return null;let t={id:e.id};typeof e.appUserId==`string`&&(t.appUserId=e.appUserId),(typeof e.commentId==`string`||e.commentId===null)&&(t.commentId=e.commentId),t.creator=readUser(e.creator),(typeof e.creatorId==`string`||e.creatorId===null)&&(t.creatorId=e.creatorId);let n=readIssue(e.issue);return n!==void 0&&(t.issue=n),(typeof e.issueId==`string`||e.issueId===null)&&(t.issueId=e.issueId),typeof e.organizationId==`string`&&(t.organizationId=e.organizationId),(typeof e.sourceCommentId==`string`||e.sourceCommentId===null)&&(t.sourceCommentId=e.sourceCommentId),typeof e.status==`string`&&(t.status=e.status),(typeof e.summary==`string`||e.summary===null)&&(t.summary=e.summary),(typeof e.url==`string`||e.url===null)&&(t.url=e.url),t}function readAgentActivity(e){if(!isObject(e)||typeof e.id!=`string`)return;let t=isObject(e.content)?parseJsonObject(e.content):{},n={body:readActivityBody(e.content),content:t,id:e.id};return(typeof e.signal==`string`||e.signal===null)&&(n.signal=e.signal),isObject(e.signalMetadata)&&(n.signalMetadata=parseJsonObject(e.signalMetadata)),e.signalMetadata===null&&(n.signalMetadata=null),(typeof e.sourceCommentId==`string`||e.sourceCommentId===null)&&(n.sourceCommentId=e.sourceCommentId),n.user=readUser(e.user),(typeof e.userId==`string`||e.userId===null)&&(n.userId=e.userId),n}function readActivityBody(e){if(isObject(e))return readNonEmptyString(e.body)}function readIssue(e){if(e===null)return null;if(!isObject(e)||typeof e.id!=`string`)return;let t={id:e.id};return typeof e.identifier==`string`&&(t.identifier=e.identifier),typeof e.title==`string`&&(t.title=e.title),typeof e.url==`string`&&(t.url=e.url),t}function readUser(e){if(!isObject(e)||typeof e.id!=`string`)return;let t={id:e.id};return typeof e.displayName==`string`&&(t.displayName=e.displayName),typeof e.name==`string`&&(t.name=e.name),typeof e.email==`string`&&(t.email=e.email),typeof e.url==`string`&&(t.url=e.url),t}function readPreviousComments(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e:isObject(e)&&typeof e.body==`string`?e.body:null).filter(e=>e!==null):[]}export{formatLinearContextBlock,linearContinuationToken,messageFromLinearAgentSessionEvent,parseLinearWebhookEvent};