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