@anvia/studio 1.2.3 → 1.3.0
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/README.md +12 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.js +22 -7
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/{graphs-page-DqwPocIY.js → graphs-page-BsVGFFv1.js} +2 -2
- package/dist/ui/assets/{graphs-page-DqwPocIY.js.map → graphs-page-BsVGFFv1.js.map} +1 -1
- package/dist/ui/assets/index-BDFcpxF9.css +2 -0
- package/dist/ui/assets/index-CM07xxYU.js +67 -0
- package/dist/ui/assets/index-CM07xxYU.js.map +1 -0
- package/dist/ui/assets/{knowledge-page-B28XrwD1.js → knowledge-page-CguNnujL.js} +2 -2
- package/dist/ui/assets/{knowledge-page-B28XrwD1.js.map → knowledge-page-CguNnujL.js.map} +1 -1
- package/dist/ui/assets/{mcps-page-Cp0cXu3k.js → mcps-page-BZVfflk-.js} +2 -2
- package/dist/ui/assets/{mcps-page-Cp0cXu3k.js.map → mcps-page-BZVfflk-.js.map} +1 -1
- package/dist/ui/assets/{memory-page-3S_mBxnY.js → memory-page-DyK3UTyb.js} +2 -2
- package/dist/ui/assets/{memory-page-3S_mBxnY.js.map → memory-page-DyK3UTyb.js.map} +1 -1
- package/dist/ui/assets/{pipelines-page-CfRbR4Po.js → pipelines-page-Dqcq7IGL.js} +2 -2
- package/dist/ui/assets/{pipelines-page-CfRbR4Po.js.map → pipelines-page-Dqcq7IGL.js.map} +1 -1
- package/dist/ui/assets/{renderers-C5qoR_20.js → renderers-BakHuLSK.js} +26 -24
- package/dist/ui/assets/renderers-BakHuLSK.js.map +1 -0
- package/dist/ui/assets/{status-page-BeUxNJNp.js → status-page-DvH1oCw1.js} +2 -2
- package/dist/ui/assets/{status-page-BeUxNJNp.js.map → status-page-DvH1oCw1.js.map} +1 -1
- package/dist/ui/assets/{team-playground-YxRSJeOf.js → team-playground-C-nJy3BC.js} +2 -2
- package/dist/ui/assets/{team-playground-YxRSJeOf.js.map → team-playground-C-nJy3BC.js.map} +1 -1
- package/dist/ui/assets/{tool-runner-DvhSexHU.js → tool-runner-D3CdDSUU.js} +2 -2
- package/dist/ui/assets/{tool-runner-DvhSexHU.js.map → tool-runner-D3CdDSUU.js.map} +1 -1
- package/dist/ui/assets/{tools-page-B613Kgf3.js → tools-page-C0lqOcri.js} +2 -2
- package/dist/ui/assets/{tools-page-B613Kgf3.js.map → tools-page-C0lqOcri.js.map} +1 -1
- package/dist/ui/assets/{transcript-item-B_Lyu12N.js → transcript-item-D9M-VsnP.js} +2 -2
- package/dist/ui/assets/transcript-item-D9M-VsnP.js.map +1 -0
- package/dist/ui/index.html +2 -2
- package/package.json +8 -8
- package/dist/ui/assets/index-C0JlQS8v.js +0 -67
- package/dist/ui/assets/index-C0JlQS8v.js.map +0 -1
- package/dist/ui/assets/index-DDzW7QMd.css +0 -2
- package/dist/ui/assets/renderers-C5qoR_20.js.map +0 -1
- package/dist/ui/assets/transcript-item-B_Lyu12N.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e,r as t,s as n}from"./dist-xrWIzsxw.js";import{t as r,u as i}from"./button-jjWFI6nO.js";import{a,i as o,n as s,r as c,t as l}from"./studio-DeO7ueA2.js";import{t as u}from"./badge-MfEDrFTO.js";import{t as d}from"./renderers-
|
|
2
|
-
//# sourceMappingURL=status-page-
|
|
1
|
+
import{i as e,r as t,s as n}from"./dist-xrWIzsxw.js";import{t as r,u as i}from"./button-jjWFI6nO.js";import{a,i as o,n as s,r as c,t as l}from"./studio-DeO7ueA2.js";import{t as u}from"./badge-MfEDrFTO.js";import{t as d}from"./renderers-BakHuLSK.js";var f=n(e(),1),p=t();function m(e){let[t,n]=(0,f.useState)(),[i,u]=(0,f.useState)(!1),[d,m]=(0,f.useState)(``),g=(0,f.useCallback)(async()=>{if(!e.enabled){n(void 0);return}u(!0),m(``);try{let e=await fetch(`/status`);if(!e.ok)throw Error(`Status failed with HTTP ${e.status}`);n(await e.json())}catch(e){m(e instanceof Error?e.message:String(e)),n(void 0)}finally{u(!1)}},[e.enabled]);return(0,f.useEffect)(()=>{g()},[g]),(0,p.jsxs)(a,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":`Status`,children:[(0,p.jsx)(o,{title:`Status`,description:`Runtime health, storage adapters, feature capabilities, and current record counts.`,action:(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start`,children:[(0,p.jsx)(s,{label:`agents`,value:t?.counts.agents??0}),(0,p.jsx)(s,{label:`sessions`,value:t?.counts.sessions??`-`}),(0,p.jsx)(s,{label:`traces`,value:t?.counts.traces??`-`}),(0,p.jsx)(r,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,disabled:i,onClick:()=>void g(),children:`Refresh`})]})}),(0,p.jsx)(c,{className:`overflow-auto`,children:e.enabled?i&&t===void 0?(0,p.jsx)(l,{title:`Loading status`,text:`Reading runtime status.`}):d.length>0?(0,p.jsx)(l,{title:`Status error`,text:d}):t===void 0?null:(0,p.jsx)(h,{summary:t}):(0,p.jsx)(l,{title:`Status unavailable`,text:`This Studio runtime did not expose status.`})})]})}function h(e){let t=Object.entries(e.summary.capabilities).filter(([,e])=>e?.enabled===!0).length;return(0,p.jsxs)(`div`,{className:`grid h-full min-h-0 gap-5 border-t border-hair pt-4`,children:[(0,p.jsxs)(`section`,{className:`grid gap-5 xl:grid-cols-[minmax(280px,0.58fr)_minmax(0,1.42fr)]`,children:[(0,p.jsx)(g,{summary:e.summary,enabledCapabilityCount:t}),(0,p.jsxs)(`div`,{className:`grid gap-5 lg:grid-cols-2`,children:[(0,p.jsx)(_,{storage:e.summary.storage}),(0,p.jsx)(v,{counts:e.summary.counts})]})]}),(0,p.jsxs)(`section`,{className:`grid gap-5 xl:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]`,children:[(0,p.jsx)(y,{capabilities:e.summary.capabilities}),(0,p.jsx)(b,{summary:e.summary})]})]})}function g(e){return(0,p.jsxs)(`section`,{className:`grid content-start gap-5 border-b border-hair pb-5 xl:border-b-0 xl:border-r xl:pb-0 xl:pr-5`,children:[(0,p.jsxs)(`div`,{className:`grid gap-3`,children:[(0,p.jsx)(S,{children:`runtime`}),(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,p.jsx)(u,{className:`border-hair bg-muted text-foreground`,children:`online`}),(0,p.jsxs)(u,{className:`border-hair bg-background text-muted-foreground`,children:[e.enabledCapabilityCount,` capabilities`]})]})]}),(0,p.jsxs)(`div`,{className:`grid border-y border-hair`,children:[(0,p.jsx)(C,{label:`id`,value:e.summary.runner.id}),(0,p.jsx)(C,{label:`name`,value:e.summary.runner.name??`-`}),(0,p.jsx)(C,{label:`version`,value:e.summary.runner.version??`-`}),(0,p.jsx)(C,{label:`generated`,value:`${i(e.summary.generatedAt)} / ${e.summary.generatedAt}`})]})]})}function _(e){let t=Object.entries(e.storage);return(0,p.jsxs)(`section`,{className:`grid content-start gap-3`,children:[(0,p.jsx)(x,{title:`storage`,value:`${t.length} adapters`}),t.length===0?(0,p.jsx)(T,{text:`No storage adapters reported.`}):(0,p.jsx)(`div`,{className:`grid border-y border-hair`,children:t.map(([e,t])=>(0,p.jsx)(w,{label:E(e),value:t??`-`,tone:t===void 0?`muted`:`normal`},e))})]})}function v(e){let t=Object.entries(e.counts).filter(e=>typeof e[1]==`number`);return(0,p.jsxs)(`section`,{className:`grid content-start gap-3`,children:[(0,p.jsx)(x,{title:`records`,value:`${t.length} counters`}),(0,p.jsx)(`div`,{className:`grid border-y border-hair`,children:t.map(([e,t])=>(0,p.jsx)(w,{label:E(e),value:t},e))})]})}function y(e){let t=Object.entries(e.capabilities);return(0,p.jsxs)(`section`,{className:`grid content-start gap-3`,children:[(0,p.jsx)(x,{title:`capabilities`,value:`${t.length} reported`}),t.length===0?(0,p.jsx)(T,{text:`No capabilities reported.`}):(0,p.jsx)(`div`,{className:`grid border-y border-hair sm:grid-cols-2 sm:divide-x sm:divide-hair`,children:t.map(([e,n],r)=>(0,p.jsxs)(`div`,{className:[`grid min-w-0 gap-1 border-b border-hair px-3 py-3`,r>=t.length-(t.length%2==0?2:1)?`sm:border-b-0`:``].join(` `),children:[(0,p.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,p.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:E(e)}),(0,p.jsx)(`span`,{className:n?.enabled?`text-xs font-medium text-foreground`:`text-xs font-medium text-muted-foreground`,children:n?.enabled?`enabled`:`disabled`})]}),n?.reason===void 0?null:(0,p.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:n.reason})]},e))})]})}function b(e){return(0,p.jsxs)(`section`,{className:`grid min-w-0 content-start gap-3`,children:[(0,p.jsx)(x,{title:`raw summary`,value:`JSON`}),(0,p.jsxs)(`details`,{className:`group grid min-w-0 overflow-hidden border-y border-hair`,open:!0,children:[(0,p.jsxs)(`summary`,{className:`flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 bg-muted px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[`Payload`,(0,p.jsx)(`span`,{className:`font-medium normal-case tracking-normal group-open:hidden`,children:`Show`}),(0,p.jsx)(`span`,{className:`hidden font-medium normal-case tracking-normal group-open:inline`,children:`Hide`})]}),(0,p.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-t border-hair`,children:(0,p.jsx)(`pre`,{className:`m-0 max-h-[28rem] min-w-max p-4 text-xs leading-5 text-foreground`,children:(0,p.jsx)(`code`,{children:(0,p.jsx)(d,{text:JSON.stringify(e.summary,null,2)})})})})]})]})}function x(e){return(0,p.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,p.jsx)(S,{children:e.title}),(0,p.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:e.value})]})}function S(e){return(0,p.jsx)(`h2`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:e.children})}function C(e){return(0,p.jsxs)(`div`,{className:`grid min-w-0 gap-1 border-b border-hair px-3 py-3 first:pt-3 last:border-b-0`,children:[(0,p.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.label}),(0,p.jsx)(`span`,{className:`min-w-0 truncate text-sm text-foreground`,title:String(e.value),children:e.value})]})}function w(e){return(0,p.jsxs)(`div`,{className:`grid min-w-0 grid-cols-[minmax(120px,0.5fr)_minmax(0,1fr)] gap-3 border-b border-hair px-3 py-3 last:border-b-0`,children:[(0,p.jsx)(`span`,{className:`min-w-0 truncate text-sm font-medium text-muted-foreground`,children:e.label}),(0,p.jsx)(`span`,{className:[`min-w-0 truncate text-right text-sm font-semibold tabular-nums`,e.tone===`muted`?`text-muted-foreground`:`text-foreground`].join(` `),title:String(e.value),children:e.value})]})}function T(e){return(0,p.jsx)(`div`,{className:`border-y border-dashed border-hair px-3 py-8 text-center text-sm text-muted-foreground`,children:e.text})}function E(e){return e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/[_-]+/g,` `).toLowerCase()}export{m as StatusPage};
|
|
2
|
+
//# sourceMappingURL=status-page-DvH1oCw1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-page-BeUxNJNp.js","names":[],"sources":["../../../src/ui/app/modules/status/status-page.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { StudioStatusSummary } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n StudioEmptyState,\n StudioHeaderMetric,\n StudioPageContent,\n StudioPageHeader,\n StudioPageShell,\n} from \"../../components/ui/studio\";\nimport { formatRelativeTime } from \"../shared/format\";\nimport { JsonSyntax } from \"../shared/renderers\";\n\nexport function StatusPage(props: { enabled: boolean }) {\n const [summary, setSummary] = useState<StudioStatusSummary | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const loadStatus = useCallback(async () => {\n if (!props.enabled) {\n setSummary(undefined);\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n const response = await fetch(\"/status\");\n if (!response.ok) {\n throw new Error(`Status failed with HTTP ${response.status}`);\n }\n setSummary((await response.json()) as StudioStatusSummary);\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError));\n setSummary(undefined);\n } finally {\n setLoading(false);\n }\n }, [props.enabled]);\n\n useEffect(() => {\n void loadStatus();\n }, [loadStatus]);\n\n return (\n <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Status\">\n <StudioPageHeader\n title=\"Status\"\n description=\"Runtime health, storage adapters, feature capabilities, and current record counts.\"\n action={\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start\">\n <StudioHeaderMetric label=\"agents\" value={summary?.counts.agents ?? 0} />\n <StudioHeaderMetric label=\"sessions\" value={summary?.counts.sessions ?? \"-\"} />\n <StudioHeaderMetric label=\"traces\" value={summary?.counts.traces ?? \"-\"} />\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n disabled={loading}\n onClick={() => void loadStatus()}\n >\n Refresh\n </Button>\n </div>\n }\n />\n\n <StudioPageContent className=\"overflow-auto\">\n {!props.enabled ? (\n <StudioEmptyState\n title=\"Status unavailable\"\n text=\"This Studio runtime did not expose status.\"\n />\n ) : loading && summary === undefined ? (\n <StudioEmptyState title=\"Loading status\" text=\"Reading runtime status.\" />\n ) : error.length > 0 ? (\n <StudioEmptyState title=\"Status error\" text={error} />\n ) : summary === undefined ? null : (\n <StatusDashboard summary={summary} />\n )}\n </StudioPageContent>\n </StudioPageShell>\n );\n}\n\nfunction StatusDashboard(props: { summary: StudioStatusSummary }) {\n const capabilityEntries = Object.entries(props.summary.capabilities);\n const enabledCapabilityCount = capabilityEntries.filter(\n ([, capability]) => capability?.enabled === true,\n ).length;\n\n return (\n <div className=\"grid h-full min-h-0 gap-5 border-t border-hair pt-4\">\n <section className=\"grid gap-5 xl:grid-cols-[minmax(280px,0.58fr)_minmax(0,1.42fr)]\">\n <RuntimeSummary summary={props.summary} enabledCapabilityCount={enabledCapabilityCount} />\n <div className=\"grid gap-5 lg:grid-cols-2\">\n <StorageMatrix storage={props.summary.storage} />\n <CountsLedger counts={props.summary.counts} />\n </div>\n </section>\n <section className=\"grid gap-5 xl:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]\">\n <CapabilityLedger capabilities={props.summary.capabilities} />\n <RawSummary summary={props.summary} />\n </section>\n </div>\n );\n}\n\nfunction RuntimeSummary(props: { summary: StudioStatusSummary; enabledCapabilityCount: number }) {\n return (\n <section className=\"grid content-start gap-5 border-b border-hair pb-5 xl:border-b-0 xl:border-r xl:pb-0 xl:pr-5\">\n <div className=\"grid gap-3\">\n <SectionLabel>runtime</SectionLabel>\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Badge className=\"border-hair bg-muted text-foreground\">online</Badge>\n <Badge className=\"border-hair bg-background text-muted-foreground\">\n {props.enabledCapabilityCount} capabilities\n </Badge>\n </div>\n </div>\n <div className=\"grid border-y border-hair\">\n <StatusFact label=\"id\" value={props.summary.runner.id} />\n <StatusFact label=\"name\" value={props.summary.runner.name ?? \"-\"} />\n <StatusFact label=\"version\" value={props.summary.runner.version ?? \"-\"} />\n <StatusFact\n label=\"generated\"\n value={`${formatRelativeTime(props.summary.generatedAt)} / ${props.summary.generatedAt}`}\n />\n </div>\n </section>\n );\n}\n\nfunction StorageMatrix(props: { storage: StudioStatusSummary[\"storage\"] }) {\n const entries = Object.entries(props.storage);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"storage\" value={`${entries.length} adapters`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No storage adapters reported.\" />\n ) : (\n <div className=\"grid border-y border-hair\">\n {entries.map(([key, value]) => (\n <StatusRow\n label={humanizeKey(key)}\n value={value ?? \"-\"}\n key={key}\n tone={value === undefined ? \"muted\" : \"normal\"}\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction CountsLedger(props: { counts: StudioStatusSummary[\"counts\"] }) {\n const entries = Object.entries(props.counts).filter((entry): entry is [string, number] => {\n return typeof entry[1] === \"number\";\n });\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"records\" value={`${entries.length} counters`} />\n <div className=\"grid border-y border-hair\">\n {entries.map(([key, value]) => (\n <StatusRow label={humanizeKey(key)} value={value} key={key} />\n ))}\n </div>\n </section>\n );\n}\n\nfunction CapabilityLedger(props: { capabilities: StudioStatusSummary[\"capabilities\"] }) {\n const entries = Object.entries(props.capabilities);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"capabilities\" value={`${entries.length} reported`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No capabilities reported.\" />\n ) : (\n <div className=\"grid border-y border-hair sm:grid-cols-2 sm:divide-x sm:divide-hair\">\n {entries.map(([name, capability], index) => (\n <div\n className={[\n \"grid min-w-0 gap-1 border-b border-hair px-3 py-3\",\n index >= entries.length - (entries.length % 2 === 0 ? 2 : 1) ? \"sm:border-b-0\" : \"\",\n ].join(\" \")}\n key={name}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {humanizeKey(name)}\n </span>\n <span\n className={\n capability?.enabled\n ? \"text-xs font-medium text-foreground\"\n : \"text-xs font-medium text-muted-foreground\"\n }\n >\n {capability?.enabled ? \"enabled\" : \"disabled\"}\n </span>\n </div>\n {capability?.reason === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{capability.reason}</p>\n )}\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction RawSummary(props: { summary: StudioStatusSummary }) {\n return (\n <section className=\"grid min-w-0 content-start gap-3\">\n <SectionHeader title=\"raw summary\" value=\"JSON\" />\n <details className=\"group grid min-w-0 overflow-hidden border-y border-hair\" open>\n <summary className=\"flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 bg-muted px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Payload\n <span className=\"font-medium normal-case tracking-normal group-open:hidden\">Show</span>\n <span className=\"hidden font-medium normal-case tracking-normal group-open:inline\">\n Hide\n </span>\n </summary>\n <div className=\"min-w-0 overflow-x-auto border-t border-hair\">\n <pre className=\"m-0 max-h-[28rem] min-w-max p-4 text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={JSON.stringify(props.summary, null, 2)} />\n </code>\n </pre>\n </div>\n </details>\n </section>\n );\n}\n\nfunction SectionHeader(props: { title: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <SectionLabel>{props.title}</SectionLabel>\n <span className=\"text-xs font-medium text-muted-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction SectionLabel(props: { children: string }) {\n return (\n <h2 className=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n {props.children}\n </h2>\n );\n}\n\nfunction StatusFact(props: { label: string; value: string | number }) {\n return (\n <div className=\"grid min-w-0 gap-1 border-b border-hair px-3 py-3 first:pt-3 last:border-b-0\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.label}\n </span>\n <span className=\"min-w-0 truncate text-sm text-foreground\" title={String(props.value)}>\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction StatusRow(props: { label: string; value: string | number; tone?: \"normal\" | \"muted\" }) {\n return (\n <div className=\"grid min-w-0 grid-cols-[minmax(120px,0.5fr)_minmax(0,1fr)] gap-3 border-b border-hair px-3 py-3 last:border-b-0\">\n <span className=\"min-w-0 truncate text-sm font-medium text-muted-foreground\">\n {props.label}\n </span>\n <span\n className={[\n \"min-w-0 truncate text-right text-sm font-semibold tabular-nums\",\n props.tone === \"muted\" ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n title={String(props.value)}\n >\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction DashedNote(props: { text: string }) {\n return (\n <div className=\"border-y border-dashed border-hair px-3 py-8 text-center text-sm text-muted-foreground\">\n {props.text}\n </div>\n );\n}\n\nfunction humanizeKey(value: string): string {\n return value\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .toLowerCase();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"status-page-DvH1oCw1.js","names":[],"sources":["../../../src/ui/app/modules/status/status-page.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { StudioStatusSummary } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n StudioEmptyState,\n StudioHeaderMetric,\n StudioPageContent,\n StudioPageHeader,\n StudioPageShell,\n} from \"../../components/ui/studio\";\nimport { formatRelativeTime } from \"../shared/format\";\nimport { JsonSyntax } from \"../shared/renderers\";\n\nexport function StatusPage(props: { enabled: boolean }) {\n const [summary, setSummary] = useState<StudioStatusSummary | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const loadStatus = useCallback(async () => {\n if (!props.enabled) {\n setSummary(undefined);\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n const response = await fetch(\"/status\");\n if (!response.ok) {\n throw new Error(`Status failed with HTTP ${response.status}`);\n }\n setSummary((await response.json()) as StudioStatusSummary);\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError));\n setSummary(undefined);\n } finally {\n setLoading(false);\n }\n }, [props.enabled]);\n\n useEffect(() => {\n void loadStatus();\n }, [loadStatus]);\n\n return (\n <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Status\">\n <StudioPageHeader\n title=\"Status\"\n description=\"Runtime health, storage adapters, feature capabilities, and current record counts.\"\n action={\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start\">\n <StudioHeaderMetric label=\"agents\" value={summary?.counts.agents ?? 0} />\n <StudioHeaderMetric label=\"sessions\" value={summary?.counts.sessions ?? \"-\"} />\n <StudioHeaderMetric label=\"traces\" value={summary?.counts.traces ?? \"-\"} />\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n disabled={loading}\n onClick={() => void loadStatus()}\n >\n Refresh\n </Button>\n </div>\n }\n />\n\n <StudioPageContent className=\"overflow-auto\">\n {!props.enabled ? (\n <StudioEmptyState\n title=\"Status unavailable\"\n text=\"This Studio runtime did not expose status.\"\n />\n ) : loading && summary === undefined ? (\n <StudioEmptyState title=\"Loading status\" text=\"Reading runtime status.\" />\n ) : error.length > 0 ? (\n <StudioEmptyState title=\"Status error\" text={error} />\n ) : summary === undefined ? null : (\n <StatusDashboard summary={summary} />\n )}\n </StudioPageContent>\n </StudioPageShell>\n );\n}\n\nfunction StatusDashboard(props: { summary: StudioStatusSummary }) {\n const capabilityEntries = Object.entries(props.summary.capabilities);\n const enabledCapabilityCount = capabilityEntries.filter(\n ([, capability]) => capability?.enabled === true,\n ).length;\n\n return (\n <div className=\"grid h-full min-h-0 gap-5 border-t border-hair pt-4\">\n <section className=\"grid gap-5 xl:grid-cols-[minmax(280px,0.58fr)_minmax(0,1.42fr)]\">\n <RuntimeSummary summary={props.summary} enabledCapabilityCount={enabledCapabilityCount} />\n <div className=\"grid gap-5 lg:grid-cols-2\">\n <StorageMatrix storage={props.summary.storage} />\n <CountsLedger counts={props.summary.counts} />\n </div>\n </section>\n <section className=\"grid gap-5 xl:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]\">\n <CapabilityLedger capabilities={props.summary.capabilities} />\n <RawSummary summary={props.summary} />\n </section>\n </div>\n );\n}\n\nfunction RuntimeSummary(props: { summary: StudioStatusSummary; enabledCapabilityCount: number }) {\n return (\n <section className=\"grid content-start gap-5 border-b border-hair pb-5 xl:border-b-0 xl:border-r xl:pb-0 xl:pr-5\">\n <div className=\"grid gap-3\">\n <SectionLabel>runtime</SectionLabel>\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Badge className=\"border-hair bg-muted text-foreground\">online</Badge>\n <Badge className=\"border-hair bg-background text-muted-foreground\">\n {props.enabledCapabilityCount} capabilities\n </Badge>\n </div>\n </div>\n <div className=\"grid border-y border-hair\">\n <StatusFact label=\"id\" value={props.summary.runner.id} />\n <StatusFact label=\"name\" value={props.summary.runner.name ?? \"-\"} />\n <StatusFact label=\"version\" value={props.summary.runner.version ?? \"-\"} />\n <StatusFact\n label=\"generated\"\n value={`${formatRelativeTime(props.summary.generatedAt)} / ${props.summary.generatedAt}`}\n />\n </div>\n </section>\n );\n}\n\nfunction StorageMatrix(props: { storage: StudioStatusSummary[\"storage\"] }) {\n const entries = Object.entries(props.storage);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"storage\" value={`${entries.length} adapters`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No storage adapters reported.\" />\n ) : (\n <div className=\"grid border-y border-hair\">\n {entries.map(([key, value]) => (\n <StatusRow\n label={humanizeKey(key)}\n value={value ?? \"-\"}\n key={key}\n tone={value === undefined ? \"muted\" : \"normal\"}\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction CountsLedger(props: { counts: StudioStatusSummary[\"counts\"] }) {\n const entries = Object.entries(props.counts).filter((entry): entry is [string, number] => {\n return typeof entry[1] === \"number\";\n });\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"records\" value={`${entries.length} counters`} />\n <div className=\"grid border-y border-hair\">\n {entries.map(([key, value]) => (\n <StatusRow label={humanizeKey(key)} value={value} key={key} />\n ))}\n </div>\n </section>\n );\n}\n\nfunction CapabilityLedger(props: { capabilities: StudioStatusSummary[\"capabilities\"] }) {\n const entries = Object.entries(props.capabilities);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"capabilities\" value={`${entries.length} reported`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No capabilities reported.\" />\n ) : (\n <div className=\"grid border-y border-hair sm:grid-cols-2 sm:divide-x sm:divide-hair\">\n {entries.map(([name, capability], index) => (\n <div\n className={[\n \"grid min-w-0 gap-1 border-b border-hair px-3 py-3\",\n index >= entries.length - (entries.length % 2 === 0 ? 2 : 1) ? \"sm:border-b-0\" : \"\",\n ].join(\" \")}\n key={name}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {humanizeKey(name)}\n </span>\n <span\n className={\n capability?.enabled\n ? \"text-xs font-medium text-foreground\"\n : \"text-xs font-medium text-muted-foreground\"\n }\n >\n {capability?.enabled ? \"enabled\" : \"disabled\"}\n </span>\n </div>\n {capability?.reason === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{capability.reason}</p>\n )}\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction RawSummary(props: { summary: StudioStatusSummary }) {\n return (\n <section className=\"grid min-w-0 content-start gap-3\">\n <SectionHeader title=\"raw summary\" value=\"JSON\" />\n <details className=\"group grid min-w-0 overflow-hidden border-y border-hair\" open>\n <summary className=\"flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 bg-muted px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Payload\n <span className=\"font-medium normal-case tracking-normal group-open:hidden\">Show</span>\n <span className=\"hidden font-medium normal-case tracking-normal group-open:inline\">\n Hide\n </span>\n </summary>\n <div className=\"min-w-0 overflow-x-auto border-t border-hair\">\n <pre className=\"m-0 max-h-[28rem] min-w-max p-4 text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={JSON.stringify(props.summary, null, 2)} />\n </code>\n </pre>\n </div>\n </details>\n </section>\n );\n}\n\nfunction SectionHeader(props: { title: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <SectionLabel>{props.title}</SectionLabel>\n <span className=\"text-xs font-medium text-muted-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction SectionLabel(props: { children: string }) {\n return (\n <h2 className=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n {props.children}\n </h2>\n );\n}\n\nfunction StatusFact(props: { label: string; value: string | number }) {\n return (\n <div className=\"grid min-w-0 gap-1 border-b border-hair px-3 py-3 first:pt-3 last:border-b-0\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.label}\n </span>\n <span className=\"min-w-0 truncate text-sm text-foreground\" title={String(props.value)}>\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction StatusRow(props: { label: string; value: string | number; tone?: \"normal\" | \"muted\" }) {\n return (\n <div className=\"grid min-w-0 grid-cols-[minmax(120px,0.5fr)_minmax(0,1fr)] gap-3 border-b border-hair px-3 py-3 last:border-b-0\">\n <span className=\"min-w-0 truncate text-sm font-medium text-muted-foreground\">\n {props.label}\n </span>\n <span\n className={[\n \"min-w-0 truncate text-right text-sm font-semibold tabular-nums\",\n props.tone === \"muted\" ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n title={String(props.value)}\n >\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction DashedNote(props: { text: string }) {\n return (\n <div className=\"border-y border-dashed border-hair px-3 py-8 text-center text-sm text-muted-foreground\">\n {props.text}\n </div>\n );\n}\n\nfunction humanizeKey(value: string): string {\n return value\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .toLowerCase();\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e,n as t,r as n,s as r}from"./dist-xrWIzsxw.js";import{c as i,t as a}from"./button-jjWFI6nO.js";import{c as o,i as s,t as c}from"./request-CpxtfF0E.js";import{t as l}from"./textarea-BqjRR-2a.js";import{r as u}from"./renderers-C5qoR_20.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-xrWIzsxw.js";import{c as i,t as a}from"./button-jjWFI6nO.js";import{c as o,i as s,t as c}from"./request-CpxtfF0E.js";import{t as l}from"./textarea-BqjRR-2a.js";import{r as u}from"./renderers-BakHuLSK.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-C-nJy3BC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-playground-YxRSJeOf.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 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-C-nJy3BC.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 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,2 +1,2 @@
|
|
|
1
|
-
import{i as e,r as t,s as n}from"./dist-xrWIzsxw.js";import{g as r,t as i,y as a}from"./button-jjWFI6nO.js";import{a as o,i as s,n as c,r as l,t as u}from"./select-Bt5d0Z3n.js";import{t as d}from"./textarea-BqjRR-2a.js";import{t as f}from"./badge-MfEDrFTO.js";import{t as ee}from"./renderers-C5qoR_20.js";import{t as p}from"./input-C35vs5wD.js";var m=n(e(),1),h=t();function g(e){let[t,n]=(0,m.useState)(`form`),r=(0,m.useMemo)(()=>T(e.schema),[e.schema]),i=(0,m.useMemo)(()=>F(e.value),[e.value]),o=e.disabled===!0,s=r.length>0,c=s?t:`json`,l=i.ok&&a(i.value)?i.value:void 0;function u(t,n){let r=l??{};e.onChange(z(P(r,t,n)))}function d(t,n){let r=l??{},i=N(r,t);Array.isArray(i)&&e.onChange(z(P(r,t,i.filter((e,t)=>t!==n))))}return(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-3`,children:[(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Arguments`}),s?(0,h.jsxs)(`div`,{className:`inline-grid h-8 grid-cols-2 overflow-hidden rounded-md border border-hair bg-background p-0.5`,children:[(0,h.jsx)(_,{active:c===`form`,onClick:()=>n(`form`),children:`Form`}),(0,h.jsx)(_,{active:c===`json`,onClick:()=>n(`json`),children:`JSON`})]}):(0,h.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:`JSON`})]}),c===`json`||l===void 0?(0,h.jsx)(v,{disabled:o,error:i.ok?``:i.error,value:e.value,onChange:e.onChange}):(0,h.jsx)(`div`,{className:`grid gap-3`,children:r.map(e=>(0,h.jsx)(y,{disabled:o,field:e,path:[e.name],rootValue:l,onChange:u,onRemoveArrayItem:d},e.name))})]})}function _(e){return(0,h.jsx)(`button`,{className:e.active?`rounded-[5px] bg-muted px-3 text-xs font-semibold text-foreground`:`rounded-[5px] px-3 text-xs font-medium text-muted-foreground transition hover:text-foreground`,type:`button`,onClick:e.onClick,children:e.children})}function v(e){return(0,h.jsxs)(`div`,{className:`grid gap-2`,children:[(0,h.jsx)(d,{className:`min-h-36 resize-y rounded-md border-border bg-background p-3 text-xs leading-5`,disabled:e.disabled,value:e.value,spellCheck:!1,onChange:t=>e.onChange(t.target.value)}),e.error.length===0?null:(0,h.jsx)(`div`,{className:`rounded-md border border-status-danger-ink bg-status-danger-fill px-3 py-2 text-xs leading-5 text-destructive`,children:e.error})]})}function y(e){let t=N(e.rootValue,e.path),n=k(e.field.schema,e.field.name),r=A(e.field.schema),i=E(e.field.schema);if(i===`object`){let i=T(e.field.schema);return(0,h.jsxs)(`fieldset`,{className:`grid min-w-0 gap-3 border-b border-hair pb-3 last:border-b-0`,children:[(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(`legend`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:n}),e.field.required?(0,h.jsx)(S,{}):null]}),r===void 0?null:(0,h.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:r}),i.length===0?(0,h.jsx)(w,{disabled:e.disabled,path:e.path,value:t,onChange:e.onChange}):(0,h.jsx)(`div`,{className:`grid gap-3 border-l border-hair pl-3`,children:i.map(t=>(0,h.jsx)(y,{disabled:e.disabled,field:t,path:[...e.path,t.name],rootValue:e.rootValue,onChange:e.onChange,onRemoveArrayItem:e.onRemoveArrayItem},t.name))})]})}return i===`array`?(0,h.jsx)(b,{description:r,disabled:e.disabled,field:e.field,label:n,path:e.path,rootValue:e.rootValue,value:t,onChange:e.onChange,onRemoveArrayItem:e.onRemoveArrayItem}):(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-2 border-b border-hair pb-3 last:border-b-0`,children:[(0,h.jsx)(x,{label:n,required:e.field.required}),r===void 0?null:(0,h.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:r}),(0,h.jsx)(te,{disabled:e.disabled,path:e.path,required:e.field.required,schema:e.field.schema,value:t,onChange:e.onChange})]})}function b(e){let t=D(e.field.schema),n=Array.isArray(e.value)?e.value:[],r=n.map((t,n)=>({index:n,key:`${H(e.path)}:${n}:${V(t)}`}));return(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-3 border-b border-hair pb-3 last:border-b-0`,children:[(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(x,{label:e.label,required:e.field.required}),t===void 0?null:(0,h.jsx)(i,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,disabled:e.disabled,type:`button`,variant:`secondary`,onClick:()=>e.onChange(e.path,[...n,M(t)]),children:`Add`})]}),e.description===void 0?null:(0,h.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:e.description}),t===void 0?(0,h.jsx)(w,{disabled:e.disabled,path:e.path,value:e.value,onChange:e.onChange}):n.length===0?(0,h.jsx)(`div`,{className:`rounded-md border border-dashed border-hair px-3 py-2 text-xs text-muted-foreground`,children:`Empty array`}):(0,h.jsx)(`div`,{className:`grid gap-3 border-l border-hair pl-3`,children:r.map(n=>(0,h.jsxs)(`div`,{className:`grid gap-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,h.jsxs)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:[`Item `,n.index+1]}),(0,h.jsx)(i,{className:`h-7 min-h-7 rounded-md px-2 text-xs`,disabled:e.disabled,type:`button`,variant:`ghost`,onClick:()=>e.onRemoveArrayItem(e.path,n.index),children:`Remove`})]}),(0,h.jsx)(y,{disabled:e.disabled,field:{name:String(n.index+1),required:!0,schema:t},path:[...e.path,n.index],rootValue:e.rootValue,onChange:e.onChange,onRemoveArrayItem:e.onRemoveArrayItem})]},n.key))})]})}function x(e){return(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,h.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.label}),e.required?(0,h.jsx)(S,{}):null]})}function S(){return(0,h.jsx)(`span`,{className:`rounded-md bg-muted px-2 py-0.5 text-[11px] font-medium text-muted-foreground`,children:`required`})}function te(e){let t=O(e.schema);if(t.length>0){let n=t.findIndex(t=>B(t,e.value)),r=t.map((e,t)=>({label:V(e),value:String(t),key:`${t}:${V(e)}`}));return(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,h.jsxs)(u,{value:n===-1?``:String(n),disabled:e.disabled,onValueChange:n=>e.onChange(e.path,t[Number(n)]),children:[(0,h.jsx)(s,{className:`h-9 min-h-9 rounded-md border-border bg-background text-sm`,children:(0,h.jsx)(o,{placeholder:`Select value`})}),(0,h.jsx)(c,{children:r.map(e=>(0,h.jsx)(l,{value:e.value,children:e.label},e.key))})]}),n===-1||e.required?null:(0,h.jsx)(i,{className:`h-9 min-h-9 rounded-md px-3 text-xs`,disabled:e.disabled,type:`button`,variant:`ghost`,onClick:()=>e.onChange(e.path,void 0),children:`Clear`})]})}let n=E(e.schema);return n===`boolean`?(0,h.jsxs)(`label`,{className:`flex min-h-9 w-fit cursor-pointer items-center gap-2 rounded-md border border-hair bg-background px-3 text-sm text-foreground`,children:[(0,h.jsx)(`input`,{checked:e.value===!0,disabled:e.disabled,type:`checkbox`,className:`h-4 w-4 accent-foreground`,onChange:t=>e.onChange(e.path,t.target.checked)}),`Enabled`]}):n===`number`||n===`integer`?(0,h.jsx)(C,{disabled:e.disabled,path:e.path,schema:e.schema,type:n,value:e.value,onChange:e.onChange}):n===`string`?(0,h.jsx)(p,{className:`h-9 rounded-md border-border bg-background text-sm`,disabled:e.disabled,type:`text`,value:typeof e.value==`string`?e.value:``,placeholder:j(e.schema),onChange:t=>{let n=t.target.value;e.onChange(e.path,n.length===0&&!e.required?void 0:n)}}):(0,h.jsx)(w,{disabled:e.disabled,path:e.path,value:e.value,onChange:e.onChange})}function C(e){let t=typeof e.value==`number`?String(e.value):``,[n,r]=(0,m.useState)(t);return(0,m.useEffect)(()=>{r(t)},[t]),(0,h.jsx)(p,{className:`h-9 rounded-md border-border bg-background text-sm`,disabled:e.disabled,inputMode:e.type===`integer`?`numeric`:`decimal`,type:`text`,value:n,placeholder:j(e.schema),onBlur:()=>{if(n.trim().length===0){r(``);return}let i=I(n,e.type);r(i.ok?String(i.value):t)},onChange:t=>{let n=t.target.value;if(r(n),n.trim().length===0){e.onChange(e.path,void 0);return}let i=I(n,e.type);i.ok&&e.onChange(e.path,i.value)}})}function w(e){let t=(0,m.useMemo)(()=>R(e.value),[e.value]),[n,r]=(0,m.useState)(t),i=(0,m.useMemo)(()=>F(n),[n]);return(0,m.useEffect)(()=>{r(t)},[t]),(0,h.jsxs)(`div`,{className:`grid gap-2`,children:[(0,h.jsx)(d,{className:`min-h-24 resize-y rounded-md border-border bg-background p-3 text-xs leading-5`,disabled:e.disabled,value:n,spellCheck:!1,onChange:t=>{let n=t.target.value;if(r(n),n.trim().length===0){e.onChange(e.path,void 0);return}let i=F(n);i.ok&&e.onChange(e.path,i.value)}}),i.ok||n.trim().length===0?null:(0,h.jsx)(`div`,{className:`rounded-md border border-status-danger-ink bg-status-danger-fill px-3 py-2 text-xs leading-5 text-destructive`,children:i.error})]})}function T(e){if(!a(e))return[];let t=e.properties;if(!a(t))return[];let n=ne(e);return Object.entries(t).map(([e,t])=>({name:e,required:n.has(e),schema:a(t)?t:{}}))}function ne(e){let t=e.required;return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`)):new Set}function E(e){let t=e.type;if(typeof t==`string`)return t;if(Array.isArray(t)){let e=t.find(e=>typeof e==`string`&&e!==`null`);if(e!==void 0)return e}return O(e).length>0?`enum`:a(e.properties)?`object`:e.items===void 0?`unknown`:`array`}function D(e){return a(e.items)?e.items:void 0}function O(e){return Array.isArray(e.enum)?e.enum:[]}function k(e,t){return typeof e.title==`string`&&e.title.length>0?e.title:U(t)}function A(e){return typeof e.description==`string`&&e.description.length>0?e.description:void 0}function j(e){return Object.hasOwn(e,`default`)?V(e.default):void 0}function M(e){if(Object.hasOwn(e,`default`))return e.default;let t=O(e);if(t.length>0)return t[0];let n=E(e);return n===`boolean`?!1:n===`integer`||n===`number`?0:n===`array`?[]:n===`object`?{}:n===`string`?``:null}function N(e,t){let n=e;for(let e of t){if(typeof e==`number`){if(!Array.isArray(n))return;n=n[e];continue}if(!a(n))return;n=n[e]}return n}function P(e,t,n){if(t.length===0)return n;let[r,...i]=t,o=Array.isArray(e)?[...e]:a(e)?{...e}:{};if(i.length===0)return n===void 0?(Array.isArray(o)&&typeof r==`number`?o.splice(r,1):!Array.isArray(o)&&typeof r==`string`&&delete o[r],o):((Array.isArray(o)&&typeof r==`number`||!Array.isArray(o)&&typeof r==`string`)&&(o[r]=n),o);let s=P(Array.isArray(o)&&typeof r==`number`||!Array.isArray(o)&&typeof r==`string`?o[r]:void 0,i,n);return(Array.isArray(o)&&typeof r==`number`||!Array.isArray(o)&&typeof r==`string`)&&(o[r]=s),o}function F(e){if(e.trim().length===0)return{ok:!0,value:void 0};try{return{ok:!0,value:JSON.parse(e)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}function I(e,t){let n=e.trim();if(n.length===0||L(n))return{ok:!1};let r=Number(n);return!Number.isFinite(r)||t===`integer`&&!Number.isInteger(r)?{ok:!1}:{ok:!0,value:r}}function L(e){return e===`-`||e===`+`||e===`.`||e===`-.`||e===`+.`||/^[+-]?\d+\.$/.test(e)||/[eE][+-]?$/.test(e)}function R(e){return e===void 0?``:z(e)}function z(e){return JSON.stringify(e,null,2)}function B(e,t){return JSON.stringify(e)===JSON.stringify(t)}function V(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):e===null?`null`:JSON.stringify(e)}function H(e){return e.join(`.`)}function U(e){return e.replace(/[_-]+/g,` `).replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/\b\w/g,e=>e.toUpperCase())}function W(e){let t=e.selectedTool===void 0?0:$(e.selectedTool.parameters);return(0,h.jsxs)(`section`,{className:`grid gap-4 border-t border-hair pt-4 xl:grid-cols-[minmax(260px,0.42fr)_minmax(0,1fr)]`,children:[(0,h.jsxs)(`div`,{className:`grid content-start gap-3`,children:[(0,h.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,h.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:`Runner`}),e.selectedTool===void 0?(0,h.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:`No tool selected`}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`p`,{className:`m-0 break-all text-sm font-semibold leading-6 text-foreground`,children:e.selectedTool.name}),(0,h.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:e.selectedTool.description})]})]}),e.selectedTool===void 0?null:(0,h.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,h.jsx)(f,{className:X(e.selectedTool),children:Z(e.selectedTool)}),(0,h.jsxs)(f,{className:J(e.selectedTool.approval.required),children:[`approval `,e.selectedTool.approval.required?`required`:`none`]}),(0,h.jsxs)(q,{children:[t,` `,t===1?`field`:`fields`]})]}),e.selectedTool?.approval.reason===void 0?null:(0,h.jsx)(`p`,{className:`m-0 border-l border-hair pl-3 text-xs leading-5 text-muted-foreground`,children:e.selectedTool.approval.reason})]}),(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-3`,children:[(0,h.jsx)(g,{disabled:e.selectedTool===void 0,schema:e.selectedTool?.parameters,value:e.argsText,onChange:e.onArgsTextChange}),(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(`span`,{className:`min-w-0 truncate text-xs text-muted-foreground`,children:`Arguments must be valid JSON.`}),(0,h.jsx)(i,{className:`h-8 min-h-8 rounded-md px-4 text-xs`,type:`button`,disabled:e.runState===`running`||e.selectedTool===void 0,onClick:e.onRun,children:e.runState===`running`?`Running`:`Run`})]}),e.runError.length>0?(0,h.jsx)(`div`,{className:`rounded-md border border-status-danger-ink bg-status-danger-fill px-3 py-2 text-xs leading-5 text-destructive`,children:e.runError}):null,e.selectedTool===void 0?null:(0,h.jsxs)(`details`,{className:`group border-t border-hair pt-3`,children:[(0,h.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[`Parameter schema`,(0,h.jsx)(`span`,{className:`font-medium normal-case tracking-normal`,children:Q(e.selectedTool.parameters)})]}),(0,h.jsx)(`div`,{className:`mt-3`,children:(0,h.jsx)(K,{value:e.selectedTool.parameters,title:`JSON schema`})})]}),e.runResponse===void 0?null:(0,h.jsx)(G,{response:e.runResponse})]})]})}function G(e){let t=Object.hasOwn(e.response,`result`),n=t?e.response.result:e.response.error,r=t?`Tool result`:`Tool error`;return(0,h.jsxs)(`div`,{className:`grid gap-3`,children:[(0,h.jsx)(K,{value:ae(n),title:r}),(0,h.jsxs)(`details`,{className:`group border-t border-hair pt-3`,children:[(0,h.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[`Raw run response`,(0,h.jsxs)(`span`,{className:`font-medium normal-case tracking-normal`,children:[e.response.status,` / `,e.response.durationMs,`ms`]})]}),(0,h.jsx)(`div`,{className:`mt-3`,children:(0,h.jsx)(K,{value:e.response,title:`Studio envelope`})})]})]})}function K(e){return(0,h.jsxs)(`section`,{className:`grid min-w-0 content-start overflow-hidden rounded-lg bg-background`,children:[(0,h.jsxs)(`div`,{className:`flex min-h-9 items-center justify-between gap-3 bg-muted px-4`,children:[(0,h.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground`,children:e.title}),(0,h.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:Q(e.value)})]}),(0,h.jsx)(`div`,{className:`min-w-0 overflow-x-auto`,children:(0,h.jsx)(`pre`,{className:`m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground`,children:(0,h.jsx)(`code`,{children:(0,h.jsx)(ee,{text:oe(e.value)})})})})]})}function q(e){return(0,h.jsx)(`span`,{className:`inline-flex min-h-7 items-center rounded-md bg-muted px-2.5 text-xs font-medium text-muted-foreground`,children:e.children})}function J(e){return e?`border-hair bg-muted text-foreground`:`border-transparent bg-transparent text-dim`}function Y(e){return e===`dynamic`?`border-hair bg-muted text-foreground`:`border-hair bg-muted text-muted-foreground`}function X(e){return e.mcpServerName===void 0?Y(e.source):`border-hair bg-muted text-foreground`}function Z(e){return e.mcpServerName===void 0?e.source:`MCP / ${e.mcpServerName}`}function Q(e){if(typeof e!=`object`||!e||Array.isArray(e))return`value`;let t=e.type;return typeof t==`string`?t:`object`}function $(e){if(typeof e!=`object`||!e||Array.isArray(e))return 0;let t=e.properties;return typeof t==`object`&&t&&!Array.isArray(t)?Object.keys(t).length:0}function re(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function ie(e){if(a(e)&&typeof e.agentId==`string`&&e.agentId.length!==0&&typeof e.toolName==`string`&&e.toolName.length!==0&&(e.status===`success`||e.status===`error`)&&!(typeof e.durationMs!=`number`||!Number.isFinite(e.durationMs))&&typeof e.startedAt==`string`&&typeof e.endedAt==`string`&&Array.isArray(e.events))return e}function ae(e){if(typeof e!=`string`)return e;let t=r(e);return t.kind===`json`?t.value:e}function oe(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}export{re as a,$ as c,Z as d,J as i,Q as l,q as n,X as o,W as r,ie as s,K as t,Y as u};
|
|
2
|
-
//# sourceMappingURL=tool-runner-
|
|
1
|
+
import{i as e,r as t,s as n}from"./dist-xrWIzsxw.js";import{g as r,t as i,y as a}from"./button-jjWFI6nO.js";import{a as o,i as s,n as c,r as l,t as u}from"./select-Bt5d0Z3n.js";import{t as d}from"./textarea-BqjRR-2a.js";import{t as f}from"./badge-MfEDrFTO.js";import{t as ee}from"./renderers-BakHuLSK.js";import{t as p}from"./input-C35vs5wD.js";var m=n(e(),1),h=t();function g(e){let[t,n]=(0,m.useState)(`form`),r=(0,m.useMemo)(()=>T(e.schema),[e.schema]),i=(0,m.useMemo)(()=>F(e.value),[e.value]),o=e.disabled===!0,s=r.length>0,c=s?t:`json`,l=i.ok&&a(i.value)?i.value:void 0;function u(t,n){let r=l??{};e.onChange(z(P(r,t,n)))}function d(t,n){let r=l??{},i=N(r,t);Array.isArray(i)&&e.onChange(z(P(r,t,i.filter((e,t)=>t!==n))))}return(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-3`,children:[(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Arguments`}),s?(0,h.jsxs)(`div`,{className:`inline-grid h-8 grid-cols-2 overflow-hidden rounded-md border border-hair bg-background p-0.5`,children:[(0,h.jsx)(_,{active:c===`form`,onClick:()=>n(`form`),children:`Form`}),(0,h.jsx)(_,{active:c===`json`,onClick:()=>n(`json`),children:`JSON`})]}):(0,h.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:`JSON`})]}),c===`json`||l===void 0?(0,h.jsx)(v,{disabled:o,error:i.ok?``:i.error,value:e.value,onChange:e.onChange}):(0,h.jsx)(`div`,{className:`grid gap-3`,children:r.map(e=>(0,h.jsx)(y,{disabled:o,field:e,path:[e.name],rootValue:l,onChange:u,onRemoveArrayItem:d},e.name))})]})}function _(e){return(0,h.jsx)(`button`,{className:e.active?`rounded-[5px] bg-muted px-3 text-xs font-semibold text-foreground`:`rounded-[5px] px-3 text-xs font-medium text-muted-foreground transition hover:text-foreground`,type:`button`,onClick:e.onClick,children:e.children})}function v(e){return(0,h.jsxs)(`div`,{className:`grid gap-2`,children:[(0,h.jsx)(d,{className:`min-h-36 resize-y rounded-md border-border bg-background p-3 text-xs leading-5`,disabled:e.disabled,value:e.value,spellCheck:!1,onChange:t=>e.onChange(t.target.value)}),e.error.length===0?null:(0,h.jsx)(`div`,{className:`rounded-md border border-status-danger-ink bg-status-danger-fill px-3 py-2 text-xs leading-5 text-destructive`,children:e.error})]})}function y(e){let t=N(e.rootValue,e.path),n=k(e.field.schema,e.field.name),r=A(e.field.schema),i=E(e.field.schema);if(i===`object`){let i=T(e.field.schema);return(0,h.jsxs)(`fieldset`,{className:`grid min-w-0 gap-3 border-b border-hair pb-3 last:border-b-0`,children:[(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(`legend`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:n}),e.field.required?(0,h.jsx)(S,{}):null]}),r===void 0?null:(0,h.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:r}),i.length===0?(0,h.jsx)(w,{disabled:e.disabled,path:e.path,value:t,onChange:e.onChange}):(0,h.jsx)(`div`,{className:`grid gap-3 border-l border-hair pl-3`,children:i.map(t=>(0,h.jsx)(y,{disabled:e.disabled,field:t,path:[...e.path,t.name],rootValue:e.rootValue,onChange:e.onChange,onRemoveArrayItem:e.onRemoveArrayItem},t.name))})]})}return i===`array`?(0,h.jsx)(b,{description:r,disabled:e.disabled,field:e.field,label:n,path:e.path,rootValue:e.rootValue,value:t,onChange:e.onChange,onRemoveArrayItem:e.onRemoveArrayItem}):(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-2 border-b border-hair pb-3 last:border-b-0`,children:[(0,h.jsx)(x,{label:n,required:e.field.required}),r===void 0?null:(0,h.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:r}),(0,h.jsx)(te,{disabled:e.disabled,path:e.path,required:e.field.required,schema:e.field.schema,value:t,onChange:e.onChange})]})}function b(e){let t=D(e.field.schema),n=Array.isArray(e.value)?e.value:[],r=n.map((t,n)=>({index:n,key:`${H(e.path)}:${n}:${V(t)}`}));return(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-3 border-b border-hair pb-3 last:border-b-0`,children:[(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(x,{label:e.label,required:e.field.required}),t===void 0?null:(0,h.jsx)(i,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,disabled:e.disabled,type:`button`,variant:`secondary`,onClick:()=>e.onChange(e.path,[...n,M(t)]),children:`Add`})]}),e.description===void 0?null:(0,h.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:e.description}),t===void 0?(0,h.jsx)(w,{disabled:e.disabled,path:e.path,value:e.value,onChange:e.onChange}):n.length===0?(0,h.jsx)(`div`,{className:`rounded-md border border-dashed border-hair px-3 py-2 text-xs text-muted-foreground`,children:`Empty array`}):(0,h.jsx)(`div`,{className:`grid gap-3 border-l border-hair pl-3`,children:r.map(n=>(0,h.jsxs)(`div`,{className:`grid gap-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,h.jsxs)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:[`Item `,n.index+1]}),(0,h.jsx)(i,{className:`h-7 min-h-7 rounded-md px-2 text-xs`,disabled:e.disabled,type:`button`,variant:`ghost`,onClick:()=>e.onRemoveArrayItem(e.path,n.index),children:`Remove`})]}),(0,h.jsx)(y,{disabled:e.disabled,field:{name:String(n.index+1),required:!0,schema:t},path:[...e.path,n.index],rootValue:e.rootValue,onChange:e.onChange,onRemoveArrayItem:e.onRemoveArrayItem})]},n.key))})]})}function x(e){return(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,h.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.label}),e.required?(0,h.jsx)(S,{}):null]})}function S(){return(0,h.jsx)(`span`,{className:`rounded-md bg-muted px-2 py-0.5 text-[11px] font-medium text-muted-foreground`,children:`required`})}function te(e){let t=O(e.schema);if(t.length>0){let n=t.findIndex(t=>B(t,e.value)),r=t.map((e,t)=>({label:V(e),value:String(t),key:`${t}:${V(e)}`}));return(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,h.jsxs)(u,{value:n===-1?``:String(n),disabled:e.disabled,onValueChange:n=>e.onChange(e.path,t[Number(n)]),children:[(0,h.jsx)(s,{className:`h-9 min-h-9 rounded-md border-border bg-background text-sm`,children:(0,h.jsx)(o,{placeholder:`Select value`})}),(0,h.jsx)(c,{children:r.map(e=>(0,h.jsx)(l,{value:e.value,children:e.label},e.key))})]}),n===-1||e.required?null:(0,h.jsx)(i,{className:`h-9 min-h-9 rounded-md px-3 text-xs`,disabled:e.disabled,type:`button`,variant:`ghost`,onClick:()=>e.onChange(e.path,void 0),children:`Clear`})]})}let n=E(e.schema);return n===`boolean`?(0,h.jsxs)(`label`,{className:`flex min-h-9 w-fit cursor-pointer items-center gap-2 rounded-md border border-hair bg-background px-3 text-sm text-foreground`,children:[(0,h.jsx)(`input`,{checked:e.value===!0,disabled:e.disabled,type:`checkbox`,className:`h-4 w-4 accent-foreground`,onChange:t=>e.onChange(e.path,t.target.checked)}),`Enabled`]}):n===`number`||n===`integer`?(0,h.jsx)(C,{disabled:e.disabled,path:e.path,schema:e.schema,type:n,value:e.value,onChange:e.onChange}):n===`string`?(0,h.jsx)(p,{className:`h-9 rounded-md border-border bg-background text-sm`,disabled:e.disabled,type:`text`,value:typeof e.value==`string`?e.value:``,placeholder:j(e.schema),onChange:t=>{let n=t.target.value;e.onChange(e.path,n.length===0&&!e.required?void 0:n)}}):(0,h.jsx)(w,{disabled:e.disabled,path:e.path,value:e.value,onChange:e.onChange})}function C(e){let t=typeof e.value==`number`?String(e.value):``,[n,r]=(0,m.useState)(t);return(0,m.useEffect)(()=>{r(t)},[t]),(0,h.jsx)(p,{className:`h-9 rounded-md border-border bg-background text-sm`,disabled:e.disabled,inputMode:e.type===`integer`?`numeric`:`decimal`,type:`text`,value:n,placeholder:j(e.schema),onBlur:()=>{if(n.trim().length===0){r(``);return}let i=I(n,e.type);r(i.ok?String(i.value):t)},onChange:t=>{let n=t.target.value;if(r(n),n.trim().length===0){e.onChange(e.path,void 0);return}let i=I(n,e.type);i.ok&&e.onChange(e.path,i.value)}})}function w(e){let t=(0,m.useMemo)(()=>R(e.value),[e.value]),[n,r]=(0,m.useState)(t),i=(0,m.useMemo)(()=>F(n),[n]);return(0,m.useEffect)(()=>{r(t)},[t]),(0,h.jsxs)(`div`,{className:`grid gap-2`,children:[(0,h.jsx)(d,{className:`min-h-24 resize-y rounded-md border-border bg-background p-3 text-xs leading-5`,disabled:e.disabled,value:n,spellCheck:!1,onChange:t=>{let n=t.target.value;if(r(n),n.trim().length===0){e.onChange(e.path,void 0);return}let i=F(n);i.ok&&e.onChange(e.path,i.value)}}),i.ok||n.trim().length===0?null:(0,h.jsx)(`div`,{className:`rounded-md border border-status-danger-ink bg-status-danger-fill px-3 py-2 text-xs leading-5 text-destructive`,children:i.error})]})}function T(e){if(!a(e))return[];let t=e.properties;if(!a(t))return[];let n=ne(e);return Object.entries(t).map(([e,t])=>({name:e,required:n.has(e),schema:a(t)?t:{}}))}function ne(e){let t=e.required;return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`)):new Set}function E(e){let t=e.type;if(typeof t==`string`)return t;if(Array.isArray(t)){let e=t.find(e=>typeof e==`string`&&e!==`null`);if(e!==void 0)return e}return O(e).length>0?`enum`:a(e.properties)?`object`:e.items===void 0?`unknown`:`array`}function D(e){return a(e.items)?e.items:void 0}function O(e){return Array.isArray(e.enum)?e.enum:[]}function k(e,t){return typeof e.title==`string`&&e.title.length>0?e.title:U(t)}function A(e){return typeof e.description==`string`&&e.description.length>0?e.description:void 0}function j(e){return Object.hasOwn(e,`default`)?V(e.default):void 0}function M(e){if(Object.hasOwn(e,`default`))return e.default;let t=O(e);if(t.length>0)return t[0];let n=E(e);return n===`boolean`?!1:n===`integer`||n===`number`?0:n===`array`?[]:n===`object`?{}:n===`string`?``:null}function N(e,t){let n=e;for(let e of t){if(typeof e==`number`){if(!Array.isArray(n))return;n=n[e];continue}if(!a(n))return;n=n[e]}return n}function P(e,t,n){if(t.length===0)return n;let[r,...i]=t,o=Array.isArray(e)?[...e]:a(e)?{...e}:{};if(i.length===0)return n===void 0?(Array.isArray(o)&&typeof r==`number`?o.splice(r,1):!Array.isArray(o)&&typeof r==`string`&&delete o[r],o):((Array.isArray(o)&&typeof r==`number`||!Array.isArray(o)&&typeof r==`string`)&&(o[r]=n),o);let s=P(Array.isArray(o)&&typeof r==`number`||!Array.isArray(o)&&typeof r==`string`?o[r]:void 0,i,n);return(Array.isArray(o)&&typeof r==`number`||!Array.isArray(o)&&typeof r==`string`)&&(o[r]=s),o}function F(e){if(e.trim().length===0)return{ok:!0,value:void 0};try{return{ok:!0,value:JSON.parse(e)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}function I(e,t){let n=e.trim();if(n.length===0||L(n))return{ok:!1};let r=Number(n);return!Number.isFinite(r)||t===`integer`&&!Number.isInteger(r)?{ok:!1}:{ok:!0,value:r}}function L(e){return e===`-`||e===`+`||e===`.`||e===`-.`||e===`+.`||/^[+-]?\d+\.$/.test(e)||/[eE][+-]?$/.test(e)}function R(e){return e===void 0?``:z(e)}function z(e){return JSON.stringify(e,null,2)}function B(e,t){return JSON.stringify(e)===JSON.stringify(t)}function V(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):e===null?`null`:JSON.stringify(e)}function H(e){return e.join(`.`)}function U(e){return e.replace(/[_-]+/g,` `).replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/\b\w/g,e=>e.toUpperCase())}function W(e){let t=e.selectedTool===void 0?0:$(e.selectedTool.parameters);return(0,h.jsxs)(`section`,{className:`grid gap-4 border-t border-hair pt-4 xl:grid-cols-[minmax(260px,0.42fr)_minmax(0,1fr)]`,children:[(0,h.jsxs)(`div`,{className:`grid content-start gap-3`,children:[(0,h.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,h.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:`Runner`}),e.selectedTool===void 0?(0,h.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:`No tool selected`}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`p`,{className:`m-0 break-all text-sm font-semibold leading-6 text-foreground`,children:e.selectedTool.name}),(0,h.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:e.selectedTool.description})]})]}),e.selectedTool===void 0?null:(0,h.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,h.jsx)(f,{className:X(e.selectedTool),children:Z(e.selectedTool)}),(0,h.jsxs)(f,{className:J(e.selectedTool.approval.required),children:[`approval `,e.selectedTool.approval.required?`required`:`none`]}),(0,h.jsxs)(q,{children:[t,` `,t===1?`field`:`fields`]})]}),e.selectedTool?.approval.reason===void 0?null:(0,h.jsx)(`p`,{className:`m-0 border-l border-hair pl-3 text-xs leading-5 text-muted-foreground`,children:e.selectedTool.approval.reason})]}),(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-3`,children:[(0,h.jsx)(g,{disabled:e.selectedTool===void 0,schema:e.selectedTool?.parameters,value:e.argsText,onChange:e.onArgsTextChange}),(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(`span`,{className:`min-w-0 truncate text-xs text-muted-foreground`,children:`Arguments must be valid JSON.`}),(0,h.jsx)(i,{className:`h-8 min-h-8 rounded-md px-4 text-xs`,type:`button`,disabled:e.runState===`running`||e.selectedTool===void 0,onClick:e.onRun,children:e.runState===`running`?`Running`:`Run`})]}),e.runError.length>0?(0,h.jsx)(`div`,{className:`rounded-md border border-status-danger-ink bg-status-danger-fill px-3 py-2 text-xs leading-5 text-destructive`,children:e.runError}):null,e.selectedTool===void 0?null:(0,h.jsxs)(`details`,{className:`group border-t border-hair pt-3`,children:[(0,h.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[`Parameter schema`,(0,h.jsx)(`span`,{className:`font-medium normal-case tracking-normal`,children:Q(e.selectedTool.parameters)})]}),(0,h.jsx)(`div`,{className:`mt-3`,children:(0,h.jsx)(K,{value:e.selectedTool.parameters,title:`JSON schema`})})]}),e.runResponse===void 0?null:(0,h.jsx)(G,{response:e.runResponse})]})]})}function G(e){let t=Object.hasOwn(e.response,`result`),n=t?e.response.result:e.response.error,r=t?`Tool result`:`Tool error`;return(0,h.jsxs)(`div`,{className:`grid gap-3`,children:[(0,h.jsx)(K,{value:ae(n),title:r}),(0,h.jsxs)(`details`,{className:`group border-t border-hair pt-3`,children:[(0,h.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[`Raw run response`,(0,h.jsxs)(`span`,{className:`font-medium normal-case tracking-normal`,children:[e.response.status,` / `,e.response.durationMs,`ms`]})]}),(0,h.jsx)(`div`,{className:`mt-3`,children:(0,h.jsx)(K,{value:e.response,title:`Studio envelope`})})]})]})}function K(e){return(0,h.jsxs)(`section`,{className:`grid min-w-0 content-start overflow-hidden rounded-lg bg-background`,children:[(0,h.jsxs)(`div`,{className:`flex min-h-9 items-center justify-between gap-3 bg-muted px-4`,children:[(0,h.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground`,children:e.title}),(0,h.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:Q(e.value)})]}),(0,h.jsx)(`div`,{className:`min-w-0 overflow-x-auto`,children:(0,h.jsx)(`pre`,{className:`m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground`,children:(0,h.jsx)(`code`,{children:(0,h.jsx)(ee,{text:oe(e.value)})})})})]})}function q(e){return(0,h.jsx)(`span`,{className:`inline-flex min-h-7 items-center rounded-md bg-muted px-2.5 text-xs font-medium text-muted-foreground`,children:e.children})}function J(e){return e?`border-hair bg-muted text-foreground`:`border-transparent bg-transparent text-dim`}function Y(e){return e===`dynamic`?`border-hair bg-muted text-foreground`:`border-hair bg-muted text-muted-foreground`}function X(e){return e.mcpServerName===void 0?Y(e.source):`border-hair bg-muted text-foreground`}function Z(e){return e.mcpServerName===void 0?e.source:`MCP / ${e.mcpServerName}`}function Q(e){if(typeof e!=`object`||!e||Array.isArray(e))return`value`;let t=e.type;return typeof t==`string`?t:`object`}function $(e){if(typeof e!=`object`||!e||Array.isArray(e))return 0;let t=e.properties;return typeof t==`object`&&t&&!Array.isArray(t)?Object.keys(t).length:0}function re(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function ie(e){if(a(e)&&typeof e.agentId==`string`&&e.agentId.length!==0&&typeof e.toolName==`string`&&e.toolName.length!==0&&(e.status===`success`||e.status===`error`)&&!(typeof e.durationMs!=`number`||!Number.isFinite(e.durationMs))&&typeof e.startedAt==`string`&&typeof e.endedAt==`string`&&Array.isArray(e.events))return e}function ae(e){if(typeof e!=`string`)return e;let t=r(e);return t.kind===`json`?t.value:e}function oe(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}export{re as a,$ as c,Z as d,J as i,Q as l,q as n,X as o,W as r,ie as s,K as t,Y as u};
|
|
2
|
+
//# sourceMappingURL=tool-runner-D3CdDSUU.js.map
|