eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
3 lines • 5.25 kB
JavaScript
import{isNonEmptyString,isObject}from"#shared/guards.js";import{parseJsonObject}from"#shared/json.js";import TurndownService from"#compiled/turndown/index.js";const HTML_ENTITY_MAP={"&":`&`,">":`>`,"<":`<`," ":` `,""":`"`,"'":`'`,"'":`'`},HTML_ENTITY_PATTERN=new RegExp(Object.keys(HTML_ENTITY_MAP).join(`|`),`gi`);let turndownService=null;function parseTeamsActivity(e){return isObject(e)?e.type===`message`?parseMessageActivity(e):e.type===`invoke`?parseInvokeActivity(e):e.type===`conversationUpdate`?parseConversationUpdateActivity(e):null:null}function isTeamsPersonalMessage(e){return e.scope===`personal`}function teamsThreadRootActivityId(e){return e.scope===`personal`?null:e.replyToId??e.id}function formatTeamsContextBlock(e){return[`<teams_context>`,`response_medium: microsoft_teams`,`response_instructions: Reply for Microsoft Teams in concise Markdown. Avoid broad mentions, large tables, and messages that need more than a few short posts.`,...e.botId?[`bot_id: ${e.botId}`]:[],...e.isMentioned===void 0?[]:[`is_mentioned: ${e.isMentioned}`],`user_id: ${e.userId}`,...e.userName?[`user_name: ${e.userName}`]:[],`conversation_id: ${e.conversationId}`,`scope: ${e.scope}`,...e.conversationType?[`conversation_type: ${e.conversationType}`]:[],...e.tenantId?[`tenant_id: ${e.tenantId}`]:[],...e.teamId?[`team_id: ${e.teamId}`]:[],...e.channelId?[`channel_id: ${e.channelId}`]:[],`activity_id: ${e.activityId}`,`</teams_context>`].join(`
`)}function parseMessageActivity(e){let t=parseActivityBase(e);if(!t)return null;let n=parseMentions(e.entities),r=normalizeTeamsText(stripBotMention(readText(e),n,t.recipient.id));return{...t,attachments:parseAttachments(e.attachments),isBotMentioned:n.some(e=>e.mentioned.id===t.recipient.id),mentions:n,replyToId:isNonEmptyString(e.replyToId)?e.replyToId:void 0,scope:inferScope(t.conversation),text:r,textFormat:isNonEmptyString(e.textFormat)?e.textFormat:void 0,type:`message`,value:isObject(e.value)?e.value:void 0}}function parseInvokeActivity(e){let t=parseActivityBase(e);return!t||!isNonEmptyString(e.name)?null:{...t,name:e.name,replyToId:isNonEmptyString(e.replyToId)?e.replyToId:void 0,scope:inferScope(t.conversation),type:`invoke`,value:isObject(e.value)?e.value:void 0}}function parseConversationUpdateActivity(e){let t=parseActivityBase(e);return t?{...t,type:`conversationUpdate`}:null}function parseActivityBase(e){if(!isNonEmptyString(e.serviceUrl))return null;let t=parseConversation(e.conversation),n=parseChannelAccount(e.from),r=parseChannelAccount(e.recipient);if(!t||!n||!r)return null;let i=isObject(e.channelData)?e.channelData:{},a=readNestedString(i,[`tenant`,`id`])??t.tenantId,o=readNestedString(i,[`team`,`id`]),s=readNestedString(i,[`channel`,`id`]);return{channelData:i,conversation:t,conversationType:t.conversationType,from:n,id:isNonEmptyString(e.id)?e.id:``,raw:e,recipient:r,serviceUrl:e.serviceUrl,tenantId:a,teamId:o,teamsChannelId:s}}function parseConversation(e){return!isObject(e)||!isNonEmptyString(e.id)?null:{conversationType:isNonEmptyString(e.conversationType)?e.conversationType:void 0,id:e.id,isGroup:typeof e.isGroup==`boolean`?e.isGroup:void 0,name:isNonEmptyString(e.name)?e.name:void 0,tenantId:isNonEmptyString(e.tenantId)?e.tenantId:void 0}}function parseChannelAccount(e){return!isObject(e)||!isNonEmptyString(e.id)?null:{aadObjectId:isNonEmptyString(e.aadObjectId)?e.aadObjectId:void 0,id:e.id,name:isNonEmptyString(e.name)?e.name:void 0,role:isNonEmptyString(e.role)?e.role:void 0}}function parseMentions(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!isObject(n)||n.type!==`mention`||!isNonEmptyString(n.text))continue;let e=parseChannelAccount(n.mentioned);e&&t.push({mentioned:e,text:n.text,type:`mention`})}return t}function parseAttachments(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!isObject(n)||!isNonEmptyString(n.contentType))continue;let e={content:isObject(n.content)?parseJsonObject(n.content):void 0,contentType:n.contentType,contentUrl:isNonEmptyString(n.contentUrl)?n.contentUrl:void 0,name:isNonEmptyString(n.name)?n.name:void 0};t.push(e)}return t}function inferScope(e){let t=e.conversationType;return t===`personal`||t===`groupChat`||t===`channel`?t:e.isGroup===!0?`groupChat`:e.isGroup===!1?`personal`:`unknown`}function readText(e){return typeof e.text==`string`?e.text:``}function stripBotMention(e,t,n){let r=e;for(let e of t)e.mentioned.id===n&&(r=r.replace(e.text,``));return r.trim()}function normalizeTeamsText(e){let t=e.trim();return looksLikeHtml(t)?getTurndownService().turndown(t.replace(/<at>(.*?)<\/at>/gi,`@$1`)).replace(/ {2}\n/g,`
`).trim():decodeHtmlEntities(t)}function readNestedString(e,t){let n=e;for(let e of t){if(!isObject(n))return;n=n[e]}return isNonEmptyString(n)?n:void 0}function looksLikeHtml(e){return/<\/?[a-z][\s\S]*>/i.test(e)}function decodeHtmlEntities(e){return e.replace(HTML_ENTITY_PATTERN,e=>HTML_ENTITY_MAP[e.toLowerCase()]??e)}function getTurndownService(){return turndownService??=new TurndownService({bulletListMarker:`-`,codeBlockStyle:`fenced`,emDelimiter:`*`,headingStyle:`atx`,hr:`---`}),turndownService}export{formatTeamsContextBlock,isTeamsPersonalMessage,parseTeamsActivity,teamsThreadRootActivityId};