@anvia/studio 1.2.0 → 1.2.2

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 +0,0 @@
1
- import{i as e,n as t,r as n,s as r}from"./dist-CHLp-Np4.js";import{s as i,t as a}from"./button-BWxpVW85.js";import{c as o,i as s,t as c}from"./request-DYxy87Kp.js";import{t as l}from"./textarea-gPj9-ALc.js";import{r as u}from"./renderers-CrjMPAR2.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`:return{...e,status:t.error?`failed`:`cancelled`,...t.error?{error:t.error}:{},interactions:_(e),members:Object.fromEntries(Object.entries(e.members).map(([e,t])=>[e,[`queued`,`running`,`waiting`,`awaiting_interaction`].includes(t.status)?{...t,status:`cancelled`}:t]))};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)return{...e,members:{...e.members,[n.instanceId]:n.member},...n.type===`agent_cancelled`||n.type===`agent_failed`?{interactions:_(e,n.instanceId)}:{}};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){f.current===t&&n({type:`stop`,...t.controller.signal.aborted?{}:{error:i(e)}})}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-GcG3j0Hl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"team-playground-GcG3j0Hl.js","names":[],"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 return {\n ...state,\n status: action.error ? \"failed\" : \"cancelled\",\n ...(action.error ? { error: action.error } : {}),\n interactions: closeInteractions(state),\n 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 };\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 return {\n ...state,\n members: { ...state.members, [event.instanceId]: event.member },\n ...(event.type === \"agent_cancelled\" || event.type === \"agent_failed\"\n ? { interactions: closeInteractions(state, event.instanceId) }\n : {}),\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 } 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 dispatch({\n type: \"stop\",\n ...(run.controller.signal.aborted ? {} : { error: errorMessage(error) }),\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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"}