@anvia/studio 1.3.15 → 1.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import{i as e,n as t,r as n,s as r}from"./dist-gzPjmjmv.js";import{l as i,t as a}from"./button-4bdMllZ8.js";import{c as o,i as s,t as c}from"./request-C9FAR59q.js";import{t as l}from"./textarea-D_t9rW9X.js";import{r as u}from"./renderers-C1LvbME4.js";var d=r(e(),1),f=n();function p(e){let[t,n]=(0,d.useState)({}),{request:r,status:i}=e.item,o=e.busy||i!==`pending`;return(0,f.jsxs)(`section`,{className:`space-y-3 rounded-xl border border-hair bg-card p-4`,"aria-label":`${e.name}: ${r.toolName}`,children:[(0,f.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 text-sm`,children:[(0,f.jsxs)(`strong`,{children:[e.name,` · `,r.toolName]}),(0,f.jsx)(`span`,{className:`text-muted-foreground`,children:e.busy?`Submitting…`:i===`pending`?`Needs your input`:i})]}),(0,f.jsxs)(`p`,{className:`break-all text-xs text-muted-foreground`,children:[`Instance `,e.item.instanceId]}),r.type===`tool-approval`?(0,f.jsxs)(f.Fragment,{children:[r.reason&&(0,f.jsx)(`p`,{className:`text-sm`,children:r.reason}),(0,f.jsx)(`pre`,{className:`max-h-48 overflow-auto whitespace-pre-wrap break-all text-xs`,children:JSON.stringify(r.input,null,2)}),(0,f.jsxs)(`div`,{className:`flex gap-2`,children:[(0,f.jsx)(a,{size:`sm`,disabled:o,onClick:()=>void e.respond(r.id,{type:`tool-approval`,approved:!0}),children:`Approve`}),(0,f.jsx)(a,{size:`sm`,variant:`secondary`,disabled:o,onClick:()=>void e.respond(r.id,{type:`tool-approval`,approved:!1}),children:`Deny`})]})]}):(0,f.jsxs)(`form`,{className:`space-y-3`,onSubmit:n=>{n.preventDefault(),e.respond(r.id,{type:`tool-question`,answers:r.questions.map(e=>({questionId:e.id,value:t[e.id]??``}))})},children:[r.questions.map(e=>(0,f.jsxs)(`fieldset`,{disabled:o,className:`space-y-2`,children:[(0,f.jsx)(`legend`,{className:`mb-2 text-sm`,children:e.text}),e.choices?.map(i=>(0,f.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,f.jsx)(`input`,{type:`radio`,name:`${r.id}:${e.id}`,value:i.value,checked:t[e.id]===i.value,onChange:()=>n(t=>({...t,[e.id]:i.value}))}),i.label]},i.value)),(!e.choices?.length||e.allowCustom)&&(0,f.jsx)(l,{"aria-label":e.text,placeholder:`Your answer`,value:t[e.id]??``,onChange:t=>n(n=>({...n,[e.id]:t.target.value}))})]},e.id)),(0,f.jsx)(a,{size:`sm`,disabled:o||r.questions.some(e=>!t[e.id]?.trim()),children:`Send answers`})]})]})}function m(e){let n=Object.values(e.state.members),r=e.state.members[e.selected]??n.find(e=>e.depth===0);function a(i){return(0,f.jsxs)(`li`,{children:[(0,f.jsxs)(`button`,{type:`button`,onClick:()=>e.select(i.instanceId),title:i.instanceId,"aria-pressed":r?.instanceId===i.instanceId,className:t(`flex w-full items-center justify-between gap-3 rounded-lg px-3 py-2 text-left text-sm hover:bg-muted`,r?.instanceId===i.instanceId&&`bg-muted`),style:{paddingLeft:12+i.depth*16},children:[(0,f.jsxs)(`span`,{className:`min-w-0 truncate`,children:[i.depth>0?`↳ `:``,i.name]}),(0,f.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:i.status.replaceAll(`_`,` `)})]}),(0,f.jsx)(`ul`,{children:n.filter(e=>e.parentInstanceId===i.instanceId).map(a)})]},i.instanceId)}return(0,f.jsxs)(`div`,{className:`space-y-5`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsxs)(`h2`,{className:`mb-3 text-sm font-medium`,children:[`Members `,(0,f.jsx)(`span`,{className:`text-muted-foreground`,children:n.length})]}),n.length?(0,f.jsx)(`ul`,{"aria-label":`Team members`,children:n.filter(e=>!e.parentInstanceId).map(a)}):(0,f.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Spawned agents will appear here as the team works.`})]}),r&&(0,f.jsxs)(`section`,{className:`space-y-4 border-t border-hair pt-4`,"aria-label":`Member details`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`h3`,{className:`text-sm font-medium`,children:r.name}),(0,f.jsxs)(`p`,{className:`break-all text-xs text-muted-foreground`,children:[r.agentId,` · `,r.instanceId]})]}),r.error!==void 0&&(0,f.jsx)(`p`,{role:`alert`,className:`text-sm text-status-danger-ink`,children:i(r.error)}),(0,f.jsxs)(`details`,{className:`text-xs`,children:[(0,f.jsx)(`summary`,{className:`cursor-pointer text-muted-foreground`,children:`Token usage`}),(0,f.jsx)(`pre`,{className:`overflow-auto p-2`,children:JSON.stringify(r.usage,null,2)})]}),e.state.turns.filter(e=>e.instanceId===r.instanceId).map(t=>(0,f.jsxs)(`div`,{className:`space-y-3`,children:[t.text&&(0,f.jsx)(u,{text:t.text,live:e.state.status===`running`}),t.tools.length>0&&(0,f.jsxs)(`details`,{children:[(0,f.jsxs)(`summary`,{className:`cursor-pointer text-xs text-muted-foreground`,children:[`Tool activity (`,t.tools.length,`)`]}),t.tools.map((e,t)=>(0,f.jsx)(`pre`,{className:`my-2 max-h-60 overflow-auto whitespace-pre-wrap break-all rounded-lg bg-muted p-3 text-xs`,children:e},t))]}),t.messages&&(0,f.jsxs)(`details`,{children:[(0,f.jsx)(`summary`,{className:`cursor-pointer text-xs text-muted-foreground`,children:`Run messages`}),(0,f.jsx)(`pre`,{className:`max-h-96 overflow-auto whitespace-pre-wrap break-all text-xs`,children:JSON.stringify(t.messages,null,2)})]})]},t.key))]})]})}function h({state:e}){let t=t=>e.members[t]?.name??t;return(0,f.jsxs)(`section`,{className:`space-y-3`,"aria-label":`Messages between agents`,children:[(0,f.jsxs)(`h2`,{className:`text-sm font-medium`,children:[`Messages `,(0,f.jsx)(`span`,{className:`text-muted-foreground`,children:e.messages.length})]}),!e.messages.length&&(0,f.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Messages between agents will appear here.`}),e.messages.map(({message:e,delivered:n})=>(0,f.jsxs)(`article`,{className:`space-y-2 rounded-lg border border-hair p-3`,children:[(0,f.jsxs)(`div`,{className:`text-xs font-medium`,children:[t(e.fromInstanceId),` → `,t(e.toInstanceId)]}),(0,f.jsx)(`p`,{className:`whitespace-pre-wrap break-words text-sm`,children:e.content}),(0,f.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[n?`Delivered`:`Queued`,` ·`,` `,new Date(e.createdAt).toLocaleTimeString()]})]},e.id))]})}var g={status:`idle`,members:{},turns:[],messages:[],interactions:{},conversation:[]};function _(e,t){return Object.fromEntries(Object.entries(e.interactions).map(([e,n])=>[e,n.status===`pending`&&(t===void 0||n.instanceId===t)?{...n,status:`cancelled`}:n]))}function v(e,t){switch(t.type){case`reset`:return g;case`start`:return{...g,status:`running`,conversation:[{type:`prompt`,text:t.prompt}]};case`prompt`:return{...e,conversation:[...e.conversation,{type:`prompt`,text:t.prompt}]};case`stop`:{let n={...e,status:t.error?`failed`:`cancelled`};return t.error&&(n.error=t.error),n.interactions=_(e),n.members=Object.fromEntries(Object.entries(e.members).map(([e,t])=>[e,[`queued`,`running`,`waiting`,`awaiting_interaction`].includes(t.status)?{...t,status:`cancelled`}:t])),n}case`answered`:{let n=e.interactions[t.id];return n===void 0?e:{...e,interactions:{...e.interactions,[t.id]:{...n,status:`answered`}}}}}let n=t.event;if(n.type===`team_run_started`)return{...e,runId:n.runId};if(n.type===`error`)return v(e,{type:`stop`,error:i(n.error)});if(n.type===`response`||n.type===`blocked`)return{...e,status:n.type===`response`?`completed`:`blocked`,members:{...e.members,...Object.fromEntries(n.members.map(e=>[e.instanceId,e]))},interactions:_(e)};if(`member`in n){let t={...e,members:{...e.members,[n.instanceId]:n.member}};return(n.type===`agent_cancelled`||n.type===`agent_failed`)&&(t.interactions=_(e,n.instanceId)),t}if(n.type===`interaction`)return{...e,interactions:{...e.interactions,[n.interaction.id]:{instanceId:n.instanceId,request:n.interaction,status:`pending`}}};if(n.type===`message_queued`||n.type===`message_delivered`){let t=e.messages.find(e=>e.message.id===n.message.id),r={message:n.message,delivered:t?.delivered===!0||n.type===`message_delivered`};return{...e,messages:t?e.messages.map(e=>e.message.id===r.message.id?r:e):[...e.messages,r].slice(-500)}}if(n.type!==`agent_event`)return e;let r=`${n.instanceId}:${n.runId??`initial`}`,a=e.turns.find(e=>e.key===r)??{key:r,instanceId:n.instanceId,coordinator:n.coordinator,text:``,tools:[]},o=n.event,s;switch(o.type){case`text_delta`:s={...a,text:a.text+o.delta};break;case`tool_call`:s={...a,tools:[...a.tools,JSON.stringify(o.toolCall)].slice(-100)};break;case`tool_result`:s={...a,tools:[...a.tools,`${o.toolName}: ${JSON.stringify(o.output,null,2)}`].slice(-100)};break;case`response`:case`blocked`:s={...a,text:o.text,messages:o.messages,tools:o.messages.flatMap(e=>typeof e.content==`string`?[]:e.content.filter(e=>e.type===`tool-call`||e.type===`tool-result`).map(e=>JSON.stringify(e,null,2))).slice(-100)};break;default:return e}return{...e,conversation:s.coordinator&&!e.turns.some(e=>e.key===r)?[...e.conversation,{type:`turn`,key:r}].slice(-500):e.conversation,turns:e.turns.some(e=>e.key===r)?e.turns.map(e=>e.key===r?s:e):[...e.turns,s].slice(-500)}}function y(e){e&&!e.controller.signal.aborted&&(e.runId&&fetch(`${e.base}/${encodeURIComponent(e.runId)}/cancel`,{method:`POST`,headers:{"Content-Type":`application/json`},body:`{}`,keepalive:!0,signal:AbortSignal.timeout(5e3)}).catch(()=>{}),e.controller.abort())}function b(e){let[t,n]=(0,d.useReducer)(v,g),[r,a]=(0,d.useState)(``),[l,u]=(0,d.useState)(new Set),f=(0,d.useRef)(void 0),p=(0,d.useRef)(0),m=`/teams/${encodeURIComponent(e)}/runs`;(0,d.useEffect)(()=>()=>{y(f.current),f.current=void 0,p.current++},[e]);async function h(e){if(f.current)return;let t={controller:new AbortController,base:m,runId:void 0,pending:new Set,epoch:++p.current};f.current=t,u(new Set),a(``),n({type:`start`,prompt:e});try{let r=await fetch(m,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:e}),signal:t.controller.signal});if(!r.ok)throw Error(await s(r,`Start team`));if(!r.body)throw Error(`Team response has no stream`);t.runId=r.headers.get(`x-anvia-team-run-id`)??void 0;for await(let e of o(r.body)){if(f.current!==t||t.controller.signal.aborted)break;e.type===`team_run_started`&&(t.runId=e.runId);let r=e.type===`response`||e.type===`blocked`||e.type===`error`;if(r&&(f.current=void 0),n({type:`event`,event:e}),r)return}if(!t.controller.signal.aborted)throw Error(`Team stream ended before a result arrived`)}catch(e){if(f.current===t){let r={type:`stop`};t.controller.signal.aborted||(r.error=i(e)),n(r)}}finally{f.current===t&&(f.current=void 0)}}async function _(e,t,n,r){let o=f.current;if(!o?.runId||o.pending.has(e))return!1;o.pending.add(e),u(new Set(o.pending)),a(``);try{return await c(`${m}/${encodeURIComponent(o.runId)}${t}`,`Update team`,o.controller.signal,`default`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)}),p.current===o.epoch&&!o.controller.signal.aborted&&r(),!0}catch(e){return f.current===o&&!o.controller.signal.aborted&&a(i(e)),!1}finally{o.pending.delete(e),p.current===o.epoch&&u(new Set(o.pending))}}function b(){f.current&&(y(f.current),n({type:`stop`}))}return{state:t,busy:l,controlError:r,start:h,stop:b,reset:()=>{f.current||(p.current++,n({type:`reset`}),a(``))},steer:e=>_(`steer`,`/steer`,{prompt:e},()=>n({type:`prompt`,prompt:e})),respond:(e,t)=>_(e,`/interactions/${encodeURIComponent(e)}`,t,()=>n({type:`answered`,id:e}))}}function x({team:e,targetSelector:t}){let n=b(e.id),[r,i]=(0,d.useState)(``),[o,s]=(0,d.useState)(``),[c,g]=(0,d.useState)(`members`),_=(0,d.useRef)(null),v=(0,d.useRef)(!0),y=n.state.status===`running`,x=n.state.status!==`idle`;(0,d.useEffect)(()=>{let e=_.current;e&&v.current&&(e.scrollTop=e.scrollHeight)},[n.state]);async function S(){let e=r.trim();e&&(y?await n.steer(e)&&i(``):(i(``),v.current=!0,n.start(e)))}return(0,f.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-col overflow-auto lg:overflow-hidden`,children:[(0,f.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 border-b border-hair px-5 py-3`,children:[(0,f.jsx)(`div`,{className:`flex items-center gap-3`,children:t(y)}),(0,f.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,f.jsx)(`span`,{role:`status`,className:`text-xs text-muted-foreground`,children:n.state.status}),(0,f.jsx)(a,{variant:`secondary`,size:`sm`,disabled:y,onClick:()=>{n.reset(),i(``),s(``)},children:`New task`})]})]}),(0,f.jsxs)(`div`,{className:`grid min-h-0 min-w-0 flex-1 grid-cols-1 lg:grid-cols-[minmax(0,1fr)_360px] xl:grid-cols-[minmax(0,1fr)_420px]`,children:[(0,f.jsxs)(`div`,{className:`flex min-h-[480px] min-w-0 flex-col lg:min-h-0`,children:[(0,f.jsx)(`div`,{ref:_,className:`min-h-0 flex-1 overflow-auto px-5 py-6`,onScroll:()=>{let e=_.current;e&&(v.current=e.scrollHeight-e.scrollTop-e.clientHeight<80)},children:(0,f.jsxs)(`div`,{className:`mx-auto max-w-3xl space-y-6`,children:[!x&&(0,f.jsxs)(`div`,{className:`py-16`,children:[(0,f.jsxs)(`h1`,{className:`text-2xl font-medium`,children:[`Work with `,e.id]}),(0,f.jsx)(`p`,{className:`mt-3 text-sm text-muted-foreground`,children:`Give the coordinator a task. Follow its agents, messages, and requests as they work.`}),(0,f.jsxs)(`p`,{className:`mt-4 text-xs text-muted-foreground`,children:[`Available members:`,` `,e.members.map(e=>e.name??e.id).join(`, `)||`None`]})]}),n.state.conversation.map((e,t)=>{if(e.type===`prompt`)return(0,f.jsxs)(`article`,{className:`rounded-xl bg-muted p-4`,children:[(0,f.jsx)(`div`,{className:`mb-2 text-xs text-muted-foreground`,children:`You`}),(0,f.jsx)(`p`,{className:`whitespace-pre-wrap break-words text-sm`,children:e.text})]},`prompt:${t}`);let r=n.state.turns.find(t=>t.key===e.key);return r?.text?(0,f.jsxs)(`article`,{children:[(0,f.jsx)(`div`,{className:`mb-2 text-xs text-muted-foreground`,children:`Coordinator`}),(0,f.jsx)(u,{text:r.text,live:y,size:`base`})]},e.key):null}),Object.values(n.state.interactions).map(e=>(0,f.jsx)(p,{item:e,name:n.state.members[e.instanceId]?.name??e.instanceId,busy:n.busy.has(e.request.id),respond:n.respond},e.request.id)),n.state.error&&(0,f.jsx)(`p`,{role:`alert`,className:`text-sm text-status-danger-ink`,children:n.state.error}),n.controlError&&(0,f.jsx)(`p`,{role:`alert`,className:`text-sm text-status-danger-ink`,children:n.controlError})]})}),(0,f.jsxs)(`form`,{className:`mx-auto w-full max-w-3xl space-y-3 px-5 pb-5 pt-3`,onSubmit:e=>{e.preventDefault(),S()},children:[(0,f.jsx)(l,{"aria-label":y?`Message coordinator`:`Team task`,placeholder:y?`Send a follow-up to the coordinator…`:`Give this team a task…`,value:r,maxLength:32768,onChange:e=>i(e.target.value),disabled:x&&!y,onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&!e.nativeEvent.isComposing&&(e.preventDefault(),(!x||y)&&!n.busy.has(`steer`)&&S())}}),(0,f.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,f.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`This run stays in this page. Leaving stops active work.`}),y&&(0,f.jsx)(a,{type:`button`,variant:`secondary`,size:`sm`,onClick:n.stop,children:`Stop team`}),(0,f.jsx)(a,{size:`sm`,disabled:!r.trim()||x&&!y||y&&(!n.state.runId||n.busy.has(`steer`)),children:y?`Send follow-up`:`Run team`})]})]})]}),(0,f.jsxs)(`aside`,{className:`min-h-64 min-w-0 space-y-5 overflow-auto border-t border-hair p-5 lg:border-t-0 lg:border-l`,"aria-label":`Team activity`,children:[(0,f.jsxs)(`div`,{className:`flex gap-2`,children:[(0,f.jsx)(a,{variant:c===`members`?`secondary`:`ghost`,size:`sm`,onClick:()=>g(`members`),children:`Members`}),(0,f.jsx)(a,{variant:c===`messages`?`secondary`:`ghost`,size:`sm`,onClick:()=>g(`messages`),children:`Messages`})]}),c===`members`?(0,f.jsx)(m,{state:n.state,selected:o,select:s}):(0,f.jsx)(h,{state:n.state})]})]})]})}export{x as TeamPlayground};
2
- //# sourceMappingURL=team-playground-BWPiCcRS.js.map
1
+ import{i as e,n as t,r as n,s as r}from"./dist-gzPjmjmv.js";import{l as i,t as a}from"./button-4bdMllZ8.js";import{c as o,i as s,t as c}from"./request-CvV7xN38.js";import{t as l}from"./textarea-D_t9rW9X.js";import{r as u}from"./renderers-C1LvbME4.js";var d=r(e(),1),f=n();function p(e){let[t,n]=(0,d.useState)({}),{request:r,status:i}=e.item,o=e.busy||i!==`pending`;return(0,f.jsxs)(`section`,{className:`space-y-3 rounded-xl border border-hair bg-card p-4`,"aria-label":`${e.name}: ${r.toolName}`,children:[(0,f.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 text-sm`,children:[(0,f.jsxs)(`strong`,{children:[e.name,` · `,r.toolName]}),(0,f.jsx)(`span`,{className:`text-muted-foreground`,children:e.busy?`Submitting…`:i===`pending`?`Needs your input`:i})]}),(0,f.jsxs)(`p`,{className:`break-all text-xs text-muted-foreground`,children:[`Instance `,e.item.instanceId]}),r.type===`tool-approval`?(0,f.jsxs)(f.Fragment,{children:[r.reason&&(0,f.jsx)(`p`,{className:`text-sm`,children:r.reason}),(0,f.jsx)(`pre`,{className:`max-h-48 overflow-auto whitespace-pre-wrap break-all text-xs`,children:JSON.stringify(r.input,null,2)}),(0,f.jsxs)(`div`,{className:`flex gap-2`,children:[(0,f.jsx)(a,{size:`sm`,disabled:o,onClick:()=>void e.respond(r.id,{type:`tool-approval`,approved:!0}),children:`Approve`}),(0,f.jsx)(a,{size:`sm`,variant:`secondary`,disabled:o,onClick:()=>void e.respond(r.id,{type:`tool-approval`,approved:!1}),children:`Deny`})]})]}):(0,f.jsxs)(`form`,{className:`space-y-3`,onSubmit:n=>{n.preventDefault(),e.respond(r.id,{type:`tool-question`,answers:r.questions.map(e=>({questionId:e.id,value:t[e.id]??``}))})},children:[r.questions.map(e=>(0,f.jsxs)(`fieldset`,{disabled:o,className:`space-y-2`,children:[(0,f.jsx)(`legend`,{className:`mb-2 text-sm`,children:e.text}),e.choices?.map(i=>(0,f.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,f.jsx)(`input`,{type:`radio`,name:`${r.id}:${e.id}`,value:i.value,checked:t[e.id]===i.value,onChange:()=>n(t=>({...t,[e.id]:i.value}))}),i.label]},i.value)),(!e.choices?.length||e.allowCustom)&&(0,f.jsx)(l,{"aria-label":e.text,placeholder:`Your answer`,value:t[e.id]??``,onChange:t=>n(n=>({...n,[e.id]:t.target.value}))})]},e.id)),(0,f.jsx)(a,{size:`sm`,disabled:o||r.questions.some(e=>!t[e.id]?.trim()),children:`Send answers`})]})]})}function m(e){let n=Object.values(e.state.members),r=e.state.members[e.selected]??n.find(e=>e.depth===0);function a(i){return(0,f.jsxs)(`li`,{children:[(0,f.jsxs)(`button`,{type:`button`,onClick:()=>e.select(i.instanceId),title:i.instanceId,"aria-pressed":r?.instanceId===i.instanceId,className:t(`flex w-full items-center justify-between gap-3 rounded-lg px-3 py-2 text-left text-sm hover:bg-muted`,r?.instanceId===i.instanceId&&`bg-muted`),style:{paddingLeft:12+i.depth*16},children:[(0,f.jsxs)(`span`,{className:`min-w-0 truncate`,children:[i.depth>0?`↳ `:``,i.name]}),(0,f.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:i.status.replaceAll(`_`,` `)})]}),(0,f.jsx)(`ul`,{children:n.filter(e=>e.parentInstanceId===i.instanceId).map(a)})]},i.instanceId)}return(0,f.jsxs)(`div`,{className:`space-y-5`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsxs)(`h2`,{className:`mb-3 text-sm font-medium`,children:[`Members `,(0,f.jsx)(`span`,{className:`text-muted-foreground`,children:n.length})]}),n.length?(0,f.jsx)(`ul`,{"aria-label":`Team members`,children:n.filter(e=>!e.parentInstanceId).map(a)}):(0,f.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Spawned agents will appear here as the team works.`})]}),r&&(0,f.jsxs)(`section`,{className:`space-y-4 border-t border-hair pt-4`,"aria-label":`Member details`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`h3`,{className:`text-sm font-medium`,children:r.name}),(0,f.jsxs)(`p`,{className:`break-all text-xs text-muted-foreground`,children:[r.agentId,` · `,r.instanceId]})]}),r.error!==void 0&&(0,f.jsx)(`p`,{role:`alert`,className:`text-sm text-status-danger-ink`,children:i(r.error)}),(0,f.jsxs)(`details`,{className:`text-xs`,children:[(0,f.jsx)(`summary`,{className:`cursor-pointer text-muted-foreground`,children:`Token usage`}),(0,f.jsx)(`pre`,{className:`overflow-auto p-2`,children:JSON.stringify(r.usage,null,2)})]}),e.state.turns.filter(e=>e.instanceId===r.instanceId).map(t=>(0,f.jsxs)(`div`,{className:`space-y-3`,children:[t.text&&(0,f.jsx)(u,{text:t.text,live:e.state.status===`running`}),t.tools.length>0&&(0,f.jsxs)(`details`,{children:[(0,f.jsxs)(`summary`,{className:`cursor-pointer text-xs text-muted-foreground`,children:[`Tool activity (`,t.tools.length,`)`]}),t.tools.map((e,t)=>(0,f.jsx)(`pre`,{className:`my-2 max-h-60 overflow-auto whitespace-pre-wrap break-all rounded-lg bg-muted p-3 text-xs`,children:e},t))]}),t.messages&&(0,f.jsxs)(`details`,{children:[(0,f.jsx)(`summary`,{className:`cursor-pointer text-xs text-muted-foreground`,children:`Run messages`}),(0,f.jsx)(`pre`,{className:`max-h-96 overflow-auto whitespace-pre-wrap break-all text-xs`,children:JSON.stringify(t.messages,null,2)})]})]},t.key))]})]})}function h({state:e}){let t=t=>e.members[t]?.name??t;return(0,f.jsxs)(`section`,{className:`space-y-3`,"aria-label":`Messages between agents`,children:[(0,f.jsxs)(`h2`,{className:`text-sm font-medium`,children:[`Messages `,(0,f.jsx)(`span`,{className:`text-muted-foreground`,children:e.messages.length})]}),!e.messages.length&&(0,f.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Messages between agents will appear here.`}),e.messages.map(({message:e,delivered:n})=>(0,f.jsxs)(`article`,{className:`space-y-2 rounded-lg border border-hair p-3`,children:[(0,f.jsxs)(`div`,{className:`text-xs font-medium`,children:[t(e.fromInstanceId),` → `,t(e.toInstanceId)]}),(0,f.jsx)(`p`,{className:`whitespace-pre-wrap break-words text-sm`,children:e.content}),(0,f.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[n?`Delivered`:`Queued`,` ·`,` `,new Date(e.createdAt).toLocaleTimeString()]})]},e.id))]})}var g={status:`idle`,members:{},turns:[],messages:[],interactions:{},conversation:[]};function _(e,t){return Object.fromEntries(Object.entries(e.interactions).map(([e,n])=>[e,n.status===`pending`&&(t===void 0||n.instanceId===t)?{...n,status:`cancelled`}:n]))}function v(e,t){switch(t.type){case`reset`:return g;case`start`:return{...g,status:`running`,conversation:[{type:`prompt`,text:t.prompt}]};case`prompt`:return{...e,conversation:[...e.conversation,{type:`prompt`,text:t.prompt}]};case`stop`:{let n={...e,status:t.error?`failed`:`cancelled`};return t.error&&(n.error=t.error),n.interactions=_(e),n.members=Object.fromEntries(Object.entries(e.members).map(([e,t])=>[e,[`queued`,`running`,`waiting`,`awaiting_interaction`].includes(t.status)?{...t,status:`cancelled`}:t])),n}case`answered`:{let n=e.interactions[t.id];return n===void 0?e:{...e,interactions:{...e.interactions,[t.id]:{...n,status:`answered`}}}}}let n=t.event;if(n.type===`team_run_started`)return{...e,runId:n.runId};if(n.type===`error`)return v(e,{type:`stop`,error:i(n.error)});if(n.type===`response`||n.type===`blocked`)return{...e,status:n.type===`response`?`completed`:`blocked`,members:{...e.members,...Object.fromEntries(n.members.map(e=>[e.instanceId,e]))},interactions:_(e)};if(`member`in n){let t={...e,members:{...e.members,[n.instanceId]:n.member}};return(n.type===`agent_cancelled`||n.type===`agent_failed`)&&(t.interactions=_(e,n.instanceId)),t}if(n.type===`interaction`)return{...e,interactions:{...e.interactions,[n.interaction.id]:{instanceId:n.instanceId,request:n.interaction,status:`pending`}}};if(n.type===`message_queued`||n.type===`message_delivered`){let t=e.messages.find(e=>e.message.id===n.message.id),r={message:n.message,delivered:t?.delivered===!0||n.type===`message_delivered`};return{...e,messages:t?e.messages.map(e=>e.message.id===r.message.id?r:e):[...e.messages,r].slice(-500)}}if(n.type!==`agent_event`)return e;let r=`${n.instanceId}:${n.runId??`initial`}`,a=e.turns.find(e=>e.key===r)??{key:r,instanceId:n.instanceId,coordinator:n.coordinator,text:``,tools:[]},o=n.event,s;switch(o.type){case`text_delta`:s={...a,text:a.text+o.delta};break;case`tool_call`:s={...a,tools:[...a.tools,JSON.stringify(o.toolCall)].slice(-100)};break;case`tool_result`:s={...a,tools:[...a.tools,`${o.toolName}: ${JSON.stringify(o.output,null,2)}`].slice(-100)};break;case`response`:case`blocked`:s={...a,text:o.text,messages:o.messages,tools:o.messages.flatMap(e=>typeof e.content==`string`?[]:e.content.filter(e=>e.type===`tool-call`||e.type===`tool-result`).map(e=>JSON.stringify(e,null,2))).slice(-100)};break;default:return e}return{...e,conversation:s.coordinator&&!e.turns.some(e=>e.key===r)?[...e.conversation,{type:`turn`,key:r}].slice(-500):e.conversation,turns:e.turns.some(e=>e.key===r)?e.turns.map(e=>e.key===r?s:e):[...e.turns,s].slice(-500)}}function y(e){e&&!e.controller.signal.aborted&&(e.runId&&fetch(`${e.base}/${encodeURIComponent(e.runId)}/cancel`,{method:`POST`,headers:{"Content-Type":`application/json`},body:`{}`,keepalive:!0,signal:AbortSignal.timeout(5e3)}).catch(()=>{}),e.controller.abort())}function b(e){let[t,n]=(0,d.useReducer)(v,g),[r,a]=(0,d.useState)(``),[l,u]=(0,d.useState)(new Set),f=(0,d.useRef)(void 0),p=(0,d.useRef)(0),m=`/teams/${encodeURIComponent(e)}/runs`;(0,d.useEffect)(()=>()=>{y(f.current),f.current=void 0,p.current++},[e]);async function h(e){if(f.current)return;let t={controller:new AbortController,base:m,runId:void 0,pending:new Set,epoch:++p.current};f.current=t,u(new Set),a(``),n({type:`start`,prompt:e});try{let r=await fetch(m,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:e}),signal:t.controller.signal});if(!r.ok)throw Error(await s(r,`Start team`));if(!r.body)throw Error(`Team response has no stream`);t.runId=r.headers.get(`x-anvia-team-run-id`)??void 0;for await(let e of o(r.body)){if(f.current!==t||t.controller.signal.aborted)break;e.type===`team_run_started`&&(t.runId=e.runId);let r=e.type===`response`||e.type===`blocked`||e.type===`error`;if(r&&(f.current=void 0),n({type:`event`,event:e}),r)return}if(!t.controller.signal.aborted)throw Error(`Team stream ended before a result arrived`)}catch(e){if(f.current===t){let r={type:`stop`};t.controller.signal.aborted||(r.error=i(e)),n(r)}}finally{f.current===t&&(f.current=void 0)}}async function _(e,t,n,r){let o=f.current;if(!o?.runId||o.pending.has(e))return!1;o.pending.add(e),u(new Set(o.pending)),a(``);try{return await c(`${m}/${encodeURIComponent(o.runId)}${t}`,`Update team`,o.controller.signal,`default`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)}),p.current===o.epoch&&!o.controller.signal.aborted&&r(),!0}catch(e){return f.current===o&&!o.controller.signal.aborted&&a(i(e)),!1}finally{o.pending.delete(e),p.current===o.epoch&&u(new Set(o.pending))}}function b(){f.current&&(y(f.current),n({type:`stop`}))}return{state:t,busy:l,controlError:r,start:h,stop:b,reset:()=>{f.current||(p.current++,n({type:`reset`}),a(``))},steer:e=>_(`steer`,`/steer`,{prompt:e},()=>n({type:`prompt`,prompt:e})),respond:(e,t)=>_(e,`/interactions/${encodeURIComponent(e)}`,t,()=>n({type:`answered`,id:e}))}}function x({team:e,targetSelector:t}){let n=b(e.id),[r,i]=(0,d.useState)(``),[o,s]=(0,d.useState)(``),[c,g]=(0,d.useState)(`members`),_=(0,d.useRef)(null),v=(0,d.useRef)(!0),y=n.state.status===`running`,x=n.state.status!==`idle`;(0,d.useEffect)(()=>{let e=_.current;e&&v.current&&(e.scrollTop=e.scrollHeight)},[n.state]);async function S(){let e=r.trim();e&&(y?await n.steer(e)&&i(``):(i(``),v.current=!0,n.start(e)))}return(0,f.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-col overflow-auto lg:overflow-hidden`,children:[(0,f.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 border-b border-hair px-5 py-3`,children:[(0,f.jsx)(`div`,{className:`flex items-center gap-3`,children:t(y)}),(0,f.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,f.jsx)(`span`,{role:`status`,className:`text-xs text-muted-foreground`,children:n.state.status}),(0,f.jsx)(a,{variant:`secondary`,size:`sm`,disabled:y,onClick:()=>{n.reset(),i(``),s(``)},children:`New task`})]})]}),(0,f.jsxs)(`div`,{className:`grid min-h-0 min-w-0 flex-1 grid-cols-1 lg:grid-cols-[minmax(0,1fr)_360px] xl:grid-cols-[minmax(0,1fr)_420px]`,children:[(0,f.jsxs)(`div`,{className:`flex min-h-[480px] min-w-0 flex-col lg:min-h-0`,children:[(0,f.jsx)(`div`,{ref:_,className:`min-h-0 flex-1 overflow-auto px-5 py-6`,onScroll:()=>{let e=_.current;e&&(v.current=e.scrollHeight-e.scrollTop-e.clientHeight<80)},children:(0,f.jsxs)(`div`,{className:`mx-auto max-w-3xl space-y-6`,children:[!x&&(0,f.jsxs)(`div`,{className:`py-16`,children:[(0,f.jsxs)(`h1`,{className:`text-2xl font-medium`,children:[`Work with `,e.id]}),(0,f.jsx)(`p`,{className:`mt-3 text-sm text-muted-foreground`,children:`Give the coordinator a task. Follow its agents, messages, and requests as they work.`}),(0,f.jsxs)(`p`,{className:`mt-4 text-xs text-muted-foreground`,children:[`Available members:`,` `,e.members.map(e=>e.name??e.id).join(`, `)||`None`]})]}),n.state.conversation.map((e,t)=>{if(e.type===`prompt`)return(0,f.jsxs)(`article`,{className:`rounded-xl bg-muted p-4`,children:[(0,f.jsx)(`div`,{className:`mb-2 text-xs text-muted-foreground`,children:`You`}),(0,f.jsx)(`p`,{className:`whitespace-pre-wrap break-words text-sm`,children:e.text})]},`prompt:${t}`);let r=n.state.turns.find(t=>t.key===e.key);return r?.text?(0,f.jsxs)(`article`,{children:[(0,f.jsx)(`div`,{className:`mb-2 text-xs text-muted-foreground`,children:`Coordinator`}),(0,f.jsx)(u,{text:r.text,live:y,size:`base`})]},e.key):null}),Object.values(n.state.interactions).map(e=>(0,f.jsx)(p,{item:e,name:n.state.members[e.instanceId]?.name??e.instanceId,busy:n.busy.has(e.request.id),respond:n.respond},e.request.id)),n.state.error&&(0,f.jsx)(`p`,{role:`alert`,className:`text-sm text-status-danger-ink`,children:n.state.error}),n.controlError&&(0,f.jsx)(`p`,{role:`alert`,className:`text-sm text-status-danger-ink`,children:n.controlError})]})}),(0,f.jsxs)(`form`,{className:`mx-auto w-full max-w-3xl space-y-3 px-5 pb-5 pt-3`,onSubmit:e=>{e.preventDefault(),S()},children:[(0,f.jsx)(l,{"aria-label":y?`Message coordinator`:`Team task`,placeholder:y?`Send a follow-up to the coordinator…`:`Give this team a task…`,value:r,maxLength:32768,onChange:e=>i(e.target.value),disabled:x&&!y,onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&!e.nativeEvent.isComposing&&(e.preventDefault(),(!x||y)&&!n.busy.has(`steer`)&&S())}}),(0,f.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,f.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`This run stays in this page. Leaving stops active work.`}),y&&(0,f.jsx)(a,{type:`button`,variant:`secondary`,size:`sm`,onClick:n.stop,children:`Stop team`}),(0,f.jsx)(a,{size:`sm`,disabled:!r.trim()||x&&!y||y&&(!n.state.runId||n.busy.has(`steer`)),children:y?`Send follow-up`:`Run team`})]})]})]}),(0,f.jsxs)(`aside`,{className:`min-h-64 min-w-0 space-y-5 overflow-auto border-t border-hair p-5 lg:border-t-0 lg:border-l`,"aria-label":`Team activity`,children:[(0,f.jsxs)(`div`,{className:`flex gap-2`,children:[(0,f.jsx)(a,{variant:c===`members`?`secondary`:`ghost`,size:`sm`,onClick:()=>g(`members`),children:`Members`}),(0,f.jsx)(a,{variant:c===`messages`?`secondary`:`ghost`,size:`sm`,onClick:()=>g(`messages`),children:`Messages`})]}),c===`members`?(0,f.jsx)(m,{state:n.state,selected:o,select:s}):(0,f.jsx)(h,{state:n.state})]})]})]})}export{x as TeamPlayground};
2
+ //# sourceMappingURL=team-playground-CEBspWEQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"team-playground-BWPiCcRS.js","names":["useState","_Fragment","useReducer","useState","useRef","useState","useRef","require_react","cn","require_jsx_runtime","__toESM","errorMessage","Button","readJsonlStream","responseErrorMessage","requestJson","Textarea","MarkdownText","import_react","import_jsx_runtime","TeamInteractionCard","answers","setAnswers","props","disabled","status","request","event","question","choice","previous","TeamMembers","members","selected","member","node","child","turn","tool","index","TeamMessages","name","state","id","message","delivered","initialTeamState","closeInteractions","item","instanceId","teamReducer","action","next","old","key","inner","updated","part","cancelTeamRun","run","useTeamRun","dispatch","controlError","setControlError","busy","setBusy","active","epoch","base","teamId","start","response","terminal","error","control","path","body","onSuccess","stop","TeamPlayground","team","prompt","setPrompt","select","tab","setTab","scrollRef","stick","running","started","element","send","value","targetSelector","entry"],"sources":["../../../src/ui/app/modules/teams/team-interactions.tsx","../../../src/ui/app/modules/teams/team-members.tsx","../../../src/ui/app/modules/teams/team-state.ts","../../../src/ui/app/modules/teams/use-team-run.ts","../../../src/ui/app/modules/teams/team-playground.tsx"],"sourcesContent":["import type { AgentInteractionResponse } from \"@anvia/core/agent/interactions\";\nimport { useState } from \"react\";\nimport { Button } from \"../../components/ui/button\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport type { TeamInteraction } from \"./team-state\";\n\nexport function TeamInteractionCard(props: {\n item: TeamInteraction;\n name: string;\n busy: boolean;\n respond: (id: string, response: AgentInteractionResponse) => Promise<boolean>;\n}) {\n const [answers, setAnswers] = useState<Record<string, string>>({});\n const { request, status } = props.item;\n const disabled = props.busy || status !== \"pending\";\n return (\n <section\n className=\"space-y-3 rounded-xl border border-hair bg-card p-4\"\n aria-label={`${props.name}: ${request.toolName}`}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2 text-sm\">\n <strong>\n {props.name} · {request.toolName}\n </strong>\n <span className=\"text-muted-foreground\">\n {props.busy ? \"Submitting…\" : status === \"pending\" ? \"Needs your input\" : status}\n </span>\n </div>\n <p className=\"break-all text-xs text-muted-foreground\">Instance {props.item.instanceId}</p>\n {request.type === \"tool-approval\" ? (\n <>\n {request.reason && <p className=\"text-sm\">{request.reason}</p>}\n <pre className=\"max-h-48 overflow-auto whitespace-pre-wrap break-all text-xs\">\n {JSON.stringify(request.input, null, 2)}\n </pre>\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n disabled={disabled}\n onClick={() =>\n void props.respond(request.id, { type: \"tool-approval\", approved: true })\n }\n >\n Approve\n </Button>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={disabled}\n onClick={() =>\n void props.respond(request.id, { type: \"tool-approval\", approved: false })\n }\n >\n Deny\n </Button>\n </div>\n </>\n ) : (\n <form\n className=\"space-y-3\"\n onSubmit={(event) => {\n event.preventDefault();\n void props.respond(request.id, {\n type: \"tool-question\",\n answers: request.questions.map((question) => ({\n questionId: question.id,\n value: answers[question.id] ?? \"\",\n })),\n });\n }}\n >\n {request.questions.map((question) => (\n <fieldset key={question.id} disabled={disabled} className=\"space-y-2\">\n <legend className=\"mb-2 text-sm\">{question.text}</legend>\n {question.choices?.map((choice) => (\n <label key={choice.value} className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={`${request.id}:${question.id}`}\n value={choice.value}\n checked={answers[question.id] === choice.value}\n onChange={() =>\n setAnswers((previous) => ({ ...previous, [question.id]: choice.value }))\n }\n />\n {choice.label}\n </label>\n ))}\n {(!question.choices?.length || question.allowCustom) && (\n <Textarea\n aria-label={question.text}\n placeholder=\"Your answer\"\n value={answers[question.id] ?? \"\"}\n onChange={(event) =>\n setAnswers((previous) => ({ ...previous, [question.id]: event.target.value }))\n }\n />\n )}\n </fieldset>\n ))}\n <Button\n size=\"sm\"\n disabled={\n disabled || request.questions.some((question) => !answers[question.id]?.trim())\n }\n >\n Send answers\n </Button>\n </form>\n )}\n </section>\n );\n}\n","import type { AgentTeamMemberSummary } from \"@anvia/core/agent\";\nimport { MarkdownText } from \"../shared/renderers\";\nimport { errorMessage } from \"../shared/format\";\nimport { cn } from \"../../lib/utils\";\nimport type { TeamState } from \"./team-state\";\n\nexport function TeamMembers(props: {\n state: TeamState;\n selected: string;\n select: (id: string) => void;\n}) {\n const members = Object.values(props.state.members);\n const selected =\n props.state.members[props.selected] ?? members.find((member) => member.depth === 0);\n function node(member: AgentTeamMemberSummary) {\n return (\n <li key={member.instanceId}>\n <button\n type=\"button\"\n onClick={() => props.select(member.instanceId)}\n title={member.instanceId}\n aria-pressed={selected?.instanceId === member.instanceId}\n className={cn(\n \"flex w-full items-center justify-between gap-3 rounded-lg px-3 py-2 text-left text-sm hover:bg-muted\",\n selected?.instanceId === member.instanceId && \"bg-muted\",\n )}\n style={{ paddingLeft: 12 + member.depth * 16 }}\n >\n <span className=\"min-w-0 truncate\">\n {member.depth > 0 ? \"↳ \" : \"\"}\n {member.name}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {member.status.replaceAll(\"_\", \" \")}\n </span>\n </button>\n <ul>{members.filter((child) => child.parentInstanceId === member.instanceId).map(node)}</ul>\n </li>\n );\n }\n return (\n <div className=\"space-y-5\">\n <div>\n <h2 className=\"mb-3 text-sm font-medium\">\n Members <span className=\"text-muted-foreground\">{members.length}</span>\n </h2>\n {members.length ? (\n <ul aria-label=\"Team members\">\n {members.filter((member) => !member.parentInstanceId).map(node)}\n </ul>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n Spawned agents will appear here as the team works.\n </p>\n )}\n </div>\n {selected && (\n <section className=\"space-y-4 border-t border-hair pt-4\" aria-label=\"Member details\">\n <div>\n <h3 className=\"text-sm font-medium\">{selected.name}</h3>\n <p className=\"break-all text-xs text-muted-foreground\">\n {selected.agentId} · {selected.instanceId}\n </p>\n </div>\n {selected.error !== undefined && (\n <p role=\"alert\" className=\"text-sm text-status-danger-ink\">\n {errorMessage(selected.error)}\n </p>\n )}\n <details className=\"text-xs\">\n <summary className=\"cursor-pointer text-muted-foreground\">Token usage</summary>\n <pre className=\"overflow-auto p-2\">{JSON.stringify(selected.usage, null, 2)}</pre>\n </details>\n {props.state.turns\n .filter((turn) => turn.instanceId === selected.instanceId)\n .map((turn) => (\n <div key={turn.key} className=\"space-y-3\">\n {turn.text && (\n <MarkdownText text={turn.text} live={props.state.status === \"running\"} />\n )}\n {turn.tools.length > 0 && (\n <details>\n <summary className=\"cursor-pointer text-xs text-muted-foreground\">\n Tool activity ({turn.tools.length})\n </summary>\n {turn.tools.map((tool, index) => (\n <pre\n key={index}\n className=\"my-2 max-h-60 overflow-auto whitespace-pre-wrap break-all rounded-lg bg-muted p-3 text-xs\"\n >\n {tool}\n </pre>\n ))}\n </details>\n )}\n {turn.messages && (\n <details>\n <summary className=\"cursor-pointer text-xs text-muted-foreground\">\n Run messages\n </summary>\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap break-all text-xs\">\n {JSON.stringify(turn.messages, null, 2)}\n </pre>\n </details>\n )}\n </div>\n ))}\n </section>\n )}\n </div>\n );\n}\n\nexport function TeamMessages({ state }: { state: TeamState }) {\n const name = (id: string) => state.members[id]?.name ?? id;\n return (\n <section className=\"space-y-3\" aria-label=\"Messages between agents\">\n <h2 className=\"text-sm font-medium\">\n Messages <span className=\"text-muted-foreground\">{state.messages.length}</span>\n </h2>\n {!state.messages.length && (\n <p className=\"text-sm text-muted-foreground\">Messages between agents will appear here.</p>\n )}\n {state.messages.map(({ message, delivered }) => (\n <article key={message.id} className=\"space-y-2 rounded-lg border border-hair p-3\">\n <div className=\"text-xs font-medium\">\n {name(message.fromInstanceId)} → {name(message.toInstanceId)}\n </div>\n <p className=\"whitespace-pre-wrap break-words text-sm\">{message.content}</p>\n <p className=\"text-xs text-muted-foreground\">\n {delivered ? \"Delivered\" : \"Queued\"} ·{\" \"}\n {new Date(message.createdAt).toLocaleTimeString()}\n </p>\n </article>\n ))}\n </section>\n );\n}\n","import type { AgentTeamMemberSummary, AgentTeamMessage } from \"@anvia/core/agent\";\nimport type { AgentInteractionRequest } from \"@anvia/core/agent/interactions\";\nimport type { Message } from \"@anvia/core/completion\";\nimport type { StudioTeamRunEvent } from \"../../../../team-types\";\nimport { errorMessage } from \"../shared/format\";\n\nexport type TeamInteraction = {\n instanceId: string;\n request: AgentInteractionRequest;\n status: \"pending\" | \"answered\" | \"cancelled\";\n};\nexport type TeamTurn = {\n key: string;\n instanceId: string;\n coordinator: boolean;\n text: string;\n tools: string[];\n messages?: readonly Message[];\n};\nexport type TeamState = {\n status: \"idle\" | \"running\" | \"completed\" | \"blocked\" | \"cancelled\" | \"failed\";\n runId?: string;\n error?: string;\n members: Record<string, AgentTeamMemberSummary>;\n turns: TeamTurn[];\n messages: { message: AgentTeamMessage; delivered: boolean }[];\n interactions: Record<string, TeamInteraction>;\n conversation: ({ type: \"prompt\"; text: string } | { type: \"turn\"; key: string })[];\n};\nexport const initialTeamState: TeamState = {\n status: \"idle\",\n members: {},\n turns: [],\n messages: [],\n interactions: {},\n conversation: [],\n};\nexport type TeamAction =\n | { type: \"start\"; prompt: string }\n | { type: \"prompt\"; prompt: string }\n | { type: \"event\"; event: StudioTeamRunEvent }\n | { type: \"answered\"; id: string }\n | { type: \"stop\"; error?: string }\n | { type: \"reset\" };\n\nfunction closeInteractions(state: TeamState, instanceId?: string) {\n return Object.fromEntries(\n Object.entries(state.interactions).map(([id, item]) => [\n id,\n item.status === \"pending\" && (instanceId === undefined || item.instanceId === instanceId)\n ? { ...item, status: \"cancelled\" as const }\n : item,\n ]),\n );\n}\n\nexport function teamReducer(state: TeamState, action: TeamAction): TeamState {\n switch (action.type) {\n case \"reset\":\n return initialTeamState;\n case \"start\":\n return {\n ...initialTeamState,\n status: \"running\",\n conversation: [{ type: \"prompt\", text: action.prompt }],\n };\n case \"prompt\":\n return {\n ...state,\n conversation: [...state.conversation, { type: \"prompt\", text: action.prompt }],\n };\n case \"stop\": {\n const next: TeamState = {\n ...state,\n status: action.error ? \"failed\" : \"cancelled\",\n };\n if (action.error) next.error = action.error;\n next.interactions = closeInteractions(state);\n next.members = Object.fromEntries(\n Object.entries(state.members).map(([id, member]) => [\n id,\n [\"queued\", \"running\", \"waiting\", \"awaiting_interaction\"].includes(member.status)\n ? { ...member, status: \"cancelled\" }\n : member,\n ]),\n );\n return next;\n }\n case \"answered\": {\n const item = state.interactions[action.id];\n return item !== undefined\n ? {\n ...state,\n interactions: { ...state.interactions, [action.id]: { ...item, status: \"answered\" } },\n }\n : state;\n }\n case \"event\":\n break;\n }\n const event = action.event;\n if (event.type === \"team_run_started\") return { ...state, runId: event.runId };\n if (event.type === \"error\")\n return teamReducer(state, { type: \"stop\", error: errorMessage(event.error) });\n if (event.type === \"response\" || event.type === \"blocked\")\n return {\n ...state,\n status: event.type === \"response\" ? \"completed\" : \"blocked\",\n // Terminal outcomes contain descendants only; retain the coordinator as the tree root.\n members: {\n ...state.members,\n ...Object.fromEntries(event.members.map((member) => [member.instanceId, member])),\n },\n interactions: closeInteractions(state),\n };\n if (\"member\" in event) {\n const next: TeamState = {\n ...state,\n members: { ...state.members, [event.instanceId]: event.member },\n };\n if (event.type === \"agent_cancelled\" || event.type === \"agent_failed\") {\n next.interactions = closeInteractions(state, event.instanceId);\n }\n return next;\n }\n if (event.type === \"interaction\")\n return {\n ...state,\n interactions: {\n ...state.interactions,\n [event.interaction.id]: {\n instanceId: event.instanceId,\n request: event.interaction,\n status: \"pending\",\n },\n },\n };\n if (event.type === \"message_queued\" || event.type === \"message_delivered\") {\n const previous = state.messages.find((item) => item.message.id === event.message.id);\n const item = {\n message: event.message,\n delivered: previous?.delivered === true || event.type === \"message_delivered\",\n };\n return {\n ...state,\n messages: previous\n ? state.messages.map((old) => (old.message.id === item.message.id ? item : old))\n : [...state.messages, item].slice(-500),\n };\n }\n if (event.type !== \"agent_event\") return state;\n const key = `${event.instanceId}:${event.runId ?? \"initial\"}`;\n const turn = state.turns.find((item) => item.key === key) ?? {\n key,\n instanceId: event.instanceId,\n coordinator: event.coordinator,\n text: \"\",\n tools: [],\n };\n const inner = event.event;\n let updated: TeamTurn;\n switch (inner.type) {\n case \"text_delta\":\n updated = { ...turn, text: turn.text + inner.delta };\n break;\n case \"tool_call\":\n updated = { ...turn, tools: [...turn.tools, JSON.stringify(inner.toolCall)].slice(-100) };\n break;\n case \"tool_result\":\n updated = {\n ...turn,\n tools: [...turn.tools, `${inner.toolName}: ${JSON.stringify(inner.output, null, 2)}`].slice(\n -100,\n ),\n };\n break;\n case \"response\":\n case \"blocked\":\n updated = {\n ...turn,\n text: inner.text,\n messages: inner.messages,\n tools: inner.messages\n .flatMap((message) => {\n if (typeof message.content === \"string\") return [];\n return message.content\n .filter((part) => part.type === \"tool-call\" || part.type === \"tool-result\")\n .map((part) => JSON.stringify(part, null, 2));\n })\n .slice(-100),\n };\n break;\n default:\n return state;\n }\n return {\n ...state,\n conversation:\n updated.coordinator && !state.turns.some((item) => item.key === key)\n ? [...state.conversation, { type: \"turn\" as const, key }].slice(-500)\n : state.conversation,\n turns: state.turns.some((item) => item.key === key)\n ? state.turns.map((item) => (item.key === key ? updated : item))\n : [...state.turns, updated].slice(-500),\n };\n}\n","import type { AgentInteractionResponse } from \"@anvia/core/agent/interactions\";\nimport { readJsonlStream } from \"@anvia/client/transport\";\nimport { useEffect, useReducer, useRef, useState } from \"react\";\nimport type { StudioTeamRunEvent } from \"../../../../team-types\";\nimport { responseErrorMessage } from \"../../app-errors\";\nimport { errorMessage } from \"../shared/format\";\nimport { requestJson } from \"../shared/request\";\nimport { initialTeamState, teamReducer, type TeamAction } from \"./team-state\";\n\ntype ActiveTeamRun = {\n controller: AbortController;\n base: string;\n runId: string | undefined;\n pending: Set<string>;\n epoch: number;\n};\n\nfunction cancelTeamRun(run: ActiveTeamRun | undefined) {\n if (!run || run.controller.signal.aborted) return;\n if (run.runId) {\n // Keep server cancellation independent of stream teardown, including page navigation.\n void fetch(`${run.base}/${encodeURIComponent(run.runId)}/cancel`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: \"{}\",\n keepalive: true,\n signal: AbortSignal.timeout(5_000),\n }).catch(() => {\n // Teardown cannot wait for the server; disconnect remains the fallback on network failure.\n });\n }\n run.controller.abort();\n}\n\nexport function useTeamRun(teamId: string) {\n const [state, dispatch] = useReducer(teamReducer, initialTeamState);\n const [controlError, setControlError] = useState(\"\");\n const [busy, setBusy] = useState<ReadonlySet<string>>(new Set());\n const active = useRef<ActiveTeamRun | undefined>(undefined);\n const epoch = useRef(0);\n const base = `/teams/${encodeURIComponent(teamId)}/runs`;\n useEffect(\n () => () => {\n cancelTeamRun(active.current);\n active.current = undefined;\n epoch.current++;\n },\n [teamId],\n );\n\n async function start(prompt: string) {\n if (active.current) return;\n const run: ActiveTeamRun = {\n controller: new AbortController(),\n base,\n runId: undefined,\n pending: new Set(),\n epoch: ++epoch.current,\n };\n active.current = run;\n setBusy(new Set());\n setControlError(\"\");\n dispatch({ type: \"start\", prompt });\n try {\n const response = await fetch(base, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ prompt }),\n signal: run.controller.signal,\n });\n if (!response.ok) throw new Error(await responseErrorMessage(response, \"Start team\"));\n if (!response.body) throw new Error(\"Team response has no stream\");\n run.runId = response.headers.get(\"x-anvia-team-run-id\") ?? undefined;\n for await (const event of readJsonlStream<StudioTeamRunEvent>(response.body)) {\n if (active.current !== run || run.controller.signal.aborted) break;\n if (event.type === \"team_run_started\") run.runId = event.runId;\n const terminal =\n event.type === \"response\" || event.type === \"blocked\" || event.type === \"error\";\n // Finish before rendering the result; closing the response body may still be pending.\n if (terminal) active.current = undefined;\n dispatch({ type: \"event\", event });\n if (terminal) return;\n }\n if (!run.controller.signal.aborted)\n throw new Error(\"Team stream ended before a result arrived\");\n } catch (error) {\n if (active.current === run) {\n const action: TeamAction = { type: \"stop\" };\n if (!run.controller.signal.aborted) action.error = errorMessage(error);\n dispatch(action);\n }\n } finally {\n if (active.current === run) active.current = undefined;\n }\n }\n\n async function control(key: string, path: string, body: unknown, onSuccess: () => void) {\n const run = active.current;\n if (!run?.runId || run.pending.has(key)) return false;\n run.pending.add(key);\n setBusy(new Set(run.pending));\n setControlError(\"\");\n try {\n await requestJson(\n `${base}/${encodeURIComponent(run.runId)}${path}`,\n \"Update team\",\n run.controller.signal,\n \"default\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n if (epoch.current === run.epoch && !run.controller.signal.aborted) onSuccess();\n return true;\n } catch (error) {\n if (active.current === run && !run.controller.signal.aborted)\n setControlError(errorMessage(error));\n return false;\n } finally {\n run.pending.delete(key);\n if (epoch.current === run.epoch) setBusy(new Set(run.pending));\n }\n }\n\n function stop() {\n if (!active.current) return;\n cancelTeamRun(active.current);\n dispatch({ type: \"stop\" });\n }\n return {\n state,\n busy,\n controlError,\n start,\n stop,\n reset: () => {\n if (!active.current) {\n epoch.current++;\n dispatch({ type: \"reset\" });\n setControlError(\"\");\n }\n },\n steer: (prompt: string) =>\n control(\"steer\", \"/steer\", { prompt }, () => dispatch({ type: \"prompt\", prompt })),\n respond: (id: string, response: AgentInteractionResponse) =>\n control(id, `/interactions/${encodeURIComponent(id)}`, response, () =>\n dispatch({ type: \"answered\", id }),\n ),\n };\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport type { StudioTeamConfig } from \"../../../../team-types\";\nimport { Button } from \"../../components/ui/button\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport { MarkdownText } from \"../shared/renderers\";\nimport { TeamInteractionCard } from \"./team-interactions\";\nimport { TeamMembers, TeamMessages } from \"./team-members\";\nimport { useTeamRun } from \"./use-team-run\";\n\nexport function TeamPlayground({\n team,\n targetSelector,\n}: {\n team: StudioTeamConfig;\n targetSelector: (running: boolean) => ReactNode;\n}) {\n const run = useTeamRun(team.id);\n const [prompt, setPrompt] = useState(\"\");\n const [selected, select] = useState(\"\");\n const [tab, setTab] = useState<\"members\" | \"messages\">(\"members\");\n const scrollRef = useRef<HTMLDivElement>(null);\n const stick = useRef(true);\n const running = run.state.status === \"running\";\n const started = run.state.status !== \"idle\";\n useEffect(() => {\n const element = scrollRef.current;\n if (element && stick.current) element.scrollTop = element.scrollHeight;\n }, [run.state]);\n async function send() {\n const value = prompt.trim();\n if (!value) return;\n if (running) {\n if (await run.steer(value)) setPrompt(\"\");\n } else {\n setPrompt(\"\");\n stick.current = true;\n void run.start(value);\n }\n }\n return (\n <div className=\"flex min-h-0 min-w-0 flex-col overflow-auto lg:overflow-hidden\">\n <div className=\"flex flex-wrap items-center justify-between gap-3 border-b border-hair px-5 py-3\">\n <div className=\"flex items-center gap-3\">{targetSelector(running)}</div>\n <div className=\"flex items-center gap-3\">\n <span role=\"status\" className=\"text-xs text-muted-foreground\">\n {run.state.status}\n </span>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={running}\n onClick={() => {\n run.reset();\n setPrompt(\"\");\n select(\"\");\n }}\n >\n New task\n </Button>\n </div>\n </div>\n <div className=\"grid min-h-0 min-w-0 flex-1 grid-cols-1 lg:grid-cols-[minmax(0,1fr)_360px] xl:grid-cols-[minmax(0,1fr)_420px]\">\n <div className=\"flex min-h-[480px] min-w-0 flex-col lg:min-h-0\">\n <div\n ref={scrollRef}\n className=\"min-h-0 flex-1 overflow-auto px-5 py-6\"\n onScroll={() => {\n const element = scrollRef.current;\n if (element)\n stick.current =\n element.scrollHeight - element.scrollTop - element.clientHeight < 80;\n }}\n >\n <div className=\"mx-auto max-w-3xl space-y-6\">\n {!started && (\n <div className=\"py-16\">\n <h1 className=\"text-2xl font-medium\">Work with {team.id}</h1>\n <p className=\"mt-3 text-sm text-muted-foreground\">\n Give the coordinator a task. Follow its agents, messages, and requests as they\n work.\n </p>\n <p className=\"mt-4 text-xs text-muted-foreground\">\n Available members:{\" \"}\n {team.members.map((member) => member.name ?? member.id).join(\", \") || \"None\"}\n </p>\n </div>\n )}\n {run.state.conversation.map((entry, index) => {\n if (entry.type === \"prompt\")\n return (\n <article key={`prompt:${index}`} className=\"rounded-xl bg-muted p-4\">\n <div className=\"mb-2 text-xs text-muted-foreground\">You</div>\n <p className=\"whitespace-pre-wrap break-words text-sm\">{entry.text}</p>\n </article>\n );\n const turn = run.state.turns.find((item) => item.key === entry.key);\n return turn?.text ? (\n <article key={entry.key}>\n <div className=\"mb-2 text-xs text-muted-foreground\">Coordinator</div>\n <MarkdownText text={turn.text} live={running} size=\"base\" />\n </article>\n ) : null;\n })}\n {Object.values(run.state.interactions).map((item) => (\n <TeamInteractionCard\n key={item.request.id}\n item={item}\n name={run.state.members[item.instanceId]?.name ?? item.instanceId}\n busy={run.busy.has(item.request.id)}\n respond={run.respond}\n />\n ))}\n {run.state.error && (\n <p role=\"alert\" className=\"text-sm text-status-danger-ink\">\n {run.state.error}\n </p>\n )}\n {run.controlError && (\n <p role=\"alert\" className=\"text-sm text-status-danger-ink\">\n {run.controlError}\n </p>\n )}\n </div>\n </div>\n <form\n className=\"mx-auto w-full max-w-3xl space-y-3 px-5 pb-5 pt-3\"\n onSubmit={(event) => {\n event.preventDefault();\n void send();\n }}\n >\n <Textarea\n aria-label={running ? \"Message coordinator\" : \"Team task\"}\n placeholder={\n running ? \"Send a follow-up to the coordinator…\" : \"Give this team a task…\"\n }\n value={prompt}\n maxLength={32768}\n onChange={(event) => setPrompt(event.target.value)}\n disabled={started && !running}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault();\n if ((!started || running) && !run.busy.has(\"steer\")) void send();\n }\n }}\n />\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs text-muted-foreground\">\n This run stays in this page. Leaving stops active work.\n </p>\n {running && (\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={run.stop}>\n Stop team\n </Button>\n )}\n <Button\n size=\"sm\"\n disabled={\n !prompt.trim() ||\n (started && !running) ||\n (running && (!run.state.runId || run.busy.has(\"steer\")))\n }\n >\n {running ? \"Send follow-up\" : \"Run team\"}\n </Button>\n </div>\n </form>\n </div>\n <aside\n className=\"min-h-64 min-w-0 space-y-5 overflow-auto border-t border-hair p-5 lg:border-t-0 lg:border-l\"\n aria-label=\"Team activity\"\n >\n <div className=\"flex gap-2\">\n <Button\n variant={tab === \"members\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => setTab(\"members\")}\n >\n Members\n </Button>\n <Button\n variant={tab === \"messages\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => setTab(\"messages\")}\n >\n Messages\n </Button>\n </div>\n {tab === \"members\" ? (\n <TeamMembers state={run.state} selected={selected} select={select} />\n ) : (\n <TeamMessages state={run.state} />\n )}\n </aside>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"team-playground-CEBspWEQ.js","names":["useState","_Fragment","useReducer","useState","useRef","useState","useRef","require_react","cn","require_jsx_runtime","__toESM","errorMessage","Button","readJsonlStream","responseErrorMessage","requestJson","Textarea","MarkdownText","import_react","import_jsx_runtime","TeamInteractionCard","answers","setAnswers","props","disabled","status","request","event","question","choice","previous","TeamMembers","members","selected","member","node","child","turn","tool","index","TeamMessages","name","state","id","message","delivered","initialTeamState","closeInteractions","item","instanceId","teamReducer","action","next","old","key","inner","updated","part","cancelTeamRun","run","useTeamRun","dispatch","controlError","setControlError","busy","setBusy","active","epoch","base","teamId","start","response","terminal","error","control","path","body","onSuccess","stop","TeamPlayground","team","prompt","setPrompt","select","tab","setTab","scrollRef","stick","running","started","element","send","value","targetSelector","entry"],"sources":["../../../src/ui/app/modules/teams/team-interactions.tsx","../../../src/ui/app/modules/teams/team-members.tsx","../../../src/ui/app/modules/teams/team-state.ts","../../../src/ui/app/modules/teams/use-team-run.ts","../../../src/ui/app/modules/teams/team-playground.tsx"],"sourcesContent":["import type { AgentInteractionResponse } from \"@anvia/core/agent/interactions\";\nimport { useState } from \"react\";\nimport { Button } from \"../../components/ui/button\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport type { TeamInteraction } from \"./team-state\";\n\nexport function TeamInteractionCard(props: {\n item: TeamInteraction;\n name: string;\n busy: boolean;\n respond: (id: string, response: AgentInteractionResponse) => Promise<boolean>;\n}) {\n const [answers, setAnswers] = useState<Record<string, string>>({});\n const { request, status } = props.item;\n const disabled = props.busy || status !== \"pending\";\n return (\n <section\n className=\"space-y-3 rounded-xl border border-hair bg-card p-4\"\n aria-label={`${props.name}: ${request.toolName}`}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2 text-sm\">\n <strong>\n {props.name} · {request.toolName}\n </strong>\n <span className=\"text-muted-foreground\">\n {props.busy ? \"Submitting…\" : status === \"pending\" ? \"Needs your input\" : status}\n </span>\n </div>\n <p className=\"break-all text-xs text-muted-foreground\">Instance {props.item.instanceId}</p>\n {request.type === \"tool-approval\" ? (\n <>\n {request.reason && <p className=\"text-sm\">{request.reason}</p>}\n <pre className=\"max-h-48 overflow-auto whitespace-pre-wrap break-all text-xs\">\n {JSON.stringify(request.input, null, 2)}\n </pre>\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n disabled={disabled}\n onClick={() =>\n void props.respond(request.id, { type: \"tool-approval\", approved: true })\n }\n >\n Approve\n </Button>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={disabled}\n onClick={() =>\n void props.respond(request.id, { type: \"tool-approval\", approved: false })\n }\n >\n Deny\n </Button>\n </div>\n </>\n ) : (\n <form\n className=\"space-y-3\"\n onSubmit={(event) => {\n event.preventDefault();\n void props.respond(request.id, {\n type: \"tool-question\",\n answers: request.questions.map((question) => ({\n questionId: question.id,\n value: answers[question.id] ?? \"\",\n })),\n });\n }}\n >\n {request.questions.map((question) => (\n <fieldset key={question.id} disabled={disabled} className=\"space-y-2\">\n <legend className=\"mb-2 text-sm\">{question.text}</legend>\n {question.choices?.map((choice) => (\n <label key={choice.value} className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={`${request.id}:${question.id}`}\n value={choice.value}\n checked={answers[question.id] === choice.value}\n onChange={() =>\n setAnswers((previous) => ({ ...previous, [question.id]: choice.value }))\n }\n />\n {choice.label}\n </label>\n ))}\n {(!question.choices?.length || question.allowCustom) && (\n <Textarea\n aria-label={question.text}\n placeholder=\"Your answer\"\n value={answers[question.id] ?? \"\"}\n onChange={(event) =>\n setAnswers((previous) => ({ ...previous, [question.id]: event.target.value }))\n }\n />\n )}\n </fieldset>\n ))}\n <Button\n size=\"sm\"\n disabled={\n disabled || request.questions.some((question) => !answers[question.id]?.trim())\n }\n >\n Send answers\n </Button>\n </form>\n )}\n </section>\n );\n}\n","import type { AgentTeamMemberSummary } from \"@anvia/core/agent\";\nimport { MarkdownText } from \"../shared/renderers\";\nimport { errorMessage } from \"../shared/format\";\nimport { cn } from \"../../lib/utils\";\nimport type { TeamState } from \"./team-state\";\n\nexport function TeamMembers(props: {\n state: TeamState;\n selected: string;\n select: (id: string) => void;\n}) {\n const members = Object.values(props.state.members);\n const selected =\n props.state.members[props.selected] ?? members.find((member) => member.depth === 0);\n function node(member: AgentTeamMemberSummary) {\n return (\n <li key={member.instanceId}>\n <button\n type=\"button\"\n onClick={() => props.select(member.instanceId)}\n title={member.instanceId}\n aria-pressed={selected?.instanceId === member.instanceId}\n className={cn(\n \"flex w-full items-center justify-between gap-3 rounded-lg px-3 py-2 text-left text-sm hover:bg-muted\",\n selected?.instanceId === member.instanceId && \"bg-muted\",\n )}\n style={{ paddingLeft: 12 + member.depth * 16 }}\n >\n <span className=\"min-w-0 truncate\">\n {member.depth > 0 ? \"↳ \" : \"\"}\n {member.name}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {member.status.replaceAll(\"_\", \" \")}\n </span>\n </button>\n <ul>{members.filter((child) => child.parentInstanceId === member.instanceId).map(node)}</ul>\n </li>\n );\n }\n return (\n <div className=\"space-y-5\">\n <div>\n <h2 className=\"mb-3 text-sm font-medium\">\n Members <span className=\"text-muted-foreground\">{members.length}</span>\n </h2>\n {members.length ? (\n <ul aria-label=\"Team members\">\n {members.filter((member) => !member.parentInstanceId).map(node)}\n </ul>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n Spawned agents will appear here as the team works.\n </p>\n )}\n </div>\n {selected && (\n <section className=\"space-y-4 border-t border-hair pt-4\" aria-label=\"Member details\">\n <div>\n <h3 className=\"text-sm font-medium\">{selected.name}</h3>\n <p className=\"break-all text-xs text-muted-foreground\">\n {selected.agentId} · {selected.instanceId}\n </p>\n </div>\n {selected.error !== undefined && (\n <p role=\"alert\" className=\"text-sm text-status-danger-ink\">\n {errorMessage(selected.error)}\n </p>\n )}\n <details className=\"text-xs\">\n <summary className=\"cursor-pointer text-muted-foreground\">Token usage</summary>\n <pre className=\"overflow-auto p-2\">{JSON.stringify(selected.usage, null, 2)}</pre>\n </details>\n {props.state.turns\n .filter((turn) => turn.instanceId === selected.instanceId)\n .map((turn) => (\n <div key={turn.key} className=\"space-y-3\">\n {turn.text && (\n <MarkdownText text={turn.text} live={props.state.status === \"running\"} />\n )}\n {turn.tools.length > 0 && (\n <details>\n <summary className=\"cursor-pointer text-xs text-muted-foreground\">\n Tool activity ({turn.tools.length})\n </summary>\n {turn.tools.map((tool, index) => (\n <pre\n key={index}\n className=\"my-2 max-h-60 overflow-auto whitespace-pre-wrap break-all rounded-lg bg-muted p-3 text-xs\"\n >\n {tool}\n </pre>\n ))}\n </details>\n )}\n {turn.messages && (\n <details>\n <summary className=\"cursor-pointer text-xs text-muted-foreground\">\n Run messages\n </summary>\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap break-all text-xs\">\n {JSON.stringify(turn.messages, null, 2)}\n </pre>\n </details>\n )}\n </div>\n ))}\n </section>\n )}\n </div>\n );\n}\n\nexport function TeamMessages({ state }: { state: TeamState }) {\n const name = (id: string) => state.members[id]?.name ?? id;\n return (\n <section className=\"space-y-3\" aria-label=\"Messages between agents\">\n <h2 className=\"text-sm font-medium\">\n Messages <span className=\"text-muted-foreground\">{state.messages.length}</span>\n </h2>\n {!state.messages.length && (\n <p className=\"text-sm text-muted-foreground\">Messages between agents will appear here.</p>\n )}\n {state.messages.map(({ message, delivered }) => (\n <article key={message.id} className=\"space-y-2 rounded-lg border border-hair p-3\">\n <div className=\"text-xs font-medium\">\n {name(message.fromInstanceId)} → {name(message.toInstanceId)}\n </div>\n <p className=\"whitespace-pre-wrap break-words text-sm\">{message.content}</p>\n <p className=\"text-xs text-muted-foreground\">\n {delivered ? \"Delivered\" : \"Queued\"} ·{\" \"}\n {new Date(message.createdAt).toLocaleTimeString()}\n </p>\n </article>\n ))}\n </section>\n );\n}\n","import type { AgentTeamMemberSummary, AgentTeamMessage } from \"@anvia/core/agent\";\nimport type { AgentInteractionRequest } from \"@anvia/core/agent/interactions\";\nimport type { Message } from \"@anvia/core/completion\";\nimport type { StudioTeamRunEvent } from \"../../../../team-types\";\nimport { errorMessage } from \"../shared/format\";\n\nexport type TeamInteraction = {\n instanceId: string;\n request: AgentInteractionRequest;\n status: \"pending\" | \"answered\" | \"cancelled\";\n};\nexport type TeamTurn = {\n key: string;\n instanceId: string;\n coordinator: boolean;\n text: string;\n tools: string[];\n messages?: readonly Message[];\n};\nexport type TeamState = {\n status: \"idle\" | \"running\" | \"completed\" | \"blocked\" | \"cancelled\" | \"failed\";\n runId?: string;\n error?: string;\n members: Record<string, AgentTeamMemberSummary>;\n turns: TeamTurn[];\n messages: { message: AgentTeamMessage; delivered: boolean }[];\n interactions: Record<string, TeamInteraction>;\n conversation: ({ type: \"prompt\"; text: string } | { type: \"turn\"; key: string })[];\n};\nexport const initialTeamState: TeamState = {\n status: \"idle\",\n members: {},\n turns: [],\n messages: [],\n interactions: {},\n conversation: [],\n};\nexport type TeamAction =\n | { type: \"start\"; prompt: string }\n | { type: \"prompt\"; prompt: string }\n | { type: \"event\"; event: StudioTeamRunEvent }\n | { type: \"answered\"; id: string }\n | { type: \"stop\"; error?: string }\n | { type: \"reset\" };\n\nfunction closeInteractions(state: TeamState, instanceId?: string) {\n return Object.fromEntries(\n Object.entries(state.interactions).map(([id, item]) => [\n id,\n item.status === \"pending\" && (instanceId === undefined || item.instanceId === instanceId)\n ? { ...item, status: \"cancelled\" as const }\n : item,\n ]),\n );\n}\n\nexport function teamReducer(state: TeamState, action: TeamAction): TeamState {\n switch (action.type) {\n case \"reset\":\n return initialTeamState;\n case \"start\":\n return {\n ...initialTeamState,\n status: \"running\",\n conversation: [{ type: \"prompt\", text: action.prompt }],\n };\n case \"prompt\":\n return {\n ...state,\n conversation: [...state.conversation, { type: \"prompt\", text: action.prompt }],\n };\n case \"stop\": {\n const next: TeamState = {\n ...state,\n status: action.error ? \"failed\" : \"cancelled\",\n };\n if (action.error) next.error = action.error;\n next.interactions = closeInteractions(state);\n next.members = Object.fromEntries(\n Object.entries(state.members).map(([id, member]) => [\n id,\n [\"queued\", \"running\", \"waiting\", \"awaiting_interaction\"].includes(member.status)\n ? { ...member, status: \"cancelled\" }\n : member,\n ]),\n );\n return next;\n }\n case \"answered\": {\n const item = state.interactions[action.id];\n return item !== undefined\n ? {\n ...state,\n interactions: { ...state.interactions, [action.id]: { ...item, status: \"answered\" } },\n }\n : state;\n }\n case \"event\":\n break;\n }\n const event = action.event;\n if (event.type === \"team_run_started\") return { ...state, runId: event.runId };\n if (event.type === \"error\")\n return teamReducer(state, { type: \"stop\", error: errorMessage(event.error) });\n if (event.type === \"response\" || event.type === \"blocked\")\n return {\n ...state,\n status: event.type === \"response\" ? \"completed\" : \"blocked\",\n // Terminal outcomes contain descendants only; retain the coordinator as the tree root.\n members: {\n ...state.members,\n ...Object.fromEntries(event.members.map((member) => [member.instanceId, member])),\n },\n interactions: closeInteractions(state),\n };\n if (\"member\" in event) {\n const next: TeamState = {\n ...state,\n members: { ...state.members, [event.instanceId]: event.member },\n };\n if (event.type === \"agent_cancelled\" || event.type === \"agent_failed\") {\n next.interactions = closeInteractions(state, event.instanceId);\n }\n return next;\n }\n if (event.type === \"interaction\")\n return {\n ...state,\n interactions: {\n ...state.interactions,\n [event.interaction.id]: {\n instanceId: event.instanceId,\n request: event.interaction,\n status: \"pending\",\n },\n },\n };\n if (event.type === \"message_queued\" || event.type === \"message_delivered\") {\n const previous = state.messages.find((item) => item.message.id === event.message.id);\n const item = {\n message: event.message,\n delivered: previous?.delivered === true || event.type === \"message_delivered\",\n };\n return {\n ...state,\n messages: previous\n ? state.messages.map((old) => (old.message.id === item.message.id ? item : old))\n : [...state.messages, item].slice(-500),\n };\n }\n if (event.type !== \"agent_event\") return state;\n const key = `${event.instanceId}:${event.runId ?? \"initial\"}`;\n const turn = state.turns.find((item) => item.key === key) ?? {\n key,\n instanceId: event.instanceId,\n coordinator: event.coordinator,\n text: \"\",\n tools: [],\n };\n const inner = event.event;\n let updated: TeamTurn;\n switch (inner.type) {\n case \"text_delta\":\n updated = { ...turn, text: turn.text + inner.delta };\n break;\n case \"tool_call\":\n updated = { ...turn, tools: [...turn.tools, JSON.stringify(inner.toolCall)].slice(-100) };\n break;\n case \"tool_result\":\n updated = {\n ...turn,\n tools: [...turn.tools, `${inner.toolName}: ${JSON.stringify(inner.output, null, 2)}`].slice(\n -100,\n ),\n };\n break;\n case \"response\":\n case \"blocked\":\n updated = {\n ...turn,\n text: inner.text,\n messages: inner.messages,\n tools: inner.messages\n .flatMap((message) => {\n if (typeof message.content === \"string\") return [];\n return message.content\n .filter((part) => part.type === \"tool-call\" || part.type === \"tool-result\")\n .map((part) => JSON.stringify(part, null, 2));\n })\n .slice(-100),\n };\n break;\n default:\n return state;\n }\n return {\n ...state,\n conversation:\n updated.coordinator && !state.turns.some((item) => item.key === key)\n ? [...state.conversation, { type: \"turn\" as const, key }].slice(-500)\n : state.conversation,\n turns: state.turns.some((item) => item.key === key)\n ? state.turns.map((item) => (item.key === key ? updated : item))\n : [...state.turns, updated].slice(-500),\n };\n}\n","import type { AgentInteractionResponse } from \"@anvia/core/agent/interactions\";\nimport { readJsonlStream } from \"@anvia/client/transport\";\nimport { useEffect, useReducer, useRef, useState } from \"react\";\nimport type { StudioTeamRunEvent } from \"../../../../team-types\";\nimport { responseErrorMessage } from \"../../app-errors\";\nimport { errorMessage } from \"../shared/format\";\nimport { requestJson } from \"../shared/request\";\nimport { initialTeamState, teamReducer, type TeamAction } from \"./team-state\";\n\ntype ActiveTeamRun = {\n controller: AbortController;\n base: string;\n runId: string | undefined;\n pending: Set<string>;\n epoch: number;\n};\n\nfunction cancelTeamRun(run: ActiveTeamRun | undefined) {\n if (!run || run.controller.signal.aborted) return;\n if (run.runId) {\n // Keep server cancellation independent of stream teardown, including page navigation.\n void fetch(`${run.base}/${encodeURIComponent(run.runId)}/cancel`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: \"{}\",\n keepalive: true,\n signal: AbortSignal.timeout(5_000),\n }).catch(() => {\n // Teardown cannot wait for the server; disconnect remains the fallback on network failure.\n });\n }\n run.controller.abort();\n}\n\nexport function useTeamRun(teamId: string) {\n const [state, dispatch] = useReducer(teamReducer, initialTeamState);\n const [controlError, setControlError] = useState(\"\");\n const [busy, setBusy] = useState<ReadonlySet<string>>(new Set());\n const active = useRef<ActiveTeamRun | undefined>(undefined);\n const epoch = useRef(0);\n const base = `/teams/${encodeURIComponent(teamId)}/runs`;\n useEffect(\n () => () => {\n cancelTeamRun(active.current);\n active.current = undefined;\n epoch.current++;\n },\n [teamId],\n );\n\n async function start(prompt: string) {\n if (active.current) return;\n const run: ActiveTeamRun = {\n controller: new AbortController(),\n base,\n runId: undefined,\n pending: new Set(),\n epoch: ++epoch.current,\n };\n active.current = run;\n setBusy(new Set());\n setControlError(\"\");\n dispatch({ type: \"start\", prompt });\n try {\n const response = await fetch(base, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ prompt }),\n signal: run.controller.signal,\n });\n if (!response.ok) throw new Error(await responseErrorMessage(response, \"Start team\"));\n if (!response.body) throw new Error(\"Team response has no stream\");\n run.runId = response.headers.get(\"x-anvia-team-run-id\") ?? undefined;\n for await (const event of readJsonlStream<StudioTeamRunEvent>(response.body)) {\n if (active.current !== run || run.controller.signal.aborted) break;\n if (event.type === \"team_run_started\") run.runId = event.runId;\n const terminal =\n event.type === \"response\" || event.type === \"blocked\" || event.type === \"error\";\n // Finish before rendering the result; closing the response body may still be pending.\n if (terminal) active.current = undefined;\n dispatch({ type: \"event\", event });\n if (terminal) return;\n }\n if (!run.controller.signal.aborted)\n throw new Error(\"Team stream ended before a result arrived\");\n } catch (error) {\n if (active.current === run) {\n const action: TeamAction = { type: \"stop\" };\n if (!run.controller.signal.aborted) action.error = errorMessage(error);\n dispatch(action);\n }\n } finally {\n if (active.current === run) active.current = undefined;\n }\n }\n\n async function control(key: string, path: string, body: unknown, onSuccess: () => void) {\n const run = active.current;\n if (!run?.runId || run.pending.has(key)) return false;\n run.pending.add(key);\n setBusy(new Set(run.pending));\n setControlError(\"\");\n try {\n await requestJson(\n `${base}/${encodeURIComponent(run.runId)}${path}`,\n \"Update team\",\n run.controller.signal,\n \"default\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n if (epoch.current === run.epoch && !run.controller.signal.aborted) onSuccess();\n return true;\n } catch (error) {\n if (active.current === run && !run.controller.signal.aborted)\n setControlError(errorMessage(error));\n return false;\n } finally {\n run.pending.delete(key);\n if (epoch.current === run.epoch) setBusy(new Set(run.pending));\n }\n }\n\n function stop() {\n if (!active.current) return;\n cancelTeamRun(active.current);\n dispatch({ type: \"stop\" });\n }\n return {\n state,\n busy,\n controlError,\n start,\n stop,\n reset: () => {\n if (!active.current) {\n epoch.current++;\n dispatch({ type: \"reset\" });\n setControlError(\"\");\n }\n },\n steer: (prompt: string) =>\n control(\"steer\", \"/steer\", { prompt }, () => dispatch({ type: \"prompt\", prompt })),\n respond: (id: string, response: AgentInteractionResponse) =>\n control(id, `/interactions/${encodeURIComponent(id)}`, response, () =>\n dispatch({ type: \"answered\", id }),\n ),\n };\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport type { StudioTeamConfig } from \"../../../../team-types\";\nimport { Button } from \"../../components/ui/button\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport { MarkdownText } from \"../shared/renderers\";\nimport { TeamInteractionCard } from \"./team-interactions\";\nimport { TeamMembers, TeamMessages } from \"./team-members\";\nimport { useTeamRun } from \"./use-team-run\";\n\nexport function TeamPlayground({\n team,\n targetSelector,\n}: {\n team: StudioTeamConfig;\n targetSelector: (running: boolean) => ReactNode;\n}) {\n const run = useTeamRun(team.id);\n const [prompt, setPrompt] = useState(\"\");\n const [selected, select] = useState(\"\");\n const [tab, setTab] = useState<\"members\" | \"messages\">(\"members\");\n const scrollRef = useRef<HTMLDivElement>(null);\n const stick = useRef(true);\n const running = run.state.status === \"running\";\n const started = run.state.status !== \"idle\";\n useEffect(() => {\n const element = scrollRef.current;\n if (element && stick.current) element.scrollTop = element.scrollHeight;\n }, [run.state]);\n async function send() {\n const value = prompt.trim();\n if (!value) return;\n if (running) {\n if (await run.steer(value)) setPrompt(\"\");\n } else {\n setPrompt(\"\");\n stick.current = true;\n void run.start(value);\n }\n }\n return (\n <div className=\"flex min-h-0 min-w-0 flex-col overflow-auto lg:overflow-hidden\">\n <div className=\"flex flex-wrap items-center justify-between gap-3 border-b border-hair px-5 py-3\">\n <div className=\"flex items-center gap-3\">{targetSelector(running)}</div>\n <div className=\"flex items-center gap-3\">\n <span role=\"status\" className=\"text-xs text-muted-foreground\">\n {run.state.status}\n </span>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={running}\n onClick={() => {\n run.reset();\n setPrompt(\"\");\n select(\"\");\n }}\n >\n New task\n </Button>\n </div>\n </div>\n <div className=\"grid min-h-0 min-w-0 flex-1 grid-cols-1 lg:grid-cols-[minmax(0,1fr)_360px] xl:grid-cols-[minmax(0,1fr)_420px]\">\n <div className=\"flex min-h-[480px] min-w-0 flex-col lg:min-h-0\">\n <div\n ref={scrollRef}\n className=\"min-h-0 flex-1 overflow-auto px-5 py-6\"\n onScroll={() => {\n const element = scrollRef.current;\n if (element)\n stick.current =\n element.scrollHeight - element.scrollTop - element.clientHeight < 80;\n }}\n >\n <div className=\"mx-auto max-w-3xl space-y-6\">\n {!started && (\n <div className=\"py-16\">\n <h1 className=\"text-2xl font-medium\">Work with {team.id}</h1>\n <p className=\"mt-3 text-sm text-muted-foreground\">\n Give the coordinator a task. Follow its agents, messages, and requests as they\n work.\n </p>\n <p className=\"mt-4 text-xs text-muted-foreground\">\n Available members:{\" \"}\n {team.members.map((member) => member.name ?? member.id).join(\", \") || \"None\"}\n </p>\n </div>\n )}\n {run.state.conversation.map((entry, index) => {\n if (entry.type === \"prompt\")\n return (\n <article key={`prompt:${index}`} className=\"rounded-xl bg-muted p-4\">\n <div className=\"mb-2 text-xs text-muted-foreground\">You</div>\n <p className=\"whitespace-pre-wrap break-words text-sm\">{entry.text}</p>\n </article>\n );\n const turn = run.state.turns.find((item) => item.key === entry.key);\n return turn?.text ? (\n <article key={entry.key}>\n <div className=\"mb-2 text-xs text-muted-foreground\">Coordinator</div>\n <MarkdownText text={turn.text} live={running} size=\"base\" />\n </article>\n ) : null;\n })}\n {Object.values(run.state.interactions).map((item) => (\n <TeamInteractionCard\n key={item.request.id}\n item={item}\n name={run.state.members[item.instanceId]?.name ?? item.instanceId}\n busy={run.busy.has(item.request.id)}\n respond={run.respond}\n />\n ))}\n {run.state.error && (\n <p role=\"alert\" className=\"text-sm text-status-danger-ink\">\n {run.state.error}\n </p>\n )}\n {run.controlError && (\n <p role=\"alert\" className=\"text-sm text-status-danger-ink\">\n {run.controlError}\n </p>\n )}\n </div>\n </div>\n <form\n className=\"mx-auto w-full max-w-3xl space-y-3 px-5 pb-5 pt-3\"\n onSubmit={(event) => {\n event.preventDefault();\n void send();\n }}\n >\n <Textarea\n aria-label={running ? \"Message coordinator\" : \"Team task\"}\n placeholder={\n running ? \"Send a follow-up to the coordinator…\" : \"Give this team a task…\"\n }\n value={prompt}\n maxLength={32768}\n onChange={(event) => setPrompt(event.target.value)}\n disabled={started && !running}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault();\n if ((!started || running) && !run.busy.has(\"steer\")) void send();\n }\n }}\n />\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs text-muted-foreground\">\n This run stays in this page. Leaving stops active work.\n </p>\n {running && (\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={run.stop}>\n Stop team\n </Button>\n )}\n <Button\n size=\"sm\"\n disabled={\n !prompt.trim() ||\n (started && !running) ||\n (running && (!run.state.runId || run.busy.has(\"steer\")))\n }\n >\n {running ? \"Send follow-up\" : \"Run team\"}\n </Button>\n </div>\n </form>\n </div>\n <aside\n className=\"min-h-64 min-w-0 space-y-5 overflow-auto border-t border-hair p-5 lg:border-t-0 lg:border-l\"\n aria-label=\"Team activity\"\n >\n <div className=\"flex gap-2\">\n <Button\n variant={tab === \"members\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => setTab(\"members\")}\n >\n Members\n </Button>\n <Button\n variant={tab === \"messages\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => setTab(\"messages\")}\n >\n Messages\n </Button>\n </div>\n {tab === \"members\" ? (\n <TeamMembers state={run.state} selected={selected} select={select} />\n ) : (\n <TeamMessages state={run.state} />\n )}\n </aside>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -30,12 +30,12 @@
30
30
  favicon.href = favicon.href.replace("favicon-dark.svg", `favicon-${theme}.svg`);
31
31
  })();
32
32
  </script>
33
- <script type="module" crossorigin src="/ui/assets/index-BpwQ_xqH.js"></script>
33
+ <script type="module" crossorigin src="/ui/assets/index-C9fNYyxm.js"></script>
34
34
  <link rel="modulepreload" crossorigin href="/ui/assets/dist-gzPjmjmv.js">
35
35
  <link rel="modulepreload" crossorigin href="/ui/assets/button-4bdMllZ8.js">
36
36
  <link rel="modulepreload" crossorigin href="/ui/assets/dist-uvOGC5z0.js">
37
37
  <link rel="modulepreload" crossorigin href="/ui/assets/with-selector-DI0K_VfM.js">
38
- <link rel="modulepreload" crossorigin href="/ui/assets/request-C9FAR59q.js">
38
+ <link rel="modulepreload" crossorigin href="/ui/assets/request-CvV7xN38.js">
39
39
  <link rel="modulepreload" crossorigin href="/ui/assets/icon-B3s_bapw.js">
40
40
  <link rel="modulepreload" crossorigin href="/ui/assets/ArrowClockwise.es-DZEjRq0J.js">
41
41
  <link rel="modulepreload" crossorigin href="/ui/assets/Wrench.es-Uf2XraWM.js">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/studio",
3
- "version": "1.3.15",
3
+ "version": "1.3.17",
4
4
  "description": "Studio UI and HTTP runtime for Anvia agents.",
5
5
  "author": "anvia",
6
6
  "license": "MIT",
@@ -45,7 +45,7 @@
45
45
  "react-dom": "^19.3.0",
46
46
  "tailwind-merge": "^3.7.0",
47
47
  "ws": "^8.22.0",
48
- "@anvia/client": "1.4.4",
48
+ "@anvia/client": "1.5.0",
49
49
  "@anvia/graph": "1.1.5",
50
50
  "@anvia/react": "1.1.4",
51
51
  "@anvia/react-ui": "1.1.8",
@@ -66,10 +66,10 @@
66
66
  "vite": "^8.3.4",
67
67
  "vitest": "^4.1.11",
68
68
  "zod": "^4.6.5",
69
- "@anvia/core": "1.14.1"
69
+ "@anvia/core": "1.16.0"
70
70
  },
71
71
  "peerDependencies": {
72
- "@anvia/core": "^1.14.1"
72
+ "@anvia/core": "^1.16.0"
73
73
  },
74
74
  "engines": {
75
75
  "node": ">=20.12.0"
@@ -1,4 +0,0 @@
1
- import{l as e}from"./button-4bdMllZ8.js";async function*t(e){let t=e.getReader(),n=new TextDecoder,i=``,a=!1;try{for(;;){let e=await t.read();if(e.done){a=!0;break}i+=n.decode(e.value,{stream:!0});let r=i.split(/\r?\n/);i=r.pop()??``;for(let e of r){let t=e.trim();t.length>0&&(yield JSON.parse(t))}}i+=n.decode();let e=i.trim();e.length>0&&(yield JSON.parse(e))}finally{a||await r(t),t.releaseLock()}}async function*n(e){let t=e.getReader(),n=new TextDecoder,i=``,a=[],o=!1;function s(e){if(e===``){let e=a.length===0?void 0:a.join(`
2
- `);return a=[],e}if(e.startsWith(`:`))return;let t=e.indexOf(`:`),n=t===-1?e:e.slice(0,t),r=t===-1?``:e.slice(t+1).replace(/^ /,``);n===`data`&&a.push(r)}try{for(;;){let e=await t.read();if(e.done){o=!0;break}i+=n.decode(e.value,{stream:!0});let r=i.split(/\r?\n/);i=r.pop()??``;for(let e of r){let t=s(e);t!==void 0&&(yield JSON.parse(t))}}if(i+=n.decode(),i.length>0){let e=s(i);e!==void 0&&(yield JSON.parse(e))}a.length>0&&(yield JSON.parse(a.join(`
3
- `)))}finally{o||await r(t),t.releaseLock()}}async function r(e){try{await e.cancel()}catch{}}var i=class extends Error{constructor(e,t){super(`Event stream request failed with status ${e.status}`),this.response=e,this.body=t,this.name=`EventStreamHttpError`}response;body};async function*a(e){let r=e.fetch??globalThis.fetch;if(r===void 0)throw Error(`fetchEventStream requires a fetch implementation.`);let a=await r(e.input,o(e));if(!a.ok)throw new i(a,await a.text());if(e.validateResponse?.(a),a.body===null)throw Error(`Event stream response does not include a body.`);(e.format===void 0||e.format===`auto`?s(a.headers.get(`content-type`)):e.format)===`sse`?yield*n(a.body):yield*t(a.body)}function o(e){let{input:t,format:n,fetch:r,validateResponse:i,...a}=e;return a}function s(e){return e?.toLowerCase().includes(`text/event-stream`)?`sse`:`jsonl`}function c(e){return{async*send(t){let n=typeof e.endpoint==`function`?e.endpoint(t):e.endpoint,r=d(await l(e.headers,t),t.headers),i=e.method??`POST`,o=await u(e.body,t,r,i),s={...e.init,input:n,method:i,headers:r,format:e.format??`auto`};o!==void 0&&(s.body=o),t.abortSignal!==void 0&&(s.signal=t.abortSignal),e.fetch!==void 0&&(s.fetch=e.fetch),e.validateResponse!==void 0&&(s.validateResponse=e.validateResponse);for await(let t of a(s))yield e.mapEvent===void 0?t:e.mapEvent(t)}}}async function l(e,t){return typeof e==`function`?e(t):e}async function u(e,t,n,r){if(e!==void 0)return e({...t,headers:n});if(r.toUpperCase()!==`GET`&&r.toUpperCase()!==`HEAD`)return n.has(`content-type`)||n.set(`content-type`,`application/json`),JSON.stringify(t.request)}function d(...e){let t=new Headers;for(let n of e)n!==void 0&&new Headers(n).forEach((e,n)=>{t.set(n,e)});return t}async function f(e,t){let n=``;try{let t=await e.json();typeof t==`object`&&t&&`error`in t&&typeof t.error==`object`&&t.error!==null&&`message`in t.error&&typeof t.error.message==`string`&&(n=`: ${t.error.message}`)}catch{}return`${t} with HTTP ${e.status}${n}`}function p(t){return t instanceof i?t.response.status===401?`Authentication required`:`Run failed with HTTP ${t.response.status}`:e(t)}function m(e,t){let n=``;try{let t=JSON.parse(e.body);typeof t==`object`&&t&&`error`in t&&typeof t.error==`object`&&t.error!==null&&`message`in t.error&&typeof t.error.message==`string`&&(n=`: ${t.error.message}`)}catch{}return`${t} with HTTP ${e.response.status}${n}`}function h(e){if(typeof e==`string`)return e;if(e instanceof Error)return e.message;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}async function g(e,t,n,r=`default`,i={}){let a={...i,cache:r};n!==void 0&&(a.signal=n);let o=await fetch(e,a);if(!o.ok)throw Error(await f(o,t));return await o.json()}export{h as a,t as c,f as i,p as n,i as o,m as r,c as s,g as t};
4
- //# sourceMappingURL=request-C9FAR59q.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-C9FAR59q.js","names":["errorMessage","readJsonlStream","reader","stream","decoder","buffer","completed","next","lines","line","value2","value","cancelReader","readSseStream","data","parseLine","complete","separator","field","EventStreamHttpError","response","body","fetchEventStream","fetchImpl","options","fetchOptions","inferEventStreamFormat","_input","_format","_fetch","_validate","init","contentType","createFetchEventTransport","endpoint","transportOptions","headers","mergeHeaders","resolveHeaders","method","resolveBody","event","context","values","key","headerValue","responseErrorMessage","detail","label","agentRunErrorMessage","error","eventStreamResponseErrorMessage","serializedStreamErrorText","requestJson","request","signal","url"],"sources":["../../../../client/dist/chunk-63JX2QNP.js","../../../../client/dist/chunk-HZZDET2H.js","../../../src/ui/app/app-errors.ts","../../../src/ui/app/modules/shared/request.ts"],"sourcesContent":["// src/transport/streams.ts\nasync function* readJsonlStream(stream) {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let completed = false;\n try {\n while (true) {\n const next = await reader.read();\n if (next.done) {\n completed = true;\n break;\n }\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const value2 = line.trim();\n if (value2.length > 0) yield JSON.parse(value2);\n }\n }\n buffer += decoder.decode();\n const value = buffer.trim();\n if (value.length > 0) yield JSON.parse(value);\n } finally {\n if (!completed) await cancelReader(reader);\n reader.releaseLock();\n }\n}\nasync function* readSseStream(stream) {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let data = [];\n let completed = false;\n function parseLine(line) {\n if (line === \"\") {\n const complete = data.length === 0 ? void 0 : data.join(\"\\n\");\n data = [];\n return complete;\n }\n if (line.startsWith(\":\")) return void 0;\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n const value = separator === -1 ? \"\" : line.slice(separator + 1).replace(/^ /, \"\");\n if (field === \"data\") data.push(value);\n return void 0;\n }\n try {\n while (true) {\n const next = await reader.read();\n if (next.done) {\n completed = true;\n break;\n }\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const complete = parseLine(line);\n if (complete !== void 0) yield JSON.parse(complete);\n }\n }\n buffer += decoder.decode();\n if (buffer.length > 0) {\n const complete = parseLine(buffer);\n if (complete !== void 0) yield JSON.parse(complete);\n }\n if (data.length > 0) yield JSON.parse(data.join(\"\\n\"));\n } finally {\n if (!completed) await cancelReader(reader);\n reader.releaseLock();\n }\n}\nasync function cancelReader(reader) {\n try {\n await reader.cancel();\n } catch {\n }\n}\n\nexport {\n readJsonlStream,\n readSseStream\n};\n//# sourceMappingURL=chunk-63JX2QNP.js.map","import {\n readJsonlStream,\n readSseStream\n} from \"./chunk-63JX2QNP.js\";\n\n// src/transport/fetch.ts\nvar EventStreamHttpError = class extends Error {\n constructor(response, body) {\n super(`Event stream request failed with status ${response.status}`);\n this.response = response;\n this.body = body;\n this.name = \"EventStreamHttpError\";\n }\n response;\n body;\n};\nasync function* fetchEventStream(options) {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === void 0) throw new Error(\"fetchEventStream requires a fetch implementation.\");\n const response = await fetchImpl(options.input, fetchOptions(options));\n if (!response.ok) throw new EventStreamHttpError(response, await response.text());\n options.validateResponse?.(response);\n if (response.body === null) throw new Error(\"Event stream response does not include a body.\");\n const format = options.format === void 0 || options.format === \"auto\" ? inferEventStreamFormat(response.headers.get(\"content-type\")) : options.format;\n if (format === \"sse\") {\n yield* readSseStream(response.body);\n } else {\n yield* readJsonlStream(response.body);\n }\n}\nfunction fetchOptions(options) {\n const {\n input: _input,\n format: _format,\n fetch: _fetch,\n validateResponse: _validate,\n ...init\n } = options;\n return init;\n}\nfunction inferEventStreamFormat(contentType) {\n return contentType?.toLowerCase().includes(\"text/event-stream\") ? \"sse\" : \"jsonl\";\n}\n\n// src/transport/event-transport.ts\nfunction createFetchEventTransport(options) {\n return {\n async *send(transportOptions) {\n const endpoint = typeof options.endpoint === \"function\" ? options.endpoint(transportOptions) : options.endpoint;\n const requestHeaders = await resolveHeaders(options.headers, transportOptions);\n const headers = mergeHeaders(requestHeaders, transportOptions.headers);\n const method = options.method ?? \"POST\";\n const body = await resolveBody(options.body, transportOptions, headers, method);\n const init = {\n ...options.init,\n input: endpoint,\n method,\n headers,\n format: options.format ?? \"auto\"\n };\n if (body !== void 0) init.body = body;\n if (transportOptions.abortSignal !== void 0) init.signal = transportOptions.abortSignal;\n if (options.fetch !== void 0) init.fetch = options.fetch;\n if (options.validateResponse !== void 0) init.validateResponse = options.validateResponse;\n for await (const event of fetchEventStream(init)) {\n yield options.mapEvent === void 0 ? event : options.mapEvent(event);\n }\n }\n };\n}\nfunction createDirectEventTransport(options) {\n return {\n async *send(context) {\n const iterator = options.handler(context)[Symbol.asyncIterator]();\n let closePromise;\n const close = () => {\n closePromise ??= Promise.resolve(iterator.return?.());\n return closePromise;\n };\n const onAbort = () => {\n void close();\n };\n context.abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n while (!context.abortSignal?.aborted) {\n const next = await iterator.next();\n if (next.done) break;\n yield next.value;\n }\n } finally {\n context.abortSignal?.removeEventListener(\"abort\", onAbort);\n await close();\n }\n }\n };\n}\nasync function resolveHeaders(headers, context) {\n return typeof headers === \"function\" ? headers(context) : headers;\n}\nasync function resolveBody(body, context, headers, method) {\n if (body !== void 0) return body({ ...context, headers });\n if (method.toUpperCase() === \"GET\" || method.toUpperCase() === \"HEAD\") return void 0;\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n return JSON.stringify(context.request);\n}\nfunction mergeHeaders(...values) {\n const headers = new Headers();\n for (const value of values) {\n if (value === void 0) continue;\n new Headers(value).forEach((headerValue, key) => {\n headers.set(key, headerValue);\n });\n }\n return headers;\n}\n\nexport {\n EventStreamHttpError,\n fetchEventStream,\n createFetchEventTransport,\n createDirectEventTransport\n};\n//# sourceMappingURL=chunk-HZZDET2H.js.map","import { EventStreamHttpError } from \"@anvia/client/transport\";\nimport { errorMessage } from \"./modules/shared/format\";\n\nexport async function responseErrorMessage(response: Response, label: string): Promise<string> {\n let detail = \"\";\n try {\n const body = (await response.json()) as unknown;\n if (\n typeof body === \"object\" &&\n body !== null &&\n \"error\" in body &&\n typeof body.error === \"object\" &&\n body.error !== null &&\n \"message\" in body.error &&\n typeof body.error.message === \"string\"\n ) {\n detail = `: ${body.error.message}`;\n }\n } catch {\n // Ignore non-JSON error bodies.\n }\n return `${label} with HTTP ${response.status}${detail}`;\n}\n\nexport function agentRunErrorMessage(error: unknown): string {\n if (error instanceof EventStreamHttpError) {\n return error.response.status === 401\n ? \"Authentication required\"\n : `Run failed with HTTP ${error.response.status}`;\n }\n return errorMessage(error);\n}\n\nexport function eventStreamResponseErrorMessage(\n error: EventStreamHttpError,\n label: string,\n): string {\n let detail = \"\";\n try {\n const body = JSON.parse(error.body) as unknown;\n if (\n typeof body === \"object\" &&\n body !== null &&\n \"error\" in body &&\n typeof body.error === \"object\" &&\n body.error !== null &&\n \"message\" in body.error &&\n typeof body.error.message === \"string\"\n ) {\n detail = `: ${body.error.message}`;\n }\n } catch {\n // Ignore non-JSON error bodies.\n }\n return `${label} with HTTP ${error.response.status}${detail}`;\n}\n\nexport function serializedStreamErrorText(error: unknown): string {\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n try {\n return JSON.stringify(error) ?? String(error);\n } catch {\n return String(error);\n }\n}\n","import { responseErrorMessage } from \"../../app-errors\";\n\nexport async function requestJson<T>(\n url: string,\n label: string,\n signal?: AbortSignal,\n cache: RequestCache = \"default\",\n init: RequestInit = {},\n): Promise<T> {\n const request: RequestInit = {\n ...init,\n cache,\n };\n if (signal !== undefined) request.signal = signal;\n const response = await fetch(url, request);\n if (!response.ok) {\n throw new Error(await responseErrorMessage(response, label));\n }\n return (await response.json()) as T;\n}\n"],"mappings":"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"}