eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.73 kB
JavaScript
import{DISCORD_INTERACTION_RESPONSE_TYPE}from"#public/channels/discord/inbound.js";const DISCORD_COMPONENT_TYPE={ACTION_ROW:1,BUTTON:2,STRING_SELECT:3,TEXT_INPUT:4},DISCORD_HITL_CUSTOM_ID_PREFIX=`eve_input:`,DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX=`eve_input_freeform:`,DISCORD_HITL_FREEFORM_TEXT_INPUT_ID=`eve_freeform_text`;function renderInputRequestComponents(e){let i=e.options,a=e.allowFreeform===!0||!i||i.length===0;return i&&i.length>0&&e.display===`select`?[{components:[{custom_id:encodeHitlCustomId(DISCORD_HITL_CUSTOM_ID_PREFIX,{requestId:e.requestId}),options:i.slice(0,25).map(e=>{let t={label:truncate(e.label,100),value:truncate(e.id,100)};return e.description!==void 0&&(t.description=truncate(e.description,100)),t}),placeholder:`Choose an option`,type:DISCORD_COMPONENT_TYPE.STRING_SELECT}],type:DISCORD_COMPONENT_TYPE.ACTION_ROW}]:i&&i.length>0?chunk(i.slice(0,25),5).map(r=>({components:r.map(r=>({custom_id:encodeHitlCustomId(DISCORD_HITL_CUSTOM_ID_PREFIX,{optionId:r.id,requestId:e.requestId}),label:truncate(r.label,80),style:toDiscordButtonStyle(r.style),type:DISCORD_COMPONENT_TYPE.BUTTON})),type:DISCORD_COMPONENT_TYPE.ACTION_ROW})):a?[{components:[{custom_id:encodeHitlCustomId(DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX,{requestId:e.requestId}),label:`Type your answer`,style:1,type:DISCORD_COMPONENT_TYPE.BUTTON}],type:DISCORD_COMPONENT_TYPE.ACTION_ROW}]:[]}function buildFreeformModalResponse(n){let a=decodeHitlCustomId(n.customId,DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX);if(!a)throw Error(`discordChannel: freeform custom_id is malformed.`);return{data:{components:[{components:[{custom_id:DISCORD_HITL_FREEFORM_TEXT_INPUT_ID,label:`Answer`,max_length:4e3,min_length:1,placeholder:`Type your answer here...`,required:!0,style:2,type:DISCORD_COMPONENT_TYPE.TEXT_INPUT}],type:DISCORD_COMPONENT_TYPE.ACTION_ROW}],custom_id:encodeHitlCustomId(DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX,{requestId:a.requestId}),title:truncate(n.prompt??`Your answer`,45)},type:DISCORD_INTERACTION_RESPONSE_TYPE.MODAL}}function isDiscordFreeformComponent(e){return decodeHitlCustomId(e,DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX)!==null}function deriveComponentInputResponses(e){let t=decodeHitlCustomId(e.customId,DISCORD_HITL_CUSTOM_ID_PREFIX);if(!t)return[];if(t.optionId!==void 0)return[{optionId:t.optionId,requestId:t.requestId}];let r=e.values[0];return r===void 0?[]:[{optionId:r,requestId:t.requestId}]}function deriveModalInputResponses(e){let t=decodeHitlCustomId(e.customId,DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX),n=e.textInputs[DISCORD_HITL_FREEFORM_TEXT_INPUT_ID];return!t||n===void 0?[]:[{requestId:t.requestId,text:n}]}function encodeHitlCustomId(e,t){let n=`${e}${Buffer.from(JSON.stringify(t),`utf8`).toString(`base64url`)}`;if(n.length>100)throw Error(`discordChannel: HITL custom_id exceeded Discord's 100-character limit.`);return n}function decodeHitlCustomId(e,t){if(!e.startsWith(t))return null;try{let n=Buffer.from(e.slice(t.length),`base64url`).toString(`utf8`),r=JSON.parse(n);if(typeof r.requestId!=`string`||r.requestId.length===0)return null;let i={requestId:r.requestId};return typeof r.optionId==`string`?{...i,optionId:r.optionId}:i}catch{return null}}function toDiscordButtonStyle(e){return e===`primary`?1:e===`danger`?4:2}function truncate(e,t){if(e.length<=t)return e;let n=Math.max(0,t-3);return`${e.slice(0,n).trimEnd()}...`}function chunk(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}export{DISCORD_COMPONENT_TYPE,DISCORD_HITL_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_CUSTOM_ID_PREFIX,DISCORD_HITL_FREEFORM_TEXT_INPUT_ID,buildFreeformModalResponse,deriveComponentInputResponses,deriveModalInputResponses,isDiscordFreeformComponent,renderInputRequestComponents};