eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
4 lines (3 loc) • 3.03 kB
JavaScript
import{resolveTextToResponses}from"#channel/resolve-text.js";const LINEAR_HITL_MARKER_PREFIX=`<!-- eve-input:`,LINEAR_HITL_MARKER_SUFFIX=` -->`;function renderLinearInputRequests(e){let t=encodeLinearHitlMarker(e.map(storableRequest));return`${e.map(renderLinearInputRequest).join(`
`)}\n\n${t}`}function resolveLinearPromptInputResponses(t){let n=findLatestLinearHitlMarker(t.activities);return n===null?[]:resolveTextToResponses(t.body,n.requests.map(toInputRequest))}function stripLinearHitlMarker(e){let n=e.indexOf(LINEAR_HITL_MARKER_PREFIX);return n===-1?e:e.slice(0,n).trimEnd()}function renderLinearInputRequest(e){let t=[e.prompt];return e.options!==void 0&&e.options.length>0&&t.push(``,...e.options.map((e,t)=>{let n=e.description?` - ${e.description}`:``;return`${t+1}. ${e.label}${n}`})),e.allowFreeform===!0&&t.push(``,`You can also reply with a custom answer.`),t.join(`
`)}function storableRequest(e){let t={prompt:e.prompt,requestId:e.requestId};return e.allowFreeform!==void 0&&(t.allowFreeform=e.allowFreeform),e.display!==void 0&&(t.display=e.display),e.options!==void 0&&(t.options=e.options),t}function toInputRequest(e){let t={action:{callId:`linear-input:${e.requestId}`,input:{},kind:`tool-call`,toolName:`linear_input`},prompt:e.prompt,requestId:e.requestId};return e.allowFreeform!==void 0&&(t.allowFreeform=e.allowFreeform),e.display!==void 0&&(t.display=e.display),e.options!==void 0&&(t.options=[...e.options]),t}function encodeLinearHitlMarker(e){return`${LINEAR_HITL_MARKER_PREFIX}${Buffer.from(JSON.stringify({requests:e}),`utf8`).toString(`base64url`)}${LINEAR_HITL_MARKER_SUFFIX}`}function findLatestLinearHitlMarker(e){for(let t=e.length-1;t>=0;--t){let n=e[t]?.content.body;if(n===void 0)continue;let r=decodeLinearHitlMarker(n);if(r!==null)return r}return null}function decodeLinearHitlMarker(e){let r=e.lastIndexOf(LINEAR_HITL_MARKER_PREFIX);if(r===-1)return null;let i=r+15,a=e.indexOf(LINEAR_HITL_MARKER_SUFFIX,i);if(a===-1)return null;try{let t=Buffer.from(e.slice(i,a),`base64url`).toString(`utf8`),n=JSON.parse(t);return isMarkerPayload(n)?n:null}catch{return null}}function isMarkerPayload(e){if(!e||typeof e!=`object`||!(`requests`in e))return!1;let t=e.requests;return Array.isArray(t)&&t.every(isStoredRequest)}function isStoredRequest(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.prompt!=`string`||typeof t.requestId!=`string`||t.allowFreeform!==void 0&&typeof t.allowFreeform!=`boolean`||t.display!==void 0&&t.display!==`confirmation`&&t.display!==`select`&&t.display!==`text`)return!1;let n=t.options;return n===void 0||Array.isArray(n)&&n.every(isStoredOption)}function isStoredOption(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id!=`string`||typeof t.label!=`string`||t.description!==void 0&&typeof t.description!=`string`?!1:t.style===void 0||t.style===`primary`||t.style===`danger`||t.style==="default"}export{LINEAR_HITL_MARKER_PREFIX,LINEAR_HITL_MARKER_SUFFIX,renderLinearInputRequests,resolveLinearPromptInputResponses,stripLinearHitlMarker};