@anvia/studio 1.3.15 → 1.3.18
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.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/{graphs-page-CDMb6H6o.js → graphs-page-YmJiyz9d.js} +2 -2
- package/dist/ui/assets/{graphs-page-CDMb6H6o.js.map → graphs-page-YmJiyz9d.js.map} +1 -1
- package/dist/ui/assets/{index-BpwQ_xqH.js → index-DDQA6w5d.js} +5 -5
- package/dist/ui/assets/index-DDQA6w5d.js.map +1 -0
- package/dist/ui/assets/request-CvV7xN38.js +4 -0
- package/dist/ui/assets/request-CvV7xN38.js.map +1 -0
- package/dist/ui/assets/{sandboxes-page-B1j_lSIA.js → sandboxes-page-D3gOWqDQ.js} +2 -2
- package/dist/ui/assets/{sandboxes-page-B1j_lSIA.js.map → sandboxes-page-D3gOWqDQ.js.map} +1 -1
- package/dist/ui/assets/{team-playground-BWPiCcRS.js → team-playground-CEBspWEQ.js} +2 -2
- package/dist/ui/assets/{team-playground-BWPiCcRS.js.map → team-playground-CEBspWEQ.js.map} +1 -1
- package/dist/ui/index.html +2 -2
- package/package.json +6 -6
- package/dist/ui/assets/index-BpwQ_xqH.js.map +0 -1
- package/dist/ui/assets/request-C9FAR59q.js +0 -4
- package/dist/ui/assets/request-C9FAR59q.js.map +0 -1
|
@@ -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-
|
|
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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"}
|
package/dist/ui/index.html
CHANGED
|
@@ -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-
|
|
33
|
+
<script type="module" crossorigin src="/ui/assets/index-DDQA6w5d.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-
|
|
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.
|
|
3
|
+
"version": "1.3.18",
|
|
4
4
|
"description": "Studio UI and HTTP runtime for Anvia agents.",
|
|
5
5
|
"author": "anvia",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
"react-dom": "^19.3.0",
|
|
46
46
|
"tailwind-merge": "^3.7.0",
|
|
47
47
|
"ws": "^8.22.0",
|
|
48
|
-
"@anvia/client": "1.
|
|
48
|
+
"@anvia/client": "1.6.0",
|
|
49
49
|
"@anvia/graph": "1.1.5",
|
|
50
|
-
"@anvia/react": "1.1.
|
|
51
|
-
"@anvia/react-ui": "1.1.
|
|
50
|
+
"@anvia/react": "1.1.5",
|
|
51
|
+
"@anvia/react-ui": "1.1.9",
|
|
52
52
|
"@anvia/server": "1.3.4"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
@@ -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.
|
|
69
|
+
"@anvia/core": "1.17.0"
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
|
72
|
-
"@anvia/core": "^1.
|
|
72
|
+
"@anvia/core": "^1.17.0"
|
|
73
73
|
},
|
|
74
74
|
"engines": {
|
|
75
75
|
"node": ">=20.12.0"
|