eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 6.67 kB
JavaScript
import{toolBaseName}from"./tool-presentation.js";function groupToolBlocksForDisplay(e,t={}){if((t.logCoalescing??`window`)===`window`){let t=new Map;for(let n of e){if(!isGroupableLogWrite(n))continue;let e=logBucketKey(n),r=t.get(e);r===void 0?t.set(e,[n]):r.push(n)}let n=new Map;for(let e of t.values())n.set(e.at(-1),coalesceLogBucket(e));return groupBlocks(e,n)}return groupBlocks(e)}function groupBlocks(e,t){let n=[];for(let r=0;r<e.length;){let i=e[r];if(isGroupableLogWrite(i)){if(t!==void 0){let e=t.get(i);e!==void 0&&n.push(e),r+=1;continue}let a=[i];for(;r+a.length<e.length&&isGroupableLogWrite(e[r+a.length]);)a.push(e[r+a.length]);n.push(...coalesceLogWrites(a)),r+=a.length;continue}if(i.kind===`subagent`&&i.subagentCallId!==void 0){let i=collectSubagentRun(e,r,t);n.push(...i.groups),r+=i.consumed;continue}if(isCondensableChildTool(i)){let t=[i];for(;r+t.length<e.length;){let n=e[r+t.length];if(n.subagentCallId!==i.subagentCallId||!isCondensableChildTool(n)&&!isItemizedChildFailure(n))break;t.push(n)}let a=e[r+t.length],o=t.filter(isCondensableChildTool);if(o.length>=2&&a?.kind===`subagent-step`&&a.subagentCallId===i.subagentCallId){n.push({members:o,display:condenseChildToolRun(o)});for(let e of t)isCondensableChildTool(e)||n.push({members:[e],display:e});r+=t.length;continue}}if(!isGroupable(i)){n.push({members:[i],display:i}),r+=1;continue}let a=[i];for(;r+a.length<e.length;){let t=e[r+a.length];if(!isGroupable(t)||!sameRun(i,t))break;a.push(t)}a.some(e=>e.status===`running`)&&a.length>1?n.push({members:a,display:aggregateLiveToolBlocks(a)}):n.push(...partitionRunByStatus(a)),r+=a.length}return n}function isGroupable(e){return(e.kind===`tool`||e.kind===`subagent-tool`)&&e.toolGroup!==void 0&&e.expanded!==!0&&(e.status===`running`||e.status===`error`||e.status===`done`&&e.result===void 0)}function sameRun(e,t){return t.kind===e.kind&&t.depth===e.depth&&t.live===e.live&&t.toolName===e.toolName}function partitionRunByStatus(e){let t=new Map;for(let n of e){let e=t.get(n.status);e===void 0?t.set(n.status,[n]):e.push(n)}return[...t.values()].map(e=>({members:e,display:e.length===1?e[0]:e[0].status===`done`?collapseSettledToolBlocks(e):aggregateToolBlocks(e)}))}const maxVisibleSubagentRunChildren=1;function isGroupableLogWrite(e){return e.kind===`log`&&e.id===void 0}function logBucketKey(e){return`${e.title??``}\u0000${e.logVisibility??``}`}function coalesceLogWrites(e){let t=new Map;for(let n of e){let e=logBucketKey(n),r=t.get(e);r===void 0?t.set(e,[n]):r.push(n)}return[...t.values()].map(coalesceLogBucket)}function coalesceLogBucket(e){if(e.length===1)return{members:e,display:e[0]};let t=e.at(-1),n={kind:`log`,live:e.some(e=>e.live!==!1),body:t.body??``,elided:e.length-1};return t.title!==void 0&&(n.title=t.title),t.logVisibility!==void 0&&(n.logVisibility=t.logVisibility),{members:e,display:n}}const RUN_PASS_THROUGH_KINDS=new Set([`log`,`sandbox`,`error`,`warning`,`notice`]);function collectSubagentRun(e,t,r){let i=e[t],a=[i],o=new Map([[i.subagentCallId,[]]]),s=[],c=1;for(;t+c<e.length;c+=1){let r=e[t+c];if(RUN_PASS_THROUGH_KINDS.has(r.kind)){s.push(r);continue}if(r.kind===`subagent`){if(r.subagentCallId===void 0||o.has(r.subagentCallId))break;a.push(r),o.set(r.subagentCallId,[]);continue}let i=r.subagentCallId===void 0?void 0:o.get(r.subagentCallId);if(i===void 0)break;i.push(r)}for(;s.length>0&&e[t+c-1]===s.at(-1);)s.pop(),--c;let l=[];for(let e of a){let t=o.get(e.subagentCallId),n=e.live!==!1||t.some(e=>e.live!==!1),r=n===(e.live!==!1)?e:{...e,live:n};if(e.status===`done`){let i=condensedChildSummary(t);l.push({members:[e],display:r}),l.push({members:t,display:{kind:`subagent-close`,subagentCallId:e.subagentCallId,live:n,body:i===void 0?`Done`:`Done. ${i}`}});continue}l.push({members:[e],display:r});let recency=e=>e.members.reduce((e,t)=>Math.max(e,updateRecency(t)),-1),i=groupToolBlocksForDisplay(t).slice().sort((e,t)=>recency(e)-recency(t)),a=i.slice(0,Math.max(0,i.length-1)),s=i.slice(a.length),c=a.flatMap(e=>e.members);c.length>0&&l.push({members:c,display:{kind:`subagent-step`,depth:1,live:n,elided:c.length}}),l.push(...s.slice(0,-1));let u=s.at(-1);u!==void 0&&l.push({members:u.members,display:{...u.display,closesRail:!0}})}for(let e of s){if(r!==void 0&&isGroupableLogWrite(e)){let t=r.get(e);t!==void 0&&l.push(t);continue}l.push({members:[e],display:e})}return{consumed:c,groups:l}}function aggregateToolBlocks(e){let t=e[0],n=t.toolGroup,r=e.length;return{...t,id:void 0,result:void 0,title:`${n.verb} ${r} ${r===1?n.singularNoun:n.pluralNoun}`,toolGroupItems:newestFirstItems(e)}}function aggregateLiveToolBlocks(e){return{...aggregateToolBlocks(e),status:`running`,live:!0}}function collapseSettledToolBlocks(e){let t=e[0],n=t.toolGroup,r=e.length,i=r===1?n.singularNoun:n.pluralNoun;return{...t,id:void 0,result:void 0,title:`${n.verb} ${r} ${i}`,doneTitle:`${n.pastVerb} ${r} ${i}`}}function isCondensableChildTool(e){return e.kind===`subagent-tool`&&e.status===`done`&&e.expanded!==!0}function isItemizedChildFailure(e){return e.kind===`subagent-tool`&&e.status===`error`&&e.expanded!==!0}function condensedRunTitle(e){let t=new Map;for(let n of e){let e=condensedKindCopy(n),r=`${e.pastVerb} ${e.pluralNoun}`,i=t.get(r);i===void 0?t.set(r,{copy:e,count:1}):i.count+=1}let n=[...t.values()].sort((e,t)=>t.count-e.count),r=n.slice(0,3).map(({copy:e,count:t})=>`${e.pastVerb} ${t} ${t===1?e.singularNoun:e.pluralNoun}`);return n.length>3?`${r.join(`, `)}, and more`:r.join(`, `)}function condensedChildSummary(e){let t=e.filter(e=>e.kind===`subagent-tool`);if(t.length===0)return;let n=t.filter(e=>e.status===`done`),r=t.filter(e=>e.status===`error`).length,i=[];return n.length>0&&i.push(condensedRunTitle(n)),r>0&&i.push(`${r} failed`),i.length>0?i.join(`, `):void 0}function condenseChildToolRun(e){let t=condensedRunTitle(e),n=e[0];return{kind:`subagent-tool`,subagentCallId:n.subagentCallId,depth:n.depth,live:n.live,status:`done`,title:t,doneTitle:t,subtitle:``}}function condensedKindCopy(t){let n=t.toolGroup;return n===void 0?toolBaseName(t.toolName??``)===`write_file`?{pastVerb:`Wrote`,singularNoun:`file`,pluralNoun:`files`}:{pastVerb:`Made`,singularNoun:`tool call`,pluralNoun:`tool calls`}:{pastVerb:n.pastVerb,singularNoun:n.singularNoun,pluralNoun:n.pluralNoun}}function updateRecency(e){return e.updateSeq??0}function newestFirstItems(e){return e.map((e,t)=>({member:e,order:updateRecency(e),position:t})).sort((e,t)=>t.order-e.order||t.position-e.position).map(({member:e})=>{let t={text:e.toolGroup.item};return e.status===`error`&&e.result!==void 0?{...t,result:e.result}:t})}export{groupToolBlocksForDisplay,maxVisibleSubagentRunChildren};