eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
4 lines • 6.37 kB
JavaScript
import{isObject}from"#shared/guards.js";import{formatSlackLink}from"#compiled/@chat-adapter/slack/format.js";function resolveSlackInboundMrkdwn(e,t){try{return resolveSlackInboundMrkdwnUnsafe(e,t)}catch{return e}}function resolveSlackInboundMrkdwnUnsafe(e,t){let n=extractSlackStructuredMrkdwn(t.blocks,t.attachments),r=e.trim();if(!r)return n;if(!n||normalizeComparableText(n)===normalizeComparableText(r))return e;let i=normalizeComparableText(n),a=normalizeComparableText(r);return n.length>r.length&&i.includes(a)?n:hasSharedMessageAttachment(t.attachments)?a.includes(i)?e:`${e}\n${n}`:n.length>=r.length*2?Array.isArray(t.attachments)&&t.attachments.length>0&&!i.includes(a)?`${e}\n${n}`:n:e}function extractSlackStructuredMrkdwn(e,t){return[...extractBlockKitLines(e),...extractLegacyAttachmentLines(t)].join(`
`).trim()}function extractBlockKitLines(e){if(!Array.isArray(e))return[];let t=[];for(let n of e)if(isObject(n))switch(n.type){case`section`:appendTextObjectLine(t,n.text),appendFieldLines(t,n.fields),appendSectionAccessoryLine(t,n.accessory);break;case`header`:appendTextObjectLine(t,n.text);break;case`video`:appendTextObjectLine(t,n.title),appendTextObjectLine(t,n.description);break;case`markdown`:typeof n.text==`string`&&n.text.length>0&&t.push(n.text);break;case`table`:case`data_table`:appendTableLines(t,n);break;case`card`:appendCardLines(t,n);break;case`carousel`:if(Array.isArray(n.elements))for(let e of n.elements)isObject(e)&&appendCardLines(t,e);break;case`container`:appendTextObjectLine(t,n.title),appendTextObjectLine(t,n.subtitle),t.push(...extractBlockKitLines(n.child_blocks));break;case`context`:appendElementLines(t,n.elements);break;case`actions`:appendActionsLine(t,n.elements);break;case`rich_text`:appendRichTextLine(t,n.elements);break;case`image`:typeof n.alt_text==`string`&&n.alt_text.length>0&&t.push(n.alt_text),typeof n.title==`object`&&n.title!==null&&appendTextObjectLine(t,n.title)}return t}function extractLegacyAttachmentLines(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!isObject(n))continue;let e=t.length;typeof n.pretext==`string`&&n.pretext.length>0&&t.push(n.pretext),typeof n.title==`string`&&n.title.length>0&&t.push(n.title),typeof n.text==`string`&&n.text.length>0&&t.push(n.text),appendLegacyFieldLines(t,n.fields),typeof n.footer==`string`&&n.footer.length>0&&t.push(n.footer),t.push(...extractBlockKitLines(n.blocks)),t.push(...extractSlackMessageUnfurlLines(n.message_blocks)),t.length===e&&typeof n.fallback==`string`&&n.fallback.length>0&&t.push(n.fallback)}return t}function hasSharedMessageAttachment(e){return Array.isArray(e)?e.some(e=>isObject(e)&&(Array.isArray(e.message_blocks)||e.is_share===!0||e.is_msg_unfurl===!0||e.is_reply_unfurl===!0)):!1}function extractSlackMessageUnfurlLines(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!isObject(n)||!isObject(n.message))continue;let e=extractBlockKitLines(n.message.blocks);e.length>0?t.push(...e):typeof n.message.text==`string`&&n.message.text.length>0&&t.push(n.message.text)}return t}function appendTextObjectLine(e,t){let n=readSlackTextObject(t);n&&e.push(n)}function appendFieldLines(e,t){if(Array.isArray(t))for(let n of t)appendTextObjectLine(e,n)}function appendElementLines(e,t){if(Array.isArray(t)){for(let n of t)if(isObject(n)){if(n.type===`image`){typeof n.alt_text==`string`&&n.alt_text.length>0&&e.push(n.alt_text);continue}appendTextObjectLine(e,n)}}}function appendSectionAccessoryLine(e,t){isObject(t)&&t.type===`button`&&appendActionsLine(e,[t])}function appendCardLines(e,t){appendTextObjectLine(e,t.title),appendTextObjectLine(e,t.subtitle),appendTextObjectLine(e,t.body),appendTextObjectLine(e,t.subtext),appendActionsLine(e,t.actions)}function appendTableLines(e,t){if(appendTextObjectLine(e,t.caption),Array.isArray(t.rows))for(let n of t.rows){if(!Array.isArray(n))continue;let t=n.map(tableCellToPlain);t.some(e=>e.length>0)&&e.push(t.join(` | `))}}function tableCellToPlain(e){return isObject(e)?e.type===`rich_text`?richTextPartsToPlain(e.elements):typeof e.text==`string`?e.text:typeof e.value==`number`||typeof e.value==`string`?String(e.value):``:``}function appendActionsLine(e,t){if(!Array.isArray(t))return;let n=t.map(e=>isObject(e)?readSlackTextObject(e.text):``).filter(e=>e.length>0);n.length>0&&e.push(n.map(e=>`[${e}]`).join(` `))}function appendLegacyFieldLines(e,t){if(Array.isArray(t))for(let n of t){if(!isObject(n))continue;let t=typeof n.title==`string`?n.title.trim():``,r=typeof n.value==`string`?n.value.trim():``;t&&r?e.push(`${t}: ${r}`):r?e.push(r):t&&e.push(t)}}function appendRichTextLine(e,t){let n=richTextPartsToPlain(t);n&&e.push(n)}function richTextPartsToPlain(e){return Array.isArray(e)?e.map(e=>isObject(e)?richTextPartToPlain(e):``).filter(e=>e.length>0).join(`
`):``}function richTextPartToPlain(e){switch(e.type){case`rich_text_section`:case`rich_text_preformatted`:case`rich_text_quote`:return richTextInlineToPlain(e.elements);case`rich_text_list`:return richTextListToPlain(e);default:return``}}function richTextInlineToPlain(e){if(!Array.isArray(e))return``;let t=[];for(let n of e)if(isObject(n))switch(n.type){case`text`:typeof n.text==`string`&&t.push(n.text);break;case`link`:typeof n.url==`string`&&typeof n.text==`string`?t.push(formatInboundRichTextLink(n.url,n.text)):typeof n.text==`string`?t.push(n.text):typeof n.url==`string`&&t.push(n.url);break;case`emoji`:typeof n.name==`string`&&t.push(`:${n.name}:`);break;case`user`:typeof n.user_id==`string`&&t.push(`<@${n.user_id}>`);break;case`channel`:typeof n.channel_id==`string`&&t.push(`<#${n.channel_id}>`);break;case`usergroup`:typeof n.usergroup_id==`string`&&t.push(`<!subteam^${n.usergroup_id}>`);break;case`broadcast`:typeof n.range==`string`&&t.push(`<!${n.range}>`);break;case`date`:typeof n.fallback==`string`&&t.push(n.fallback)}return t.join(``)}function richTextListToPlain(e){return Array.isArray(e.elements)?e.elements.map(e=>isObject(e)?richTextInlineToPlain(e.elements):``).filter(e=>e.length>0).join(`
`):``}function readSlackTextObject(e){return isObject(e)&&typeof e.text==`string`?e.text:``}function normalizeComparableText(e){return e.replace(/\s+/gu,` `).trim()}function formatInboundRichTextLink(e,t){try{return formatSlackLink(e,t)}catch(n){if(n instanceof TypeError)return`${t} (${e})`;throw n}}export{readSlackTextObject,resolveSlackInboundMrkdwn};