@anvia/studio 1.1.2 → 1.2.1
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 +52 -0
- package/dist/index.d.ts +31 -4
- package/dist/index.js +19806 -626
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/ArrowClockwise.es-Dn4lp0ac.js +2 -0
- package/dist/ui/assets/{ArrowClockwise.es-5vr4h4OH.js.map → ArrowClockwise.es-Dn4lp0ac.js.map} +1 -1
- package/dist/ui/assets/Check.es-BaQZo8Jl.js +2 -0
- package/dist/ui/assets/{Check.es-DgvuCllR.js.map → Check.es-BaQZo8Jl.js.map} +1 -1
- package/dist/ui/assets/Combination-Cj4UR5tg.js +42 -0
- package/dist/ui/assets/Combination-Cj4UR5tg.js.map +1 -0
- package/dist/ui/assets/Copy.es-CU5v9Pav.js +2 -0
- package/dist/ui/assets/{Copy.es-DV7tb_eC.js.map → Copy.es-CU5v9Pav.js.map} +1 -1
- package/dist/ui/assets/MagnifyingGlass.es-C72UX0bz.js +2 -0
- package/dist/ui/assets/{MagnifyingGlass.es-yzEp9c89.js.map → MagnifyingGlass.es-C72UX0bz.js.map} +1 -1
- package/dist/ui/assets/Wrench.es-Q3fLRWow.js +2 -0
- package/dist/ui/assets/{Wrench.es-rRuP3Mrh.js.map → Wrench.es-Q3fLRWow.js.map} +1 -1
- package/dist/ui/assets/agents-page-6DCSMWnZ.js +2 -0
- package/dist/ui/assets/{agents-page-ByhvVYOx.js.map → agents-page-6DCSMWnZ.js.map} +1 -1
- package/dist/ui/assets/badge-DUs0RCHV.js +2 -0
- package/dist/ui/assets/{badge-C3fkxijh.js.map → badge-DUs0RCHV.js.map} +1 -1
- package/dist/ui/assets/button-BWxpVW85.js +2 -0
- package/dist/ui/assets/{button-B_AoswCu.js.map → button-BWxpVW85.js.map} +1 -1
- package/dist/ui/assets/dialog-DauYXFnG.js +2 -0
- package/dist/ui/assets/{dialog-BfKpnby4.js.map → dialog-DauYXFnG.js.map} +1 -1
- package/dist/ui/assets/dist-BmLOFYIW.js +2 -0
- package/dist/ui/assets/{dist-Dr6EWOhl.js.map → dist-BmLOFYIW.js.map} +1 -1
- package/dist/ui/assets/dist-CHLp-Np4.js +2 -0
- package/dist/ui/assets/dist-CHLp-Np4.js.map +1 -0
- package/dist/ui/assets/dist-DD97Shn_.js +2 -0
- package/dist/ui/assets/{dist-CUv0NHNl.js.map → dist-DD97Shn_.js.map} +1 -1
- package/dist/ui/assets/graphs-page-BA0jzknS.js +2 -0
- package/dist/ui/assets/{graphs-page-vBCjLEva.js.map → graphs-page-BA0jzknS.js.map} +1 -1
- package/dist/ui/assets/icon-ksPSRwE8.js +2 -0
- package/dist/ui/assets/{icon-DyadsXLr.js.map → icon-ksPSRwE8.js.map} +1 -1
- package/dist/ui/assets/index-DDzW7QMd.css +2 -0
- package/dist/ui/assets/{index-D7rMlAzl.js → index-Dyjst4Yt.js} +5 -5
- package/dist/ui/assets/index-Dyjst4Yt.js.map +1 -0
- package/dist/ui/assets/input-DdUxz9c8.js +2 -0
- package/dist/ui/assets/{input-DuERdYTl.js.map → input-DdUxz9c8.js.map} +1 -1
- package/dist/ui/assets/knowledge-page-BVVc4w3w.js +2 -0
- package/dist/ui/assets/{knowledge-page-ZeAUXg01.js.map → knowledge-page-BVVc4w3w.js.map} +1 -1
- package/dist/ui/assets/mcps-page-BfF4B22U.js +2 -0
- package/dist/ui/assets/{mcps-page-BSkygYJM.js.map → mcps-page-BfF4B22U.js.map} +1 -1
- package/dist/ui/assets/{memory-page-B2pWZ4in.js → memory-page-BQkt2BAW.js} +2 -2
- package/dist/ui/assets/memory-page-BQkt2BAW.js.map +1 -0
- package/dist/ui/assets/pipelines-page-Xx2kQNCI.js +2 -0
- package/dist/ui/assets/pipelines-page-Xx2kQNCI.js.map +1 -0
- package/dist/ui/assets/{renderers-DRD34eUr.js → renderers-CrjMPAR2.js} +5 -5
- package/dist/ui/assets/{renderers-DRD34eUr.js.map → renderers-CrjMPAR2.js.map} +1 -1
- package/dist/ui/assets/{request-DbgMKweq.js → request-DYxy87Kp.js} +3 -3
- package/dist/ui/assets/{request-DbgMKweq.js.map → request-DYxy87Kp.js.map} +1 -1
- package/dist/ui/assets/sandboxes-page-BwidNA5G.js +2 -0
- package/dist/ui/assets/{sandboxes-page-Bo4S4ILL.js.map → sandboxes-page-BwidNA5G.js.map} +1 -1
- package/dist/ui/assets/select-C4MbvpHr.js +2 -0
- package/dist/ui/assets/{select-BdCBnmXx.js.map → select-C4MbvpHr.js.map} +1 -1
- package/dist/ui/assets/sessions-page-C3dJDjJb.js +2 -0
- package/dist/ui/assets/{sessions-page-BMnR-r_F.js.map → sessions-page-C3dJDjJb.js.map} +1 -1
- package/dist/ui/assets/status-page-92JD9Hj8.js +2 -0
- package/dist/ui/assets/{status-page-CqmMMSo2.js.map → status-page-92JD9Hj8.js.map} +1 -1
- package/dist/ui/assets/studio-CtQdOoHK.js +2 -0
- package/dist/ui/assets/{studio-DzEdCFsX.js.map → studio-CtQdOoHK.js.map} +1 -1
- package/dist/ui/assets/style-CrHHNFw2.js +8 -0
- package/dist/ui/assets/{style-FGiH1LIC.js.map → style-CrHHNFw2.js.map} +1 -1
- package/dist/ui/assets/team-playground-GcG3j0Hl.js +2 -0
- package/dist/ui/assets/team-playground-GcG3j0Hl.js.map +1 -0
- package/dist/ui/assets/textarea-gPj9-ALc.js +2 -0
- package/dist/ui/assets/{textarea-fAtCF2cf.js.map → textarea-gPj9-ALc.js.map} +1 -1
- package/dist/ui/assets/tool-runner-xLspgGPa.js +2 -0
- package/dist/ui/assets/{tool-runner-CExWna8k.js.map → tool-runner-xLspgGPa.js.map} +1 -1
- package/dist/ui/assets/tools-page-BMyx2xRT.js +2 -0
- package/dist/ui/assets/{tools-page-CdkExqNd.js.map → tools-page-BMyx2xRT.js.map} +1 -1
- package/dist/ui/assets/trace-browser-Axd-aif6.js +4 -0
- package/dist/ui/assets/{trace-browser-Co9iS9HR.js.map → trace-browser-Axd-aif6.js.map} +1 -1
- package/dist/ui/assets/transcript-item-Bl3Yl-NT.js +3 -0
- package/dist/ui/assets/{transcript-item-D9NWsnsD.js.map → transcript-item-Bl3Yl-NT.js.map} +1 -1
- package/dist/ui/assets/with-selector-BIQdjRiO.js +2 -0
- package/dist/ui/assets/{with-selector-B8ah9Wvu.js.map → with-selector-BIQdjRiO.js.map} +1 -1
- package/dist/ui/index.html +17 -17
- package/package.json +8 -8
- package/dist/ui/assets/ArrowClockwise.es-5vr4h4OH.js +0 -2
- package/dist/ui/assets/Check.es-DgvuCllR.js +0 -2
- package/dist/ui/assets/Copy.es-DV7tb_eC.js +0 -2
- package/dist/ui/assets/MagnifyingGlass.es-yzEp9c89.js +0 -2
- package/dist/ui/assets/Wrench.es-rRuP3Mrh.js +0 -2
- package/dist/ui/assets/agents-page-ByhvVYOx.js +0 -2
- package/dist/ui/assets/badge-C3fkxijh.js +0 -2
- package/dist/ui/assets/button-B_AoswCu.js +0 -2
- package/dist/ui/assets/dialog-BfKpnby4.js +0 -2
- package/dist/ui/assets/dist-CUv0NHNl.js +0 -2
- package/dist/ui/assets/dist-Dr6EWOhl.js +0 -2
- package/dist/ui/assets/es2015-DGcxtKLK.js +0 -42
- package/dist/ui/assets/es2015-DGcxtKLK.js.map +0 -1
- package/dist/ui/assets/graphs-page-vBCjLEva.js +0 -2
- package/dist/ui/assets/icon-DyadsXLr.js +0 -2
- package/dist/ui/assets/index-BGl7eOVR.css +0 -2
- package/dist/ui/assets/index-D7rMlAzl.js.map +0 -1
- package/dist/ui/assets/input-DuERdYTl.js +0 -2
- package/dist/ui/assets/knowledge-page-ZeAUXg01.js +0 -2
- package/dist/ui/assets/mcps-page-BSkygYJM.js +0 -2
- package/dist/ui/assets/memory-page-B2pWZ4in.js.map +0 -1
- package/dist/ui/assets/pipelines-page-DAqa699J.js +0 -2
- package/dist/ui/assets/pipelines-page-DAqa699J.js.map +0 -1
- package/dist/ui/assets/sandboxes-page-Bo4S4ILL.js +0 -2
- package/dist/ui/assets/select-BdCBnmXx.js +0 -2
- package/dist/ui/assets/sessions-page-BMnR-r_F.js +0 -2
- package/dist/ui/assets/status-page-CqmMMSo2.js +0 -2
- package/dist/ui/assets/studio-DzEdCFsX.js +0 -2
- package/dist/ui/assets/style-FGiH1LIC.js +0 -8
- package/dist/ui/assets/textarea-fAtCF2cf.js +0 -2
- package/dist/ui/assets/tool-runner-CExWna8k.js +0 -2
- package/dist/ui/assets/tools-page-CdkExqNd.js +0 -2
- package/dist/ui/assets/trace-browser-Co9iS9HR.js +0 -4
- package/dist/ui/assets/transcript-item-D9NWsnsD.js +0 -3
- package/dist/ui/assets/utils-DzstcfqT.js +0 -2
- package/dist/ui/assets/utils-DzstcfqT.js.map +0 -1
- package/dist/ui/assets/with-selector-B8ah9Wvu.js +0 -2
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./utils-DzstcfqT.js";var n=e();function r({className:e,type:r,...i}){return(0,n.jsx)(`input`,{type:r,className:t(`h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base text-foreground outline-none transition-colors placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-muted disabled:opacity-50 dark:bg-transparent dark:disabled:bg-muted`,e),...i})}export{r as t};
|
|
2
|
-
//# sourceMappingURL=input-DuERdYTl.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,r as t,s as n}from"./utils-DzstcfqT.js";import{t as r,v as i}from"./button-B_AoswCu.js";import{t as a}from"./ArrowClockwise.es-5vr4h4OH.js";import{t as o}from"./icon-DyadsXLr.js";import{a as s,i as c,o as l,r as u,t as d}from"./knowledge-model-B6kRb7zc.js";import{a as f,i as p,r as m,t as h}from"./studio-DzEdCFsX.js";import{t as g}from"./badge-C3fkxijh.js";import{n as _,t as v}from"./renderers-DRD34eUr.js";var y=n(e(),1),b=t();function x(e){let t=e.source!==void 0&&e.state?.key===e.source.key?e.state:void 0;if(e.source?.source.kind===`dynamic_tools`)return(0,b.jsx)(w,{source:e.source,state:t,onLoadMore:e.onLoadMore});let n=S(e.source,t);return(0,b.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[minmax(0,1fr)_auto] overflow-hidden`,children:[(0,b.jsx)(`div`,{className:`min-h-0 overflow-auto`,children:(0,b.jsx)(`div`,{className:`pb-4 pt-0`,children:n===void 0?(0,b.jsx)(`div`,{className:`grid gap-3`,children:t?.items.map(t=>(0,b.jsx)(C,{item:t,source:e.source},`${t.kind}:${t.id}`))}):(0,b.jsx)(h,{title:n.title,text:n.text})})}),(0,b.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 border-t border-hair bg-muted py-2`,children:[(0,b.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:t===void 0?`0 loaded`:`${t.items.length} loaded`}),(0,b.jsx)(r,{className:`h-8 min-h-8`,type:`button`,variant:`secondary`,disabled:t?.loading===!0||t?.nextCursor===void 0,onClick:e.onLoadMore,children:`Load more`})]})]})}function S(e,t){if(e===void 0)return{title:`No knowledge source selected`,text:`Choose a knowledge source to inspect its stored items.`};if(t===void 0||t.loading&&t.items.length===0)return{title:`Loading items`,text:`Reading items from the selected knowledge source.`};if(t.error!==void 0)return{title:`Knowledge source error`,text:t.error};if(t.inspectable===!1)return{title:`Source unavailable`,text:t.message??`This source does not expose browseable items.`};if(t.items.length===0)return{title:`No items`,text:`The selected knowledge source is empty.`}}function C(e){return e.item.kind===`dynamic_tool`?(0,b.jsx)(`article`,{className:`rounded-none border border-hair bg-background p-4`,children:(0,b.jsx)(E,{item:e.item,source:e.source})}):(0,b.jsxs)(`article`,{className:`grid gap-3 rounded-none border border-hair bg-background p-4`,children:[(0,b.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,b.jsx)(`div`,{className:`min-w-0`,children:(0,b.jsx)(`div`,{className:`truncate text-xs font-semibold text-foreground`,children:e.item.toolName??e.item.id})}),e.item.parameterKeys===void 0||e.item.parameterKeys.length===0?null:(0,b.jsxs)(g,{children:[e.item.parameterKeys.length,` params`]})]}),e.item.description===void 0||e.item.description.length===0?null:(0,b.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]`,children:e.item.description}),e.item.text===void 0?null:(0,b.jsx)(`p`,{className:`m-0 whitespace-pre-wrap text-sm leading-6 text-foreground [overflow-wrap:anywhere]`,children:e.item.text}),e.item.document===void 0?null:(0,b.jsx)(B,{title:`Document`,value:e.item.document}),e.item.metadata===void 0?null:(0,b.jsx)(B,{title:`Metadata`,value:e.item.metadata}),e.item.parameterKeys===void 0||e.item.parameterKeys.length===0?null:(0,b.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.item.parameterKeys.map(e=>(0,b.jsx)(g,{children:e},e))})]})}function w(e){let t=e.state===void 0||e.state.loading,n=(0,y.useMemo)(()=>(e.state?.items??[]).filter(M),[e.state?.items]),[i,a]=(0,y.useState)(``),o=n.find(e=>e.id===i)??n[0],c=(0,y.useMemo)(()=>N(n),[n]);return(0,y.useEffect)(()=>{if(n.length===0){a(``);return}n.some(e=>e.id===i)||a(n[0]?.id??``)},[i,n]),(0,b.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden`,children:[(0,b.jsxs)(`header`,{className:`grid min-h-16 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 border-b border-hair py-3 max-md:grid-cols-1`,children:[(0,b.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,b.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Runtime tool index`}),(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-sm`,children:[(0,b.jsx)(`span`,{className:`font-semibold text-foreground`,children:e.source.source.label??s(e.source.source.kind)}),(0,b.jsx)(`span`,{className:`text-muted-foreground`,children:e.source.agentName})]})]}),(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,b.jsx)(F,{label:`tools`,value:n.length}),(0,b.jsx)(F,{label:`params`,value:c.parameterCount}),(0,b.jsx)(F,{label:`required`,value:c.requiredCount})]})]}),(0,b.jsxs)(`div`,{className:`grid min-h-0 grid-cols-[minmax(270px,0.34fr)_minmax(0,1fr)] overflow-hidden max-lg:grid-cols-1 max-lg:grid-rows-[minmax(220px,0.44fr)_minmax(0,1fr)]`,children:[(0,b.jsx)(`aside`,{className:`min-h-0 overflow-auto border-r border-hair pr-3 max-lg:border-b max-lg:border-r-0 max-lg:pr-0`,children:(0,b.jsxs)(`div`,{className:`grid gap-1 py-3 pr-3 max-lg:pr-0`,children:[e.source===void 0?(0,b.jsx)(V,{text:`No knowledge source selected`}):null,t&&n.length===0?(0,b.jsx)(V,{text:`Loading dynamic tools`}):null,e.state?.error===void 0?null:(0,b.jsx)(V,{text:e.state.error}),e.state?.inspectable===!1?(0,b.jsx)(V,{text:e.state.message??`This source does not expose browseable tools.`}):null,e.state?.inspectable!==!1&&!t&&n.length===0?(0,b.jsx)(V,{text:`No dynamic tools in this source`}):null,n.map(e=>(0,b.jsx)(T,{active:o?.id===e.id,item:e,onSelect:()=>a(e.id)},e.id))]})}),(0,b.jsx)(`div`,{className:`min-h-0 overflow-auto py-4 pl-5 max-lg:pl-0`,children:o===void 0?(0,b.jsx)(k,{}):(0,b.jsx)(E,{item:o,source:e.source})})]}),(0,b.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 border-t border-hair bg-background py-2`,children:[(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.state===void 0?`0 loaded`:`${e.state.items.length} loaded`}),(0,b.jsx)(r,{className:`h-8 min-h-8`,type:`button`,variant:`secondary`,disabled:t||e.state?.nextCursor===void 0,onClick:e.onLoadMore,children:`Load more`})]})]})}function T(e){let t=A(e.item),n=j(e.item),r=n.filter(e=>e.required).length,i=t.name??e.item.toolName??e.item.id;return(0,b.jsxs)(`button`,{className:[`grid min-w-0 gap-2 rounded-lg border border-transparent px-3 py-3 text-left transition duration-200 hover:border-hair hover:bg-transparent hover:text-foreground focus-visible:border-ring focus-visible:outline-none`,e.active?`border-hair bg-row-selected text-foreground`:`text-muted-foreground`].join(` `),type:`button`,onClick:e.onSelect,children:[(0,b.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,b.jsx)(`span`,{className:`min-w-0 truncate font-mono text-sm font-semibold text-foreground`,children:i}),(0,b.jsx)(`span`,{className:`shrink-0 text-xs tabular-nums text-muted-foreground`,children:n.length})]}),(0,b.jsx)(`p`,{className:`m-0 line-clamp-2 text-xs leading-5 text-muted-foreground`,children:t.description??e.item.description??`No description`}),(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2 text-[11px] font-medium text-muted-foreground`,children:[(0,b.jsxs)(`span`,{children:[r,` required`]}),(0,b.jsxs)(`span`,{children:[n.length-r,` optional`]})]})]})}function E(e){let t=A(e.item),n=j(e.item),r=t.description??e.item.description,i=t.name??e.item.toolName??e.item.id;return(0,b.jsxs)(`article`,{className:`grid min-w-0 gap-5`,children:[(0,b.jsxs)(`header`,{className:`grid gap-4 border-b border-hair pb-5`,children:[(0,b.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-4 max-md:grid`,children:[(0,b.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,b.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Selected tool`}),(0,b.jsx)(`h2`,{className:`m-0 truncate font-mono text-2xl font-semibold leading-none text-foreground`,children:i})]}),(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,b.jsxs)(g,{children:[n.length,` params`]}),(0,b.jsxs)(g,{children:[n.filter(e=>e.required).length,` required`]})]})]}),r===void 0||r.length===0?null:(0,b.jsx)(`p`,{className:`m-0 max-w-[72ch] text-base leading-7 text-muted-foreground [overflow-wrap:anywhere]`,children:r}),(0,b.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-y border-hair bg-muted px-3 py-2`,children:(0,b.jsx)(`code`,{className:`font-mono text-sm leading-6 text-foreground`,children:P(i,n)})})]}),(0,b.jsx)(D,{parameters:n}),(0,b.jsx)(O,{item:e.item,source:e.source}),e.item.document===void 0?null:(0,b.jsx)(L,{title:`Raw definition`,value:e.item.document}),e.item.metadata===void 0?null:(0,b.jsx)(L,{title:`Metadata`,value:e.item.metadata})]})}function D(e){return(0,b.jsxs)(`section`,{className:`grid gap-3`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,b.jsx)(`h3`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Parameters`}),(0,b.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:e.parameters.length===0?`No parameters`:`${e.parameters.length} defined`})]}),e.parameters.length===0?(0,b.jsx)(`div`,{className:`border-y border-dashed border-hair px-3 py-4 text-sm text-muted-foreground`,children:`This tool does not declare input parameters.`}):(0,b.jsx)(`div`,{className:`min-w-0 overflow-hidden border-y border-hair`,children:e.parameters.map(e=>(0,b.jsxs)(`div`,{className:`grid min-w-0 grid-cols-[minmax(140px,0.24fr)_minmax(96px,0.14fr)_minmax(96px,0.14fr)_minmax(0,1fr)] gap-4 border-b border-hair py-3 last:border-b-0 max-md:grid-cols-1 max-md:gap-1`,children:[(0,b.jsx)(`div`,{className:`min-w-0 font-mono text-sm font-semibold text-foreground [overflow-wrap:anywhere]`,children:e.name}),(0,b.jsx)(`div`,{className:`text-sm text-muted-foreground [overflow-wrap:anywhere]`,children:e.type}),(0,b.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:e.required?`Required`:`Optional`}),(0,b.jsx)(`div`,{className:`text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]`,children:e.description??`No description`})]},e.name))})]})}function O(e){let t=[{label:`Agent`,value:e.source?.agentName??e.source?.agentId},{label:`Source`,value:e.source===void 0?void 0:`${e.source.source.label??s(e.source.source.kind)} / ${u(e.source.source)}`},{label:`Item ID`,value:e.item.id}].filter(e=>e.value!==void 0);return t.length===0?null:(0,b.jsxs)(`section`,{className:`grid gap-3 border-t border-hair pt-4`,children:[(0,b.jsx)(`h3`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Source`}),(0,b.jsx)(`dl`,{className:`grid border-y border-hair sm:grid-cols-3 sm:divide-x sm:divide-hair`,children:t.map(e=>(0,b.jsxs)(`div`,{className:`min-w-0 px-3 py-3 first:pl-0 last:pr-0`,children:[(0,b.jsx)(`dt`,{className:`text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.label}),(0,b.jsx)(`dd`,{className:`m-0 mt-1 truncate text-sm font-medium text-foreground`,children:e.value})]},e.label))})]})}function k(){return(0,b.jsx)(h,{className:`h-full`,title:`No dynamic tool selected`,text:`Select a tool from the index to inspect its definition and parameters.`})}function A(e){let t=i(e.document)?e.document:void 0,n=i(t?.definition)?t.definition:void 0;return{name:typeof n?.name==`string`?n.name:typeof t?.toolName==`string`?t.toolName:e.toolName,description:typeof n?.description==`string`?n.description:e.description,parameters:n?.parameters}}function j(e){let t=A(e),n=i(t.parameters)?t.parameters:void 0,r=i(n?.properties)?n.properties:void 0,a=new Set(Array.isArray(n?.required)?n.required.filter(e=>typeof e==`string`):[]);return r===void 0?(e.parameterKeys??[]).map(e=>({name:e,type:`unknown`,required:!1,description:void 0})):Object.entries(r).map(([e,t])=>{let n=i(t)?t:{};return{name:e,type:I(n.type),required:a.has(e),description:typeof n.description==`string`?n.description:void 0}})}function M(e){return e.kind===`dynamic_tool`}function N(e){return e.reduce((e,t)=>{let n=j(t);return e.parameterCount+=n.length,e.requiredCount+=n.filter(e=>e.required).length,e},{parameterCount:0,requiredCount:0})}function P(e,t){return t.length===0?`${e}()`:`${e}({ ${t.map(e=>`${e.name}${e.required?``:`?`}: ${e.type}`).join(`, `)} })`}function F(e){return(0,b.jsxs)(`span`,{className:`inline-flex h-8 items-center gap-2 border border-hair bg-background px-2.5 text-xs font-medium text-muted-foreground`,children:[(0,b.jsx)(`span`,{className:`font-semibold tabular-nums text-foreground`,children:e.value}),e.label]})}function I(e){if(typeof e==`string`)return e;if(Array.isArray(e)){let t=e.filter(e=>typeof e==`string`);return t.length===0?`unknown`:t.join(` / `)}return`unknown`}function L(e){let t=R(e.value);return(0,b.jsxs)(`details`,{className:`group rounded-none border border-hair bg-card`,children:[(0,b.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-3 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground marker:hidden`,children:[(0,b.jsx)(`span`,{children:e.title}),(0,b.jsx)(`span`,{className:`text-xs normal-case tracking-normal text-muted-foreground group-open:hidden`,children:`Show`}),(0,b.jsx)(`span`,{className:`hidden text-xs normal-case tracking-normal text-muted-foreground group-open:inline`,children:`Hide`})]}),(0,b.jsx)(`div`,{className:`border-t border-hair`,children:(0,b.jsx)(`pre`,{className:`m-0 max-h-96 overflow-auto p-4 font-mono text-xs leading-5 text-foreground`,children:(0,b.jsx)(`code`,{children:(0,b.jsx)(v,{text:t})})})})]})}function R(e){try{return JSON.stringify(e,null,2)}catch{return JSON.stringify(String(e),null,2)}}function z(e){return(0,b.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background`,children:[(0,b.jsx)(`div`,{className:`border-b border-hair px-4 py-3`,children:(0,b.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,b.jsxs)(`div`,{className:`min-w-0`,children:[(0,b.jsx)(`h2`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:`Retrieval log`}),(0,b.jsx)(`p`,{className:`m-0 mt-1 truncate text-xs text-muted-foreground`,children:`traces / retrieval-evidence`})]}),(0,b.jsxs)(g,{children:[e.evidence.length,` entries`]})]})}),(0,b.jsxs)(`div`,{className:`min-h-0 overflow-auto p-4`,children:[e.evidence.length===0?(0,b.jsx)(h,{className:`h-full`,title:`No retrieval evidence`,text:`Retrieval activity will appear here after an agent queries a knowledge source.`}):null,(0,b.jsx)(`div`,{className:`grid gap-3`,children:e.evidence.map(t=>(0,b.jsxs)(`article`,{className:`grid gap-3 rounded-none border border-hair bg-background p-3`,children:[(0,b.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,b.jsxs)(`div`,{className:`min-w-0`,children:[(0,b.jsx)(`div`,{className:`truncate text-sm font-semibold text-foreground`,children:t.observationName}),(0,b.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Turn `,t.turn]})]}),(0,b.jsx)(r,{className:`h-auto min-h-0 rounded-lg border border-border bg-muted px-2 py-1 text-xs text-muted-foreground`,type:`button`,variant:`ghost`,onClick:()=>e.onOpenTrace(t.traceId),children:`Trace`})]}),(0,b.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,b.jsxs)(g,{children:[t.documentCount,` docs`]}),(0,b.jsxs)(g,{children:[t.toolCount,` tools`]})]}),t.query===void 0?null:(0,b.jsxs)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]`,children:[(0,b.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.14em] text-foreground`,children:`Query`}),` `,t.query]}),t.documents.slice(0,2).map(e=>(0,b.jsxs)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground [overflow-wrap:anywhere]`,children:[(0,b.jsx)(`span`,{className:` text-foreground`,children:e.id??`document`}),` `,e.text??``]},`${e.id??`doc`}:${e.text??``}`)),t.tools.length===0?null:(0,b.jsxs)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:[`Tools: `,t.tools.join(`, `)]})]},`${t.traceId}:${t.observationId}`))})]})]})}function B(e){return(0,b.jsxs)(`div`,{className:`grid gap-2 border-t border-hair pt-3`,children:[(0,b.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.title}),(0,b.jsx)(_,{value:e.value})]})}function V(e){return(0,b.jsx)(`div`,{className:`rounded-lg border border-dashed border-border px-4 py-3 text-sm font-medium text-muted-foreground`,children:e.text})}function H(e){let[t,n]=(0,y.useState)(``),[i,s]=(0,y.useState)(),g=(0,y.useMemo)(()=>e.summary?.agents??[],[e.summary]),_=e.summary?.evidence??[],v=(0,y.useMemo)(()=>d(g),[g]),S=c(e.activeTab),C=(0,y.useMemo)(()=>S===void 0?[]:v.filter(e=>e.source.kind===S),[S,v]),w=C.find(e=>e.key===t)??C[0],T=W({activeTab:e.activeTab,enabled:e.enabled,evidenceCount:_.length,loading:e.loading,sourceCount:C.length});(0,y.useEffect)(()=>{if(C.length===0){n(``);return}if(C.some(e=>e.key===t))return;let e=C.find(e=>e.source.inspectable===!0&&(e.source.itemCount??0)>0)??C.find(e=>e.source.inspectable===!0)??C[0];n(e?.key??``)},[t,C]);let E=(0,y.useCallback)(async(e,t)=>{let n=e.key;s(r=>{let i={key:n,loading:!0,inspectable:r?.key===n?r.inspectable:e.source.inspectable===!0,items:t.append&&r?.key===n?r.items:[]};return t.append&&r?.key===n&&r.nextCursor!==void 0&&(i.nextCursor=r.nextCursor),r?.key===n&&r.totalCount!==void 0&&(i.totalCount=r.totalCount),i});try{let r=new URLSearchParams({agentId:e.agentId,sourceId:u(e.source),limit:`50`});t.cursor!==void 0&&r.set(`cursor`,t.cursor);let i=await fetch(`/knowledge/items?${r.toString()}`);if(!i.ok)throw Error(`Knowledge items failed with HTTP ${i.status}`);let a=await i.json();s(e=>{if(e?.key!==n)return e;let r={key:n,loading:!1,inspectable:a.inspectable,items:t.append?[...e.items,...a.items]:a.items};return a.nextCursor!==void 0&&(r.nextCursor=a.nextCursor),a.totalCount!==void 0&&(r.totalCount=a.totalCount),a.message!==void 0&&(r.message=a.message),r})}catch(e){s(t=>t?.key===n?{key:n,loading:!1,inspectable:t.inspectable,items:t.items,error:e instanceof Error?e.message:String(e)}:t)}},[]);return(0,y.useEffect)(()=>{if(!e.enabled||w===void 0){s(void 0);return}E(w,{append:!1})},[E,e.enabled,w]),(0,b.jsxs)(f,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":l(e.activeTab),children:[(0,b.jsx)(p,{title:l(e.activeTab),description:G(e.activeTab),action:(0,b.jsxs)(r,{className:`h-8 min-h-8 gap-2`,type:`button`,variant:`secondary`,disabled:!e.enabled,onClick:e.onRefresh,children:[(0,b.jsx)(o,{icon:a,"aria-hidden":`true`}),`Refresh`]})}),(0,b.jsx)(m,{className:`grid grid-rows-[minmax(0,1fr)] overflow-hidden`,children:T===void 0?e.activeTab===`retrieval-log`?(0,b.jsx)(z,{evidence:_,onOpenTrace:e.onOpenTrace}):(0,b.jsx)(U,{sources:C,selectedKey:w?.key??``,activeTab:e.activeTab,onSelect:n,children:(0,b.jsx)(x,{source:w,state:i,onLoadMore:()=>{w!==void 0&&E(w,i?.nextCursor===void 0?{append:!0}:{append:!0,cursor:i.nextCursor})}})}):(0,b.jsx)(h,{className:`h-full`,title:T.title,text:T.text})})]})}function U(e){let t=e.sources.length>1;return(0,b.jsxs)(`div`,{className:[`grid min-h-0 gap-3 overflow-hidden`,t?`grid-rows-[auto_minmax(0,1fr)]`:`grid-rows-[minmax(0,1fr)]`].join(` `),children:[t?(0,b.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-b border-hair`,children:(0,b.jsxs)(`div`,{className:`flex min-h-11 min-w-max items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`mr-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:l(e.activeTab)}),e.sources.map(t=>(0,b.jsxs)(`button`,{className:[`flex h-7 items-center gap-2 rounded-lg border border-hair bg-background px-2.5 text-xs font-semibold text-muted-foreground transition duration-200 hover:border-foreground hover:bg-transparent hover:text-foreground focus-visible:border-ring focus-visible:outline-none`,e.selectedKey===t.key?`border-hair bg-muted text-foreground`:``].join(` `),type:`button`,onClick:()=>e.onSelect(t.key),children:[(0,b.jsx)(`span`,{children:t.source.label??s(t.source.kind)}),t.source.itemCount===void 0?null:(0,b.jsx)(`span`,{className:`text-muted-foreground`,children:t.source.itemCount})]},t.key))]})}):null,e.children]})}function W(e){let t=l(e.activeTab);if(!e.enabled)return{title:`${t} unavailable`,text:`This Studio runtime does not expose knowledge inspection.`};let n=e.activeTab===`retrieval-log`?e.evidenceCount:e.sourceCount;if(e.loading&&n===0)return{title:`Loading ${t.toLowerCase()}`,text:`Reading knowledge metadata.`};if(!(n>0))switch(e.activeTab){case`retrieval-log`:return{title:`No retrieval evidence`,text:`Retrieval activity will appear here after an agent queries a knowledge source.`};case`static-context`:return{title:`No static context`,text:`No static context sources are registered in this Studio runtime.`};case`dynamic-context`:return{title:`No dynamic context`,text:`No dynamic context sources are registered in this Studio runtime.`};case`dynamic-tools`:return{title:`No dynamic tools`,text:`No dynamic tool sources are registered in this Studio runtime.`}}}function G(e){switch(e){case`static-context`:return`Browse configured static context exposed to agents.`;case`dynamic-context`:return`Inspect dynamic context chunks resolved at runtime.`;case`dynamic-tools`:return`Review dynamic tool definitions and parameters.`;case`retrieval-log`:return`Inspect retrieval evidence and jump into related traces.`}}export{H as KnowledgePage};
|
|
2
|
-
//# sourceMappingURL=knowledge-page-ZeAUXg01.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,r as t,s as n}from"./utils-DzstcfqT.js";import{t as r}from"./button-B_AoswCu.js";import{a as i,i as a,n as o,r as s,t as c}from"./select-BdCBnmXx.js";import{a as l,i as u,n as d,r as f,t as p}from"./studio-DzEdCFsX.js";import{t as m}from"./badge-C3fkxijh.js";import{a as h,c as g,r as _,s as v,t as y,u as b}from"./tool-runner-CExWna8k.js";var x=n(e(),1),S=t();function C(e){let t=e.agents.find(t=>t.id===e.selectedAgentId)??e.agents[0],n=(0,x.useMemo)(()=>e.summary?.servers??[],[e.summary]),r=n.reduce((e,t)=>e+t.toolCount,0),m=(0,x.useMemo)(()=>E(n),[n]),[g,y]=(0,x.useState)(``),[b,C]=(0,x.useState)(`{}`),[T,D]=(0,x.useState)(`idle`),[O,k]=(0,x.useState)(),[A,j]=(0,x.useState)(``),M=(0,x.useMemo)(()=>m.find(e=>e.key===g)??m[0],[m,g]),N=(0,x.useRef)(``),P=(0,x.useRef)(0);(0,x.useEffect)(()=>{if(m.length===0){y(``);return}m.some(e=>e.key===g)||y(m[0]?.key??``)},[m,g]),(0,x.useEffect)(()=>{let e=M?.key??``;N.current!==e&&(N.current=e,P.current+=1,C(`{}`),D(`idle`),j(``),k(void 0))},[M]);async function F(){if(M===void 0)return;let e;try{e=JSON.parse(b)}catch(e){j(e instanceof Error?e.message:String(e)),k(void 0);return}D(`running`),j(``),k(void 0);let t=M.key,n=P.current+1;P.current=n;let r=()=>P.current===n&&N.current===t;try{let t=await fetch(`/agents/${encodeURIComponent(M.agentId)}/tools/${encodeURIComponent(M.name)}/runs`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({args:e})}),n=await t.json();if(!r())return;let i=v(n);if(i===void 0){j(`Unexpected Studio tool run response: ${h(n)}`);return}k(i),(!t.ok||i.status===`error`)&&j(h(i.error??i))}catch(e){r()&&j(e instanceof Error?e.message:String(e))}finally{r()&&D(`idle`)}}return(0,S.jsxs)(l,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":`MCPs`,children:[(0,S.jsx)(u,{title:`MCPs`,description:`MCP servers and remote tools registered on Studio agents, grouped by server.`,action:(0,S.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center justify-end gap-2 max-sm:justify-start`,children:[(0,S.jsx)(d,{label:`servers`,value:n.length}),(0,S.jsx)(d,{label:`tools`,value:r}),e.agents.length>1?(0,S.jsxs)(c,{value:t?.id??``,onValueChange:e.onSelectAgent,children:[(0,S.jsx)(a,{className:`h-8 min-h-8 w-64 rounded-md border-border text-xs max-sm:w-full`,children:(0,S.jsx)(i,{placeholder:`Agent`})}),(0,S.jsx)(o,{align:`end`,children:e.agents.map(e=>(0,S.jsx)(s,{value:e.id,children:e.name??e.id},e.id))})]}):null]})}),(0,S.jsx)(f,{className:`overflow-auto`,children:e.enabled?e.loading?(0,S.jsx)(p,{title:`Loading MCPs`,text:`Reading registered MCP metadata.`}):n.length===0?(0,S.jsx)(p,{title:`No MCPs`,text:`The selected agent has no registered MCP tools.`}):(0,S.jsxs)(`div`,{className:`grid w-full gap-5`,children:[n.map(e=>(0,S.jsx)(w,{selectedToolKey:M?.key??``,server:e,onSelectTool:y},e.name)),m.length===0?null:(0,S.jsx)(_,{argsText:b,runError:A,runResponse:O,runState:T,selectedTool:M,onArgsTextChange:C,onRun:()=>void F()})]}):(0,S.jsx)(p,{title:`MCPs unavailable`,text:`No registered Studio agent exposes MCP tools.`})})]})}function w(e){return(0,S.jsxs)(`section`,{className:`overflow-hidden border-t`,children:[(0,S.jsxs)(`header`,{className:`grid min-h-14 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 border-b bg-muted px-4`,children:[(0,S.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,S.jsx)(`h2`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:e.server.name}),(0,S.jsx)(`span`,{className:`truncate text-xs font-medium text-muted-foreground`,children:e.server.agentId})]}),(0,S.jsxs)(m,{className:`border-hair bg-background text-muted-foreground`,children:[e.server.toolCount,` tools`]})]}),(0,S.jsx)(`div`,{className:`mt-1 grid gap-1`,children:e.server.tools.map(t=>(0,S.jsx)(T,{serverName:e.server.name,active:e.selectedToolKey===D(e.server.name,t),tool:t,onSelectTool:e.onSelectTool},`${t.source}:${t.name}`))})]})}function T(e){let t=D(e.serverName,e.tool);return(0,S.jsxs)(`article`,{className:`grid grid-cols-[minmax(300px,0.75fr)_minmax(0,1fr)] gap-2 rounded-lg border border-transparent bg-background p-2 transition duration-200 hover:border-hair hover:bg-transparent max-lg:grid-cols-1`,children:[(0,S.jsxs)(`div`,{className:`grid content-start gap-4 rounded-lg bg-card p-3`,children:[(0,S.jsxs)(`div`,{className:`grid gap-1`,children:[(0,S.jsx)(`h3`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:e.tool.name}),(0,S.jsx)(`span`,{className:` text-xs font-medium text-muted-foreground`,children:e.tool.source})]}),(0,S.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:e.tool.description}),(0,S.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,S.jsx)(m,{className:b(e.tool.source),children:e.tool.source}),(0,S.jsxs)(m,{className:`border-hair bg-transparent text-muted-foreground`,children:[g(e.tool.parameters),` fields`]})]}),(0,S.jsx)(r,{className:`h-8 min-h-8 w-fit rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,onClick:()=>e.onSelectTool(t),children:e.active?`Selected`:`Use`})]}),(0,S.jsx)(y,{value:e.tool.parameters,title:`Parameter schema`})]})}function E(e){return e.flatMap(e=>e.tools.map(t=>({key:D(e.name,t),agentId:e.agentId,name:t.name,description:t.description,parameters:t.parameters,source:t.source,mcpServerName:e.name,approval:t.approval})))}function D(e,t){return`${e}:${t.source}:${t.name}`}export{C as McpsPage};
|
|
2
|
-
//# sourceMappingURL=mcps-page-BSkygYJM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory-page-B2pWZ4in.js","names":[],"sources":["../../../../core/dist/chunk-OI3LSMJG.js","../../../src/ui/app/modules/memory/memory-generation-ledger.tsx","../../../src/ui/app/modules/memory/memory-page.tsx"],"sourcesContent":["import {\n assertJsonObject\n} from \"./chunk-7JLAIN6E.js\";\nimport {\n parseMessage,\n parseMessages,\n toProviderJsonSchema\n} from \"./chunk-QGX73TSQ.js\";\nimport {\n isJsonValue\n} from \"./chunk-3XQGVDU5.js\";\nimport {\n abortError,\n completionProviderOutputErrorUsage,\n resolveRetryOptions,\n retryDelayMs,\n retryOptionsForFailure,\n throwIfAborted,\n waitForRetry\n} from \"./chunk-3RWESPUG.js\";\n\n// src/completion/types.ts\nfunction reasoningDisplayText(reasoning) {\n const details = \"type\" in reasoning ? reasoning.details : reasoning;\n if (details === void 0) {\n return \"type\" in reasoning ? reasoning.text : \"\";\n }\n return details.flatMap((item) => {\n if (item.type === \"text\" || item.type === \"summary\") {\n return [item.text];\n }\n return [];\n }).join(\"\");\n}\nfunction isProviderTool(value) {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const candidate = value;\n return candidate.kind === \"provider\" && typeof candidate.provider === \"string\" && candidate.provider.trim().length > 0 && typeof candidate.name === \"string\" && candidate.name.trim().length > 0 && (candidate.configuration === void 0 || typeof candidate.configuration === \"object\" && candidate.configuration !== null && !Array.isArray(candidate.configuration) && isJsonValue(candidate.configuration));\n}\nfunction calculateContextUsage(usage, model) {\n if (model === void 0 || !Number.isFinite(usage.inputTokens) || usage.inputTokens <= 0 || !Number.isFinite(model.context.contextWindow) || model.context.contextWindow <= 0) {\n return void 0;\n }\n const usedTokens = Math.max(0, usage.inputTokens);\n const remainingTokens = Math.max(0, model.context.contextWindow - usedTokens);\n const usedPercent = Math.min(100, usedTokens / model.context.contextWindow * 100);\n return {\n model,\n usedTokens,\n remainingTokens,\n usedPercent,\n remainingPercent: 100 - usedPercent\n };\n}\nfunction withContextUsage(response, model) {\n const contextUsage = calculateContextUsage(response.usage, model);\n return contextUsage === void 0 ? response : { ...response, contextUsage };\n}\nfunction resolveModelContextLimits(modelId, catalog, override) {\n return override ?? catalog[modelId];\n}\nvar Usage = {\n empty() {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n cachedInputTokens: 0,\n cacheCreationInputTokens: 0\n };\n },\n add(left, right) {\n const result = {\n inputTokens: left.inputTokens + right.inputTokens,\n outputTokens: left.outputTokens + right.outputTokens,\n totalTokens: left.totalTokens + right.totalTokens,\n cachedInputTokens: left.cachedInputTokens + right.cachedInputTokens,\n cacheCreationInputTokens: left.cacheCreationInputTokens + right.cacheCreationInputTokens\n };\n const details = addUsageDetails(left, right);\n if (details !== void 0) {\n result.details = details;\n }\n return result;\n },\n isEmpty(usage) {\n return isEmptyUsage(usage) && (usage.details === void 0 || Object.values(usage.details).every((value) => value === 0));\n }\n};\nfunction addUsageDetails(left, right) {\n if (isEmptyUsage(left) && left.details === void 0) {\n return right.details === void 0 ? void 0 : { ...right.details };\n }\n if (isEmptyUsage(right) && right.details === void 0) {\n return left.details === void 0 ? void 0 : { ...left.details };\n }\n if (left.details === void 0 || right.details === void 0) {\n return void 0;\n }\n const details = { ...left.details };\n for (const [key, value] of Object.entries(right.details)) {\n details[key] = (details[key] ?? 0) + value;\n }\n return details;\n}\nfunction isEmptyUsage(usage) {\n return usage.inputTokens === 0 && usage.outputTokens === 0 && usage.totalTokens === 0 && usage.cachedInputTokens === 0 && usage.cacheCreationInputTokens === 0;\n}\nfunction getAssistantGenerationMetadata(message) {\n if (message.role !== \"assistant\" || !isJsonObjectValue(message.metadata)) {\n return void 0;\n }\n const frameworkMetadata = message.metadata.anvia;\n if (!isJsonObjectValue(frameworkMetadata)) {\n return void 0;\n }\n const generation = frameworkMetadata.generation;\n if (!isJsonObjectValue(generation) || typeof generation.provider !== \"string\" || typeof generation.modelId !== \"string\" || !isUsageValue(generation.usage)) {\n return void 0;\n }\n let usage = { ...generation.usage };\n if (generation.usage.details !== void 0) {\n usage = { ...usage, details: { ...generation.usage.details } };\n }\n const metadata = {\n provider: generation.provider,\n modelId: generation.modelId,\n usage\n };\n if (isCompletionFinishReason(generation.finishReason)) {\n metadata.finishReason = generation.finishReason;\n }\n if (typeof generation.providerFinishReason === \"string\") {\n metadata.providerFinishReason = generation.providerFinishReason;\n }\n if (isContextUsageValue(generation.contextUsage)) {\n metadata.contextUsage = {\n ...generation.contextUsage,\n model: {\n ...generation.contextUsage.model,\n context: { ...generation.contextUsage.model.context }\n }\n };\n }\n if (isCompletionSourceArray(generation.sources)) {\n metadata.sources = generation.sources.map((source) => ({ ...source }));\n }\n if (isProviderToolCallArray(generation.providerToolCalls)) {\n metadata.providerToolCalls = generation.providerToolCalls.map((toolCall) => {\n let copy = { ...toolCall };\n if (toolCall.details !== void 0) {\n copy = { ...copy, details: { ...toolCall.details } };\n }\n return copy;\n });\n }\n return metadata;\n}\nfunction isJsonObjectValue(value) {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction isContextUsageValue(value) {\n if (!isJsonObjectValue(value) || !isJsonObjectValue(value.model)) {\n return false;\n }\n const context = value.model.context;\n if (typeof value.model.modelId === \"string\" && isJsonObjectValue(context) && isPositiveFiniteNumber(context.contextWindow) && isOptionalPositiveFiniteNumber(context.maxInputTokens) && isOptionalPositiveFiniteNumber(context.maxOutputTokens) && isNonnegativeFiniteNumber(value.usedTokens) && isNonnegativeFiniteNumber(value.remainingTokens) && isPercentage(value.usedPercent) && isPercentage(value.remainingPercent)) {\n const contextWindow = context.contextWindow;\n const remainingTokens = Math.max(0, contextWindow - value.usedTokens);\n const usedPercent = Math.min(100, value.usedTokens / contextWindow * 100);\n const remainingPercent = remainingTokens / contextWindow * 100;\n return value.remainingTokens === remainingTokens && approximatelyEqual(value.usedPercent, usedPercent) && approximatelyEqual(value.remainingPercent, remainingPercent);\n }\n return false;\n}\nfunction approximatelyEqual(left, right) {\n const scale = Math.max(1, Math.abs(left), Math.abs(right));\n return Math.abs(left - right) <= Number.EPSILON * scale * 8;\n}\nfunction isPositiveFiniteNumber(value) {\n return isNonnegativeFiniteNumber(value) && value > 0;\n}\nfunction isOptionalPositiveFiniteNumber(value) {\n return value === void 0 || isPositiveFiniteNumber(value);\n}\nfunction isPercentage(value) {\n return isNonnegativeFiniteNumber(value) && value <= 100;\n}\nfunction isUsageValue(value) {\n if (!isJsonObjectValue(value)) {\n return false;\n }\n return isNonnegativeFiniteNumber(value.inputTokens) && isNonnegativeFiniteNumber(value.outputTokens) && isNonnegativeFiniteNumber(value.totalTokens) && isNonnegativeFiniteNumber(value.cachedInputTokens) && isNonnegativeFiniteNumber(value.cacheCreationInputTokens) && isUsageDetailsValue(value.details);\n}\nfunction isNonnegativeFiniteNumber(value) {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\nfunction isUsageDetailsValue(value) {\n if (value === void 0) {\n return true;\n }\n if (!isJsonObjectValue(value)) {\n return false;\n }\n let total;\n let bucketSum = 0;\n for (const [key, detail] of Object.entries(value)) {\n if (detail === void 0 || !isNonnegativeFiniteNumber(detail)) {\n return false;\n }\n if (key === \"total\") {\n total = detail;\n } else {\n bucketSum += detail;\n }\n }\n return total !== void 0 && total === bucketSum;\n}\nfunction isCompletionSourceArray(value) {\n return Array.isArray(value) && value.every(\n (source) => isJsonObjectValue(source) && source.type === \"url\" && typeof source.url === \"string\" && (source.title === void 0 || typeof source.title === \"string\") && (source.id === void 0 || typeof source.id === \"string\") && (source.startIndex === void 0 || typeof source.startIndex === \"number\") && (source.endIndex === void 0 || typeof source.endIndex === \"number\")\n );\n}\nfunction isProviderToolCallArray(value) {\n return Array.isArray(value) && value.every(\n (toolCall) => isJsonObjectValue(toolCall) && typeof toolCall.id === \"string\" && typeof toolCall.name === \"string\" && (toolCall.status === void 0 || typeof toolCall.status === \"string\") && (toolCall.details === void 0 || isJsonObjectValue(toolCall.details))\n );\n}\nfunction isCompletionFinishReason(value) {\n return value === \"stop\" || value === \"length\" || value === \"content-filter\" || value === \"tool-calls\" || value === \"other\";\n}\nvar CompletionCapabilityError = class extends Error {\n constructor(message) {\n super(message);\n this.name = \"CompletionCapabilityError\";\n }\n};\nfunction assertCompletionRequestSupported(model, request, options = {}) {\n const modelLabel = `${model.provider}:${model.modelId}`;\n const capabilities = model.capabilities;\n assertCompletionControlsSupported(model, request.controls);\n if (options.streaming === true && !capabilities.streaming) {\n throw new CompletionCapabilityError(`${modelLabel} does not support streaming completions.`);\n }\n if (request.tools.length > 0 && !capabilities.tools) {\n throw new CompletionCapabilityError(`${modelLabel} does not support tool definitions.`);\n }\n if ((request.providerTools?.length ?? 0) > 0 && capabilities.providerTools !== true) {\n throw new CompletionCapabilityError(`${modelLabel} does not support provider-executed tools.`);\n }\n if (request.toolChoice !== void 0 && !capabilities.toolChoice) {\n throw new CompletionCapabilityError(`${modelLabel} does not support tool choice.`);\n }\n if (request.outputSchema !== void 0 && !capabilities.outputSchema) {\n throw new CompletionCapabilityError(`${modelLabel} does not support output schemas.`);\n }\n if (!capabilities.imageInput && requestHasImageInput(request)) {\n throw new CompletionCapabilityError(`${modelLabel} does not support image input.`);\n }\n if (!capabilities.documentInput && requestHasFileDocumentInput(request)) {\n throw new CompletionCapabilityError(`${modelLabel} does not support document file input.`);\n }\n}\nfunction assertCompletionControlsSupported(model, controls) {\n const modelLabel = `${model.provider}:${model.modelId}`;\n for (const [controlId, value] of Object.entries(controls ?? {})) {\n if (value === void 0) continue;\n const modelControls = model.controls;\n const control = modelControls !== void 0 && Object.hasOwn(modelControls, controlId) ? modelControls[controlId] : void 0;\n if (control === void 0) {\n throw new CompletionCapabilityError(\n `${modelLabel} does not support completion control \"${controlId}\".`\n );\n }\n if (!control.options.includes(value)) {\n throw new CompletionCapabilityError(\n `${modelLabel} completion control \"${controlId}\" does not support value \"${value}\".`\n );\n }\n }\n}\nfunction textFromAssistantContent(content) {\n return content.flatMap((item) => item.type === \"text\" ? [item.text] : []).join(\"\\n\");\n}\nfunction requestHasImageInput(request) {\n return request.chatHistory.some(\n (message) => message.role === \"system\" || typeof message.content === \"string\" ? false : message.content.some((content) => content.type === \"image\")\n );\n}\nfunction requestHasFileDocumentInput(request) {\n return request.chatHistory.some(\n (message) => message.role === \"user\" && typeof message.content !== \"string\" ? message.content.some((content) => content.type === \"file\" && content.data.type !== \"text\") : false\n );\n}\n\n// src/completion/provider-output-error.ts\nvar COMPLETION_PROVIDER_OUTPUT_ERROR_CODE = \"ANVIA_COMPLETION_PROVIDER_OUTPUT\";\nvar PROVIDER_OUTPUT_ERROR_KINDS = /* @__PURE__ */ new Set([\n \"malformed-tool-arguments\",\n \"invalid-tool-arguments\",\n \"invalid-stream-event\",\n \"invalid-response\",\n \"incomplete-stream\",\n \"incomplete-tool-call\",\n \"invalid-tool-call\",\n \"truncated-tool-call\",\n \"filtered-tool-call\"\n]);\nvar CompletionProviderOutputError = class extends Error {\n code = COMPLETION_PROVIDER_OUTPUT_ERROR_CODE;\n kind;\n toolCallId;\n finishReason;\n usage;\n constructor(options) {\n assertProviderOutputErrorOptions(options);\n super(providerOutputErrorMessage(options.kind, options.toolCallId));\n this.name = \"CompletionProviderOutputError\";\n this.kind = options.kind;\n this.toolCallId = options.toolCallId;\n this.finishReason = options.finishReason;\n this.usage = options.usage === void 0 ? void 0 : copyUsage(options.usage);\n }\n};\nfunction assertCompletionResponseIntegrity(options) {\n const { response } = options;\n const toolCalls = response.choice.filter(\n (content) => content.type === \"tool-call\"\n );\n if (toolCalls.length > 0) {\n if (response.finishReason !== void 0 && !isCompletionFinishReason2(response.finishReason)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n usage: response.usage\n });\n }\n if (response.finishReason === \"length\") {\n throw new CompletionProviderOutputError({\n kind: \"truncated-tool-call\",\n finishReason: response.finishReason,\n usage: response.usage\n });\n }\n if (response.finishReason === \"content-filter\") {\n throw new CompletionProviderOutputError({\n kind: \"filtered-tool-call\",\n finishReason: response.finishReason,\n usage: response.usage\n });\n }\n if (response.finishReason === \"other\") {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n finishReason: response.finishReason,\n usage: response.usage\n });\n }\n } else if (response.finishReason === \"tool-calls\") {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n finishReason: response.finishReason,\n usage: response.usage\n });\n }\n const toolCallIds = /* @__PURE__ */ new Set();\n const callIds = /* @__PURE__ */ new Set();\n for (const toolCall of toolCalls) {\n if (!isNonblankString(toolCall.toolCallId) || !isNonblankString(toolCall.toolName)) {\n throw invalidToolCall(toolCall.toolCallId, response.usage);\n }\n if (toolCall.callId !== void 0 && !isNonblankString(toolCall.callId)) {\n throw invalidToolCall(toolCall.toolCallId, response.usage);\n }\n if (toolCallIds.has(toolCall.toolCallId)) {\n throw invalidToolCall(toolCall.toolCallId, response.usage);\n }\n toolCallIds.add(toolCall.toolCallId);\n if (toolCall.callId !== void 0) {\n if (callIds.has(toolCall.callId)) {\n throw invalidToolCall(toolCall.toolCallId, response.usage);\n }\n callIds.add(toolCall.callId);\n }\n if (!isJsonValue(toolCall.input)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-arguments\",\n toolCallId: toolCall.toolCallId,\n usage: response.usage\n });\n }\n }\n}\nfunction invalidToolCall(toolCallId, usage) {\n return new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: isNonblankString(toolCallId) ? toolCallId : void 0,\n usage\n });\n}\nfunction assertProviderOutputErrorOptions(options) {\n if (typeof options !== \"object\" || options === null) {\n throw new TypeError(\"CompletionProviderOutputError options must be an object.\");\n }\n if (!PROVIDER_OUTPUT_ERROR_KINDS.has(options.kind)) {\n throw new TypeError(\"CompletionProviderOutputError kind is invalid.\");\n }\n if (options.toolCallId !== void 0 && !isNonblankString(options.toolCallId)) {\n throw new TypeError(\"CompletionProviderOutputError toolCallId must be a non-empty string.\");\n }\n if (options.finishReason !== void 0 && !isCompletionFinishReason2(options.finishReason)) {\n throw new TypeError(\"CompletionProviderOutputError finishReason is invalid.\");\n }\n if (options.kind === \"truncated-tool-call\" && options.finishReason !== \"length\") {\n throw new TypeError('CompletionProviderOutputError truncated-tool-call requires \"length\".');\n }\n if (options.kind === \"filtered-tool-call\" && options.finishReason !== \"content-filter\") {\n throw new TypeError(\n 'CompletionProviderOutputError filtered-tool-call requires \"content-filter\".'\n );\n }\n if (options.finishReason === \"length\" && options.kind !== \"truncated-tool-call\") {\n throw new TypeError(\n 'CompletionProviderOutputError finishReason \"length\" requires truncated-tool-call.'\n );\n }\n if (options.finishReason === \"content-filter\" && options.kind !== \"filtered-tool-call\") {\n throw new TypeError(\n 'CompletionProviderOutputError finishReason \"content-filter\" requires filtered-tool-call.'\n );\n }\n if (options.usage !== void 0) {\n assertUsage(options.usage);\n }\n}\nfunction providerOutputErrorMessage(kind, toolCallId) {\n const toolCall = toolCallId === void 0 ? \"tool call\" : `tool call ${JSON.stringify(displayId(toolCallId))}`;\n if (kind === \"malformed-tool-arguments\") {\n return `Completion provider returned ${toolCall} with malformed JSON arguments.`;\n }\n if (kind === \"invalid-tool-arguments\") {\n return `Completion provider returned ${toolCall} with arguments that are not a JSON value.`;\n }\n if (kind === \"invalid-stream-event\") {\n return \"Completion provider returned an invalid stream event.\";\n }\n if (kind === \"invalid-response\") {\n return \"Completion provider returned a response that cannot be consumed safely.\";\n }\n if (kind === \"incomplete-tool-call\") {\n return \"Completion provider stream ended before its tool call was complete.\";\n }\n if (kind === \"incomplete-stream\") {\n return \"Completion provider stream ended without a terminal response.\";\n }\n if (kind === \"truncated-tool-call\") {\n return \"Completion provider stopped at its output limit before a tool call could be consumed safely.\";\n }\n if (kind === \"filtered-tool-call\") {\n return \"Completion provider content filtering prevented a tool call from being consumed safely.\";\n }\n return `Completion provider returned an invalid ${toolCall}.`;\n}\nfunction displayId(value) {\n let sanitized = \"\";\n for (const character of value) {\n const code = character.charCodeAt(0);\n sanitized += code <= 31 || code === 127 ? \"\\uFFFD\" : character;\n }\n return sanitized.length <= 128 ? sanitized : `${sanitized.slice(0, 127)}\\u2026`;\n}\nfunction isNonblankString(value) {\n return typeof value === \"string\" && value.trim().length > 0;\n}\nfunction isCompletionFinishReason2(value) {\n return value === \"stop\" || value === \"length\" || value === \"content-filter\" || value === \"tool-calls\" || value === \"other\";\n}\nfunction assertUsage(usage) {\n for (const value of [\n usage.inputTokens,\n usage.outputTokens,\n usage.totalTokens,\n usage.cachedInputTokens,\n usage.cacheCreationInputTokens\n ]) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new TypeError(\"CompletionProviderOutputError usage must contain finite token counts.\");\n }\n }\n if (usage.details !== void 0) {\n for (const value of Object.values(usage.details)) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new TypeError(\n \"CompletionProviderOutputError usage details must contain finite token counts.\"\n );\n }\n }\n }\n}\nfunction copyUsage(usage) {\n const copied = {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n cachedInputTokens: usage.cachedInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens\n };\n if (usage.details !== void 0) copied.details = { ...usage.details };\n return copied;\n}\n\n// src/internal/completion-request.ts\nfunction createCompletionRequest(input, options) {\n const configuredTools = options.tools ?? [];\n const chatHistory = messagesFromInput(input);\n assertNoAgentInteractionParts(chatHistory);\n const request = {\n chatHistory,\n documents: [...options.documents ?? []],\n tools: configuredTools.filter((tool) => !isProviderTool(tool))\n };\n const providerTools = configuredTools.filter(isProviderTool);\n if (providerTools.length > 0) request.providerTools = providerTools;\n if (options.instructions !== void 0 && options.instructions.length > 0) {\n request.instructions = options.instructions;\n }\n if (options.temperature !== void 0) request.temperature = options.temperature;\n if (options.maxTokens !== void 0) request.maxTokens = options.maxTokens;\n if (options.toolChoice !== void 0) request.toolChoice = options.toolChoice;\n if (options.outputSchema !== void 0) request.outputSchema = options.outputSchema;\n if (options.controls !== void 0) {\n const controls = Object.fromEntries(\n Object.entries(options.controls).filter(\n (entry) => typeof entry[1] === \"string\"\n )\n );\n if (Object.keys(controls).length > 0) request.controls = Object.freeze(controls);\n }\n if (options.providerOptions !== void 0) {\n assertJsonObject(options.providerOptions, \"providerOptions\");\n request.providerOptions = options.providerOptions;\n }\n return request;\n}\nfunction assertNoAgentInteractionParts(messages) {\n for (const message of messages) {\n if (message.role === \"tool\" && message.content.some((part) => part.type !== \"tool-result\")) {\n throw new TypeError(\n \"Completion messages contain an unresolved Agent interaction response. Resume the Agent with its continuation instead of sending interaction parts directly to a provider.\"\n );\n }\n }\n}\nfunction messagesFromInput(input) {\n if (typeof input === \"string\") {\n return [{ role: \"user\", content: input }];\n }\n if (Array.isArray(input)) {\n if (input.length === 0) {\n throw new Error(\"input must contain at least one Message.\");\n }\n return parseMessages(input);\n }\n return [parseMessage(input)];\n}\n\n// src/completion/stream-accumulator.ts\nvar CompletionStreamAccumulator = class {\n orderedParts = [];\n textParts = /* @__PURE__ */ new Map();\n reasoningByKey = /* @__PURE__ */ new Map();\n reasoningKeyById = /* @__PURE__ */ new Map();\n toolCalls = /* @__PURE__ */ new Map();\n sources = /* @__PURE__ */ new Map();\n providerToolCalls = /* @__PURE__ */ new Map();\n finalResponse;\n messageId;\n nextTextKey = 0;\n nextReasoningKey = 0;\n accept(event) {\n if (event.type === \"text_delta\") {\n if (typeof event.delta !== \"string\") {\n throw new CompletionProviderOutputError({ kind: \"invalid-stream-event\" });\n }\n this.appendText(event.delta);\n return { type: \"text_delta\", delta: event.delta };\n }\n if (event.type === \"reasoning_delta\") {\n if (typeof event.delta !== \"string\" || event.id !== void 0 && !isNonblankString2(event.id) || event.signature !== void 0 && !isNonblankString2(event.signature) || event.contentType !== void 0 && !isReasoningContentType(event.contentType)) {\n throw new CompletionProviderOutputError({ kind: \"invalid-stream-event\" });\n }\n const reasoning = this.reasoningStateForEvent(event);\n this.appendReasoning(reasoning, event);\n return reasoningDeltaEvent(event);\n }\n if (event.type === \"tool_call_delta\") {\n if (!isNonblankString2(event.id)) {\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\" });\n }\n const toolCall = this.toolCallStateForId(event.id);\n if (toolCall.fullCallSeen) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.id\n });\n }\n if (event.callId !== void 0) {\n if (!isNonblankString2(event.callId)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.id\n });\n }\n if (toolCall.callId !== void 0 && toolCall.callId !== event.callId) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.id\n });\n }\n toolCall.callId = event.callId;\n }\n if (event.name !== void 0) {\n if (!isNonblankString2(event.name)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.id\n });\n }\n if (toolCall.name.length > 0 && toolCall.name !== event.name) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.id\n });\n }\n toolCall.name = event.name;\n }\n if (event.signature !== void 0) {\n if (!isNonblankString2(event.signature) || toolCall.signature !== void 0 && toolCall.signature !== event.signature) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.id\n });\n }\n toolCall.signature = event.signature;\n }\n if (event.argumentsMode !== void 0 && event.argumentsMode !== \"append\" && event.argumentsMode !== \"replace\") {\n throw new CompletionProviderOutputError({\n kind: \"invalid-stream-event\",\n toolCallId: toolCall.id\n });\n }\n if (event.argumentsMode !== void 0 && event.argumentsDelta === void 0) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-stream-event\",\n toolCallId: toolCall.id\n });\n }\n if (event.argumentsDelta !== void 0) {\n if (typeof event.argumentsDelta !== \"string\") {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-arguments\",\n toolCallId: toolCall.id\n });\n }\n if (event.argumentsMode === \"replace\") {\n if (toolCall.argumentsText.length > 0 && toolCall.argumentsText !== event.argumentsDelta && (toolCall.argumentsSnapshotSeen || !event.argumentsDelta.startsWith(toolCall.argumentsText))) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.id\n });\n }\n toolCall.argumentsText = event.argumentsDelta;\n toolCall.argumentsSnapshotSeen = true;\n } else {\n if (toolCall.argumentsSnapshotSeen) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.id\n });\n }\n toolCall.argumentsText += event.argumentsDelta;\n }\n }\n return void 0;\n }\n if (event.type === \"tool_call\") {\n this.upsertToolCall(event.toolCall);\n return { type: \"tool_call\", toolCall: event.toolCall };\n }\n if (event.type === \"source\") {\n this.sources.set(sourceKey(event.source), event.source);\n return { type: \"source\", source: event.source };\n }\n if (event.type === \"provider_tool_call\") {\n this.providerToolCalls.set(event.toolCall.id, event.toolCall);\n return { type: \"provider_tool_call\", toolCall: event.toolCall };\n }\n if (event.type === \"message_id\") {\n if (!isNonblankString2(event.id)) {\n throw new CompletionProviderOutputError({ kind: \"invalid-stream-event\" });\n }\n this.messageId = event.id;\n return void 0;\n }\n if (event.type === \"final\") {\n this.finalResponse = event.response;\n return void 0;\n }\n return void 0;\n }\n response() {\n this.assertAccumulatedFinishReason();\n let accumulatedResponse;\n try {\n accumulatedResponse = this.buildAccumulatedResponse();\n } catch (error) {\n if (error instanceof CompletionProviderOutputError && this.finalResponse !== void 0) {\n throw providerOutputErrorWithUsage(error, this.finalResponse.usage);\n }\n throw error;\n }\n if (this.finalResponse !== void 0) {\n if (accumulatedResponse.choice.length === 0) {\n return this.withAccumulatedArtifacts(this.finalResponse, accumulatedResponse);\n }\n return this.mergeFinalResponse(accumulatedResponse, this.finalResponse);\n }\n return accumulatedResponse;\n }\n assertAccumulatedFinishReason() {\n if (this.finalResponse === void 0) {\n if (this.toolCalls.size === 0) {\n throw new CompletionProviderOutputError({ kind: \"incomplete-stream\" });\n }\n const toolCallId = this.toolCalls.size === 1 ? this.toolCalls.keys().next().value : void 0;\n throw new CompletionProviderOutputError({\n kind: \"incomplete-tool-call\",\n toolCallId\n });\n }\n if (this.toolCalls.size === 0) return;\n const finishReason = this.finalResponse.finishReason;\n if (finishReason === \"length\") {\n throw new CompletionProviderOutputError({\n kind: \"truncated-tool-call\",\n finishReason,\n usage: this.finalResponse.usage\n });\n }\n if (finishReason === \"content-filter\") {\n throw new CompletionProviderOutputError({\n kind: \"filtered-tool-call\",\n finishReason,\n usage: this.finalResponse.usage\n });\n }\n if (finishReason !== void 0 && finishReason !== \"stop\" && finishReason !== \"tool-calls\") {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n usage: this.finalResponse.usage\n });\n }\n }\n buildAccumulatedResponse() {\n const choice = [];\n for (const part of this.orderedParts) {\n if (part.type === \"text\") {\n const text = this.textParts.get(part.key) ?? \"\";\n if (text.length > 0) {\n choice.push({ type: \"text\", text });\n }\n continue;\n }\n if (part.type === \"reasoning\") {\n const reasoning = this.reasoningByKey.get(part.key);\n if (reasoning !== void 0) {\n choice.push(reasoningContent(reasoning));\n }\n continue;\n }\n const toolCall = this.toolCalls.get(part.key);\n if (toolCall !== void 0) {\n choice.push(toolCallContent(toolCall));\n }\n }\n const response = {\n choice,\n usage: Usage.empty(),\n rawResponse: void 0\n };\n if (this.messageId !== void 0) {\n response.messageId = this.messageId;\n }\n const sources = [...this.sources.values()];\n if (sources.length > 0) {\n response.sources = sources;\n }\n const providerToolCalls = [...this.providerToolCalls.values()];\n if (providerToolCalls.length > 0) {\n response.providerToolCalls = providerToolCalls;\n }\n return response;\n }\n upsertToolCall(toolCall) {\n if (!isNonblankString2(toolCall.toolCallId) || !isNonblankString2(toolCall.toolName) || toolCall.callId !== void 0 && !isNonblankString2(toolCall.callId) || toolCall.signature !== void 0 && !isNonblankString2(toolCall.signature)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: isNonblankString2(toolCall.toolCallId) ? toolCall.toolCallId : void 0\n });\n }\n if (!isJsonValue(toolCall.input)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-arguments\",\n toolCallId: toolCall.toolCallId\n });\n }\n const existing = this.toolCalls.get(toolCall.toolCallId);\n if (existing !== void 0) {\n if (existing.fullCallSeen) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.toolCallId\n });\n }\n if (existing.name.length > 0 && existing.name !== toolCall.toolName || existing.callId !== void 0 && existing.callId !== toolCall.callId || existing.signature !== void 0 && toolCall.signature !== void 0 && existing.signature !== toolCall.signature) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.toolCallId\n });\n }\n if (existing.argumentsText.length > 0) {\n const accumulatedInput = parseToolArguments(existing.id, existing.argumentsText);\n if (!jsonValuesEqual(accumulatedInput, toolCall.input)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: toolCall.toolCallId\n });\n }\n }\n }\n if (!this.toolCalls.has(toolCall.toolCallId)) {\n this.orderedParts.push({ type: \"tool_call\", key: toolCall.toolCallId });\n }\n const partial = {\n id: toolCall.toolCallId,\n name: toolCall.toolName,\n argumentsText: JSON.stringify(toolCall.input),\n argumentsSnapshotSeen: true,\n fullCallSeen: true\n };\n if (toolCall.callId !== void 0) {\n partial.callId = toolCall.callId;\n }\n const signature = toolCall.signature ?? existing?.signature;\n if (signature !== void 0) {\n partial.signature = signature;\n }\n this.toolCalls.set(toolCall.toolCallId, partial);\n }\n mergeFinalResponse(accumulatedResponse, finalResponse) {\n if (finalResponse.choice.length === 0) {\n const mergedResponse = {\n ...accumulatedResponse,\n usage: finalResponse.usage,\n rawResponse: finalResponse.rawResponse\n };\n if (finalResponse.finishReason !== void 0) {\n mergedResponse.finishReason = finalResponse.finishReason;\n }\n if (finalResponse.providerFinishReason !== void 0) {\n mergedResponse.providerFinishReason = finalResponse.providerFinishReason;\n }\n if (finalResponse.messageId !== void 0) {\n mergedResponse.messageId = finalResponse.messageId;\n }\n return this.withAccumulatedArtifacts(mergedResponse, accumulatedResponse);\n }\n const accumulatedNonTool = accumulatedResponse.choice.filter(\n (content) => content.type !== \"tool-call\"\n );\n const finalNonTool = finalResponse.choice.filter((content) => content.type !== \"tool-call\");\n if (accumulatedNonTool.length > 0 && !nonToolPartsEqual(accumulatedNonTool, finalNonTool)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-stream-event\",\n usage: finalResponse.usage\n });\n }\n const accumulatedById = /* @__PURE__ */ new Map();\n const accumulatedByCallId = /* @__PURE__ */ new Map();\n for (const content of accumulatedResponse.choice) {\n if (content.type !== \"tool-call\") continue;\n accumulatedById.set(content.toolCallId, content);\n if (content.callId !== void 0) accumulatedByCallId.set(content.callId, content);\n }\n const matchedAccumulatedToolCalls = /* @__PURE__ */ new Set();\n const choice = finalResponse.choice.map((content) => {\n if (content.type !== \"tool-call\") return content;\n const accumulated = accumulatedById.get(content.toolCallId);\n if (accumulated === void 0) {\n const changedIdentity = content.callId === void 0 ? void 0 : accumulatedByCallId.get(content.callId);\n if (changedIdentity !== void 0) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: changedIdentity.toolCallId,\n usage: finalResponse.usage\n });\n }\n return content;\n }\n matchedAccumulatedToolCalls.add(accumulated);\n return mergeFinalToolCall(accumulated, content, finalResponse.usage);\n });\n for (const accumulated of accumulatedById.values()) {\n if (!matchedAccumulatedToolCalls.has(accumulated)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: accumulated.toolCallId,\n usage: finalResponse.usage\n });\n }\n }\n return this.withAccumulatedArtifacts({ ...finalResponse, choice }, accumulatedResponse);\n }\n appendText(delta) {\n const lastPart = this.orderedParts.at(-1);\n const key = lastPart?.type === \"text\" ? lastPart.key : this.createTextKey();\n if (lastPart?.type !== \"text\") {\n this.orderedParts.push({ type: \"text\", key });\n }\n this.textParts.set(key, `${this.textParts.get(key) ?? \"\"}${delta}`);\n }\n reasoningStateForEvent(event) {\n if (event.id !== void 0) {\n const existingKey = this.reasoningKeyById.get(event.id);\n if (existingKey !== void 0) {\n const existing = this.reasoningByKey.get(existingKey);\n if (existing !== void 0) {\n return existing;\n }\n }\n const key2 = this.createReasoningKey();\n const reasoning2 = { id: event.id, text: \"\" };\n this.reasoningKeyById.set(event.id, key2);\n this.reasoningByKey.set(key2, reasoning2);\n this.orderedParts.push({ type: \"reasoning\", key: key2 });\n return reasoning2;\n }\n const lastPart = this.orderedParts.at(-1);\n if (lastPart?.type === \"reasoning\") {\n const lastReasoning = this.reasoningByKey.get(lastPart.key);\n if (lastReasoning !== void 0 && lastReasoning.id === void 0) {\n return lastReasoning;\n }\n }\n const key = this.createReasoningKey();\n const reasoning = { text: \"\" };\n this.reasoningByKey.set(key, reasoning);\n this.orderedParts.push({ type: \"reasoning\", key });\n return reasoning;\n }\n toolCallStateForId(id) {\n const existing = this.toolCalls.get(id);\n if (existing !== void 0) {\n return existing;\n }\n const toolCall = {\n id,\n name: \"\",\n argumentsText: \"\",\n argumentsSnapshotSeen: false,\n fullCallSeen: false\n };\n this.toolCalls.set(id, toolCall);\n this.orderedParts.push({ type: \"tool_call\", key: id });\n return toolCall;\n }\n withMessageIdFallback(response, accumulatedResponse) {\n if (response.messageId !== void 0 || accumulatedResponse.messageId === void 0) {\n return response;\n }\n return { ...response, messageId: accumulatedResponse.messageId };\n }\n withAccumulatedArtifacts(response, accumulatedResponse) {\n const withMessageId = this.withMessageIdFallback(response, accumulatedResponse);\n const sources = mergeSources(accumulatedResponse.sources, response.sources);\n const providerToolCalls = mergeProviderToolCalls(\n accumulatedResponse.providerToolCalls,\n response.providerToolCalls\n );\n let accumulated = { ...withMessageId };\n if (sources.length > 0) accumulated = { ...accumulated, sources };\n if (providerToolCalls.length > 0) {\n accumulated = { ...accumulated, providerToolCalls };\n }\n return accumulated;\n }\n createTextKey() {\n this.nextTextKey += 1;\n return `text_${this.nextTextKey.toString()}`;\n }\n createReasoningKey() {\n this.nextReasoningKey += 1;\n return `reasoning_${this.nextReasoningKey.toString()}`;\n }\n appendReasoning(reasoning, event) {\n const contentType = event.contentType ?? \"text\";\n if (contentType === \"text\" || contentType === \"summary\") {\n reasoning.text += event.delta;\n }\n if (event.contentType === void 0 && event.signature === void 0) {\n return;\n }\n reasoning.details ??= [];\n const last = reasoning.details.at(-1);\n if (contentType === \"text\") {\n if (last?.type === \"text\") {\n let detail = {\n ...last,\n text: `${last.text}${event.delta}`\n };\n if (event.signature !== void 0) detail = { ...detail, signature: event.signature };\n reasoning.details[reasoning.details.length - 1] = detail;\n } else {\n reasoning.details.push(\n event.signature === void 0 ? { type: \"text\", text: event.delta } : { type: \"text\", text: event.delta, signature: event.signature }\n );\n }\n return;\n }\n if (contentType === \"summary\") {\n if (last?.type === \"summary\") {\n reasoning.details[reasoning.details.length - 1] = {\n ...last,\n text: `${last.text}${event.delta}`\n };\n } else {\n reasoning.details.push({ type: \"summary\", text: event.delta });\n }\n return;\n }\n if (contentType === \"encrypted\") {\n reasoning.details.push({ type: \"encrypted\", data: event.delta });\n return;\n }\n reasoning.details.push({ type: \"redacted\", data: event.delta });\n }\n};\nfunction sourceKey(source) {\n return `${source.url}\\0${source.startIndex ?? \"\"}\\0${source.endIndex ?? \"\"}`;\n}\nfunction mergeSources(accumulated, final) {\n const sources = /* @__PURE__ */ new Map();\n for (const source of [...accumulated ?? [], ...final ?? []]) {\n sources.set(sourceKey(source), source);\n }\n return [...sources.values()];\n}\nfunction mergeProviderToolCalls(accumulated, final) {\n const toolCalls = /* @__PURE__ */ new Map();\n for (const toolCall of [...accumulated ?? [], ...final ?? []]) {\n toolCalls.set(toolCall.id, toolCall);\n }\n return [...toolCalls.values()];\n}\nfunction reasoningContent(reasoning) {\n const content = reasoning.details === void 0 ? { type: \"reasoning\", text: reasoning.text } : { type: \"reasoning\", text: reasoning.text, details: reasoning.details };\n return reasoning.id === void 0 ? content : { ...content, id: reasoning.id };\n}\nfunction toolCallContent(toolCall) {\n const argumentsValue = parseToolArguments(toolCall.id, toolCall.argumentsText);\n let content = {\n type: \"tool-call\",\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n input: argumentsValue\n };\n if (toolCall.callId !== void 0) content = { ...content, callId: toolCall.callId };\n if (toolCall.signature !== void 0) content = { ...content, signature: toolCall.signature };\n return content;\n}\nfunction mergeFinalToolCall(accumulated, finalToolCall, usage) {\n if (finalToolCall.toolCallId !== accumulated.toolCallId || finalToolCall.toolName !== accumulated.toolName || accumulated.callId !== void 0 && finalToolCall.callId !== accumulated.callId || accumulated.signature !== void 0 && finalToolCall.signature !== void 0 && finalToolCall.signature !== accumulated.signature) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: accumulated.toolCallId,\n usage\n });\n }\n if (!isJsonValue(finalToolCall.input)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-arguments\",\n toolCallId: accumulated.toolCallId,\n usage\n });\n }\n if (!jsonValuesEqual(accumulated.input, finalToolCall.input)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n toolCallId: accumulated.toolCallId,\n usage\n });\n }\n let merged = {\n type: \"tool-call\",\n toolCallId: finalToolCall.toolCallId,\n toolName: finalToolCall.toolName,\n input: accumulated.input\n };\n const callId = finalToolCall.callId ?? accumulated.callId;\n if (callId !== void 0) merged = { ...merged, callId };\n const signature = finalToolCall.signature ?? accumulated.signature;\n if (signature !== void 0) merged = { ...merged, signature };\n return merged;\n}\nfunction reasoningDeltaEvent(event) {\n const mapped = { type: \"reasoning_delta\", delta: event.delta };\n if (event.id !== void 0) mapped.id = event.id;\n if (event.contentType !== void 0) mapped.contentType = event.contentType;\n if (event.signature !== void 0) mapped.signature = event.signature;\n return mapped;\n}\nfunction parseToolArguments(toolCallId, text) {\n let value;\n try {\n value = JSON.parse(text);\n } catch {\n throw new CompletionProviderOutputError({\n kind: \"malformed-tool-arguments\",\n toolCallId\n });\n }\n if (!isJsonValue(value)) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-arguments\",\n toolCallId\n });\n }\n return value;\n}\nfunction jsonValuesEqual(left, right) {\n if (left === right) {\n return true;\n }\n if (left === null || right === null || typeof left !== \"object\" || typeof right !== \"object\") {\n return false;\n }\n if (isJsonArray(left) || isJsonArray(right)) {\n if (!isJsonArray(left) || !isJsonArray(right) || left.length !== right.length) {\n return false;\n }\n return left.every((value, index) => {\n const rightValue = right[index];\n return rightValue !== void 0 && jsonValuesEqual(value, rightValue);\n });\n }\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n for (const key of leftKeys) {\n if (!Object.hasOwn(right, key)) {\n return false;\n }\n const leftValue = left[key];\n const rightValue = right[key];\n if (leftValue === void 0 || rightValue === void 0 || !jsonValuesEqual(leftValue, rightValue)) {\n return false;\n }\n }\n return true;\n}\nfunction nonToolPartsEqual(accumulated, final) {\n if (accumulated.length !== final.length) return false;\n if (!isJsonValue(accumulated) || !isJsonValue(final)) return false;\n const unmatched = [...final];\n for (const part of accumulated) {\n const index = unmatched.findIndex((candidate) => jsonValuesEqual(part, candidate));\n if (index < 0) return false;\n unmatched.splice(index, 1);\n }\n return true;\n}\nfunction isJsonArray(value) {\n return Array.isArray(value);\n}\nfunction providerOutputErrorWithUsage(error, usage) {\n const shared = { usage };\n if (error.toolCallId !== void 0) shared.toolCallId = error.toolCallId;\n if (error.kind === \"truncated-tool-call\") {\n return new CompletionProviderOutputError({\n ...shared,\n kind: error.kind,\n finishReason: \"length\"\n });\n }\n if (error.kind === \"filtered-tool-call\") {\n return new CompletionProviderOutputError({\n ...shared,\n kind: error.kind,\n finishReason: \"content-filter\"\n });\n }\n if (error.finishReason === \"length\" || error.finishReason === \"content-filter\") {\n throw error;\n }\n return new CompletionProviderOutputError({\n ...shared,\n kind: error.kind,\n finishReason: error.finishReason\n });\n}\nfunction isNonblankString2(value) {\n return typeof value === \"string\" && value.trim().length > 0;\n}\nfunction isReasoningContentType(value) {\n return value === \"text\" || value === \"summary\" || value === \"encrypted\" || value === \"redacted\";\n}\n\n// src/completion/generate-completion.ts\nvar CompletionStructuredOutputError = class extends Error {\n phase;\n outputLength;\n usage;\n finishReason;\n providerFinishReason;\n constructor(options) {\n const failure = options.phase === \"truncated\" ? \"because the provider reached its output limit\" : options.phase === \"content-filter\" ? \"because the provider filtered the response\" : options.phase === \"parse\" ? \"during JSON parsing\" : \"during schema validation\";\n super(`Structured completion output failed ${failure}.`, { cause: options.cause });\n this.name = \"CompletionStructuredOutputError\";\n this.phase = options.phase;\n this.outputLength = options.outputLength;\n this.usage = options.usage;\n this.finishReason = options.finishReason;\n this.providerFinishReason = options.providerFinishReason;\n }\n};\nasync function generateCompletion(options) {\n throwIfAborted(options.abortSignal);\n const request = requestFromOptions(options);\n assertCompletionRequestSupported(options.model, request);\n const retries = resolveOptionalRetries(options.retries);\n const response = await sendCompletion(options.model, request, retries, options.abortSignal);\n return resultFromResponse(response, structuredOutputSchema(options));\n}\nfunction streamCompletion(options) {\n throwIfAborted(options.abortSignal);\n const request = requestFromOptions(options);\n if (!isStreamingCompletionModel(options.model) || !options.model.capabilities.streaming) {\n throw new Error(\"This completion model does not support streaming\");\n }\n assertCompletionRequestSupported(options.model, request, { streaming: true });\n const retries = resolveOptionalRetries(options.retries);\n return streamCompletionWithRetries(\n options.model,\n request,\n retries,\n options.abortSignal,\n structuredOutputSchema(options)\n );\n}\nasync function sendCompletion(model, request, retries, abortSignal) {\n const callOptions = modelCallOptions(abortSignal);\n let attempt = 1;\n let failedUsage = Usage.empty();\n while (true) {\n try {\n throwIfAborted(abortSignal);\n const response = await model.completion(request, callOptions);\n assertCompletionResponseIntegrity({ response });\n return Usage.isEmpty(failedUsage) ? response : { ...response, usage: Usage.add(failedUsage, response.usage) };\n } catch (error) {\n const normalizedError = abortSignal?.aborted === true ? abortError(abortSignal.reason) : error;\n const attemptUsage = completionProviderOutputErrorUsage(normalizedError);\n if (attemptUsage !== void 0) failedUsage = Usage.add(failedUsage, attemptUsage);\n const retryOptions = retryOptionsForFailure(retries, {\n error: normalizedError,\n attempt,\n streaming: false\n });\n if (retryOptions === void 0) throw normalizedError;\n await waitForRetry(retryDelayMs(retryOptions, attempt), abortSignal);\n attempt += 1;\n }\n }\n}\nfunction resolveOptionalRetries(setting) {\n return setting === void 0 || setting === false ? void 0 : resolveRetryOptions(setting);\n}\nasync function* streamCompletionWithRetries(model, request, retries, abortSignal, outputSchema) {\n let attempt = 1;\n let swallowedUsage = Usage.empty();\n const callOptions = modelCallOptions(abortSignal);\n attemptLoop: while (true) {\n let exposedProgress = false;\n let retryDelay;\n const accumulator = new CompletionStreamAccumulator();\n try {\n throwIfAborted(abortSignal);\n const events = model.streamCompletion(request, callOptions);\n for await (const event of events) {\n if (event.type === \"error\" && !exposedProgress) {\n const eventError = abortSignal?.aborted === true ? abortError(abortSignal.reason) : event.error;\n const eventUsage = event.usage ?? completionProviderOutputErrorUsage(eventError) ?? Usage.empty();\n const retryOptions = retryOptionsForFailure(retries, {\n error: eventError,\n attempt,\n streaming: true\n });\n if (retryOptions !== void 0) {\n swallowedUsage = Usage.add(swallowedUsage, eventUsage);\n retryDelay = retryDelayMs(retryOptions, attempt);\n break;\n }\n }\n if (event.type === \"error\") {\n const eventError = abortSignal?.aborted === true ? abortError(abortSignal.reason) : event.error;\n const eventUsage = event.usage ?? completionProviderOutputErrorUsage(eventError) ?? Usage.empty();\n yield {\n type: \"error\",\n error: eventError,\n usage: Usage.add(swallowedUsage, eventUsage)\n };\n return;\n }\n if (event.type === \"final\") {\n const cumulativeUsage = Usage.add(swallowedUsage, event.response.usage);\n try {\n accumulator.accept(event);\n const accumulatedResponse = accumulator.response();\n const response = Usage.isEmpty(swallowedUsage) ? accumulatedResponse : { ...accumulatedResponse, usage: cumulativeUsage };\n assertCompletionResponseIntegrity({ response });\n yield {\n type: \"final\",\n result: resultFromResponse(response, outputSchema)\n };\n } catch (error) {\n const retryOptions = exposedProgress ? void 0 : retryOptionsForFailure(retries, {\n error,\n attempt,\n streaming: true\n });\n if (retryOptions !== void 0) {\n swallowedUsage = cumulativeUsage;\n await waitForRetry(retryDelayMs(retryOptions, attempt), abortSignal);\n attempt += 1;\n continue attemptLoop;\n }\n yield { type: \"error\", error, usage: cumulativeUsage };\n }\n return;\n }\n accumulator.accept(event);\n exposedProgress = true;\n yield event;\n }\n if (retryDelay !== void 0) {\n await waitForRetry(retryDelay, abortSignal);\n attempt += 1;\n continue;\n }\n let incomplete;\n try {\n accumulator.response();\n incomplete = new CompletionProviderOutputError({ kind: \"incomplete-stream\" });\n } catch (error) {\n incomplete = error;\n }\n if (!exposedProgress) {\n const retryOptions = retryOptionsForFailure(retries, {\n error: incomplete,\n attempt,\n streaming: true\n });\n if (retryOptions !== void 0) {\n await waitForRetry(retryDelayMs(retryOptions, attempt), abortSignal);\n attempt += 1;\n continue;\n }\n }\n yield { type: \"error\", error: incomplete, usage: swallowedUsage };\n return;\n } catch (error) {\n const normalizedError = abortSignal?.aborted === true ? abortError(abortSignal.reason) : error;\n const attemptUsage = completionProviderOutputErrorUsage(normalizedError);\n const cumulativeUsage = attemptUsage === void 0 ? swallowedUsage : Usage.add(swallowedUsage, attemptUsage);\n if (!exposedProgress) {\n const retryOptions = retryOptionsForFailure(retries, {\n error: normalizedError,\n attempt,\n streaming: true\n });\n if (retryOptions !== void 0) {\n try {\n swallowedUsage = cumulativeUsage;\n await waitForRetry(retryDelayMs(retryOptions, attempt), abortSignal);\n attempt += 1;\n continue;\n } catch (waitError) {\n yield { type: \"error\", error: waitError, usage: cumulativeUsage };\n return;\n }\n }\n }\n yield { type: \"error\", error: normalizedError, usage: cumulativeUsage };\n return;\n }\n }\n}\nfunction requestFromOptions(options) {\n const input = inputFromOptions(options);\n return createCompletionRequest(input, {\n instructions: options.instructions,\n documents: options.documents,\n tools: options.tools,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n toolChoice: options.toolChoice,\n controls: options.controls,\n providerOptions: options.providerOptions,\n outputSchema: \"outputSchema\" in options && options.outputSchema !== void 0 ? toProviderJsonSchema(options.outputSchema) : void 0\n });\n}\nfunction inputFromOptions(options) {\n const prompt = options.prompt;\n const messages = options.messages;\n const hasPrompt = prompt !== void 0;\n const hasMessages = messages !== void 0;\n if (hasPrompt === hasMessages) {\n throw new TypeError(\"Exactly one of prompt or messages must be provided.\");\n }\n if (hasPrompt) {\n if (typeof prompt !== \"string\" || prompt.trim().length === 0) {\n throw new TypeError(\"Completion prompt must be a non-empty string.\");\n }\n return prompt;\n }\n if (!Array.isArray(messages)) {\n throw new TypeError(\"Completion messages must be an array of Message values.\");\n }\n return messages;\n}\nfunction structuredOutputSchema(options) {\n return options.outputSchema;\n}\nfunction resultFromResponse(response, outputSchema) {\n const text = textFromAssistantContent(response.choice);\n const result = {\n output: outputSchema === void 0 ? text : parseCompletionOutput(text, outputSchema, response),\n text,\n content: [...response.choice],\n usage: response.usage,\n rawResponse: response.rawResponse\n };\n if (response.finishReason !== void 0) result.finishReason = response.finishReason;\n if (response.providerFinishReason !== void 0) {\n result.providerFinishReason = response.providerFinishReason;\n }\n if (response.contextUsage !== void 0) result.contextUsage = response.contextUsage;\n if (response.messageId !== void 0) result.messageId = response.messageId;\n if (response.sources !== void 0) result.sources = [...response.sources];\n if (response.providerToolCalls !== void 0) {\n result.providerToolCalls = [...response.providerToolCalls];\n }\n return result;\n}\nfunction parseCompletionOutput(text, schema, response) {\n if (response.finishReason === \"content-filter\") {\n throw new CompletionStructuredOutputError({\n phase: \"content-filter\",\n outputLength: text.length,\n usage: response.usage,\n finishReason: response.finishReason,\n providerFinishReason: response.providerFinishReason\n });\n }\n if (response.finishReason === \"length\") {\n throw new CompletionStructuredOutputError({\n phase: \"truncated\",\n outputLength: text.length,\n usage: response.usage,\n finishReason: response.finishReason,\n providerFinishReason: response.providerFinishReason\n });\n }\n let json;\n try {\n json = JSON.parse(text);\n if (!isJsonValue(json)) {\n throw new TypeError(\"Structured completion output is not a JSON value.\");\n }\n } catch (error) {\n throw new CompletionStructuredOutputError({\n phase: \"parse\",\n outputLength: text.length,\n usage: response.usage,\n finishReason: response.finishReason,\n providerFinishReason: response.providerFinishReason,\n cause: error\n });\n }\n try {\n return schema.parse(json);\n } catch (error) {\n throw new CompletionStructuredOutputError({\n phase: \"schema\",\n outputLength: text.length,\n usage: response.usage,\n finishReason: response.finishReason,\n providerFinishReason: response.providerFinishReason,\n cause: error\n });\n }\n}\nfunction modelCallOptions(abortSignal) {\n return abortSignal === void 0 ? void 0 : { abortSignal };\n}\nfunction isStreamingCompletionModel(model) {\n return typeof model.streamCompletion === \"function\";\n}\n\nexport {\n reasoningDisplayText,\n isProviderTool,\n calculateContextUsage,\n withContextUsage,\n resolveModelContextLimits,\n Usage,\n getAssistantGenerationMetadata,\n CompletionCapabilityError,\n assertCompletionRequestSupported,\n assertCompletionControlsSupported,\n textFromAssistantContent,\n createCompletionRequest,\n COMPLETION_PROVIDER_OUTPUT_ERROR_CODE,\n CompletionProviderOutputError,\n assertCompletionResponseIntegrity,\n CompletionStreamAccumulator,\n CompletionStructuredOutputError,\n generateCompletion,\n streamCompletion,\n isStreamingCompletionModel\n};\n//# sourceMappingURL=chunk-OI3LSMJG.js.map","import { getAssistantGenerationMetadata, type Message } from \"@anvia/core/completion\";\nimport type { StudioMemoryMessageRecord } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { formatRelativeTime } from \"../shared/format\";\n\ntype AssistantMessage = Extract<Message, { role: \"assistant\" }>;\n\nexport type MemoryGenerationRow = {\n position: number;\n runId: string;\n turn: number;\n createdAt: string;\n preview: string;\n generation: ReturnType<typeof getAssistantGenerationMetadata>;\n};\n\nexport function memoryGenerationRows(records: StudioMemoryMessageRecord[]): MemoryGenerationRow[] {\n return records.flatMap((record) => {\n if (record.message.role !== \"assistant\") {\n return [];\n }\n return [\n {\n position: record.position,\n runId: record.runId,\n turn: record.turn,\n createdAt: record.createdAt,\n preview: assistantPreview(record.message),\n generation: getAssistantGenerationMetadata(record.message),\n },\n ];\n });\n}\n\nexport function MemoryGenerationLedger(props: { records: StudioMemoryMessageRecord[] }) {\n const rows = memoryGenerationRows(props.records);\n return (\n <section className=\"grid min-w-0 overflow-hidden border-y border-hair\">\n <header className=\"flex min-h-11 items-center justify-between gap-3 bg-muted px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n <span>Assistant responses</span>\n <span className=\"font-medium normal-case tracking-normal\">{rows.length} responses</span>\n </header>\n {rows.length === 0 ? (\n <div className=\"border-t border-hair px-4 py-8 text-center text-sm text-muted-foreground\">\n No persisted assistant responses.\n </div>\n ) : (\n <div className=\"grid divide-y divide-hair border-t border-hair\">\n {rows.map((row) => (\n <GenerationRow row={row} key={`${row.position}:${row.runId}`} />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction GenerationRow(props: { row: MemoryGenerationRow }) {\n const generation = props.row.generation;\n return (\n <article className=\"grid min-w-0 gap-3 px-3 py-4\">\n <div className=\"flex min-w-0 flex-wrap items-center justify-between gap-2\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Badge className=\"border-hair bg-muted text-foreground\">Turn {props.row.turn}</Badge>\n {generation === undefined ? (\n <Badge className=\"border-hair bg-background text-muted-foreground\">\n Usage unavailable\n </Badge>\n ) : (\n <>\n <Badge className=\"border-hair bg-muted text-foreground\">{generation.provider}</Badge>\n <Badge className=\"max-w-full truncate border-hair bg-muted text-foreground\">\n {generation.modelId}\n </Badge>\n </>\n )}\n </div>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {formatRelativeTime(props.row.createdAt)}\n </span>\n </div>\n <p className=\"m-0 whitespace-pre-wrap break-words text-sm leading-6 text-foreground\">\n {props.row.preview}\n </p>\n {generation === undefined ? null : (\n <div className=\"flex min-w-0 flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <UsageMetric label=\"total\" value={generation.usage.totalTokens} suffix=\" tokens\" />\n <UsageMetric label=\"input\" value={generation.usage.inputTokens} />\n <UsageMetric label=\"output\" value={generation.usage.outputTokens} />\n <UsageMetric label=\"cached\" value={generation.usage.cachedInputTokens} />\n <UsageMetric label=\"cache create\" value={generation.usage.cacheCreationInputTokens} />\n </div>\n )}\n </article>\n );\n}\n\nfunction UsageMetric(props: { label: string; value: number; suffix?: string | undefined }) {\n return (\n <span>\n {props.label} {props.value.toLocaleString()}\n {props.suffix}\n </span>\n );\n}\n\nfunction assistantPreview(message: AssistantMessage): string {\n if (typeof message.content === \"string\") {\n return message.content.trim().length > 0\n ? truncatePreview(message.content)\n : \"Assistant response\";\n }\n const text = message.content\n .flatMap((content) => (content.type === \"text\" ? [content.text] : []))\n .join(\"\\n\")\n .trim();\n if (text.length > 0) {\n return truncatePreview(text);\n }\n\n const toolNames = message.content.flatMap((content) =>\n content.type === \"tool-call\" ? [content.toolName] : [],\n );\n if (toolNames.length > 0) {\n return `Tool call${toolNames.length === 1 ? \"\" : \"s\"}: ${toolNames.join(\", \")}`;\n }\n\n const reasoning = message.content\n .flatMap((content) => (content.type === \"reasoning\" ? [content.text] : []))\n .join(\"\\n\")\n .trim();\n if (reasoning.length > 0) {\n return truncatePreview(reasoning);\n }\n\n const imageCount = message.content.filter((content) => content.type === \"image\").length;\n return imageCount > 0\n ? `${imageCount} generated image${imageCount === 1 ? \"\" : \"s\"}`\n : \"Assistant response\";\n}\n\nfunction truncatePreview(value: string): string {\n const compact = value.replace(/\\s+/g, \" \").trim();\n return compact.length > 220 ? `${compact.slice(0, 217)}...` : compact;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n StudioConfig,\n StudioMemorySourceConversationMessages,\n StudioMemorySourceConversationSteps,\n StudioMemorySourceConversationSummary,\n StudioMemorySourceConversationsPage,\n StudioMemorySourceSummary,\n StudioMemorySourcesPage,\n StudioMemorySourceUsersPage,\n} from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\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\";\nimport { MemoryGenerationLedger } from \"./memory-generation-ledger\";\n\nexport function MemoryPage(props: { agents: StudioConfig[\"agents\"]; enabled: boolean }) {\n const [sources, setSources] = useState<StudioMemorySourceSummary[]>([]);\n const [selectedSourceRef, setSelectedSourceRef] = useState(\"\");\n const [users, setUsers] = useState<StudioMemorySourceUsersPage[\"users\"]>([]);\n const [conversations, setConversations] = useState<StudioMemorySourceConversationSummary[]>([]);\n const [selectedUserId, setSelectedUserId] = useState(\"\");\n const [selectedConversationRef, setSelectedConversationRef] = useState(\"\");\n const [messages, setMessages] = useState<StudioMemorySourceConversationMessages | undefined>();\n const [steps, setSteps] = useState<StudioMemorySourceConversationSteps | undefined>();\n const [sourcesLoading, setSourcesLoading] = useState(false);\n const [loading, setLoading] = useState(false);\n const [detailLoading, setDetailLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const memoryRequest = useRef(0);\n\n const selectedSource = sources.find((source) => source.ref === selectedSourceRef);\n\n const loadSources = useCallback(async () => {\n if (!props.enabled) {\n setSources([]);\n setSelectedSourceRef(\"\");\n return;\n }\n setSourcesLoading(true);\n setError(\"\");\n try {\n const response = await fetch(\"/memory/sources\");\n if (!response.ok) throw new Error(`Memory sources failed with HTTP ${response.status}`);\n const body = (await response.json()) as StudioMemorySourcesPage;\n setSources(body.sources);\n setSelectedSourceRef((current) =>\n body.sources.some((source) => source.ref === current)\n ? current\n : defaultSourceRef(body.sources),\n );\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError));\n } finally {\n setSourcesLoading(false);\n }\n }, [props.enabled]);\n\n useEffect(() => {\n void loadSources();\n }, [loadSources]);\n\n const loadMemory = useCallback(async () => {\n const requestId = memoryRequest.current + 1;\n memoryRequest.current = requestId;\n if (!props.enabled || selectedSource === undefined || !selectedSource.available) {\n setUsers([]);\n setConversations([]);\n setMessages(undefined);\n setSteps(undefined);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n const sourcePath = `/memory/sources/${encodeURIComponent(selectedSource.ref)}`;\n const [usersResponse, conversationsResponse] = await Promise.all([\n fetch(`${sourcePath}/users?limit=50`),\n fetch(`${sourcePath}/conversations?limit=100`),\n ]);\n if (!usersResponse.ok) {\n throw new Error(`Memory users failed with HTTP ${usersResponse.status}`);\n }\n if (!conversationsResponse.ok) {\n throw new Error(`Memory conversations failed with HTTP ${conversationsResponse.status}`);\n }\n const usersBody = (await usersResponse.json()) as StudioMemorySourceUsersPage;\n const conversationsBody =\n (await conversationsResponse.json()) as StudioMemorySourceConversationsPage;\n if (memoryRequest.current !== requestId) return;\n setUsers(usersBody.users);\n setConversations(conversationsBody.conversations);\n setSelectedConversationRef(\n (current) =>\n conversationsBody.conversations.find((conversation) => conversation.ref === current)\n ?.ref ??\n conversationsBody.conversations[0]?.ref ??\n \"\",\n );\n } catch (loadError) {\n if (memoryRequest.current === requestId) {\n setError(loadError instanceof Error ? loadError.message : String(loadError));\n }\n } finally {\n if (memoryRequest.current === requestId) setLoading(false);\n }\n }, [props.enabled, selectedSource]);\n\n useEffect(() => {\n setSelectedUserId(\"\");\n setSelectedConversationRef(\"\");\n setUsers([]);\n setConversations([]);\n setMessages(undefined);\n setSteps(undefined);\n void loadMemory();\n }, [loadMemory]);\n\n useEffect(() => {\n if (\n !props.enabled ||\n selectedSource === undefined ||\n !selectedSource.available ||\n selectedConversationRef.length === 0\n ) {\n setMessages(undefined);\n setSteps(undefined);\n return;\n }\n const sourceRef = selectedSource.ref;\n let cancelled = false;\n async function loadDetail() {\n setDetailLoading(true);\n setError(\"\");\n try {\n const conversationPath = `/memory/sources/${encodeURIComponent(\n sourceRef,\n )}/conversations/${encodeURIComponent(selectedConversationRef)}`;\n const [messagesResponse, stepsResponse] = await Promise.all([\n fetch(`${conversationPath}/messages`),\n fetch(`${conversationPath}/steps`),\n ]);\n if (!messagesResponse.ok) {\n throw new Error(`Conversation messages failed with HTTP ${messagesResponse.status}`);\n }\n if (!stepsResponse.ok) {\n throw new Error(`Conversation steps failed with HTTP ${stepsResponse.status}`);\n }\n if (!cancelled) {\n setMessages((await messagesResponse.json()) as StudioMemorySourceConversationMessages);\n setSteps((await stepsResponse.json()) as StudioMemorySourceConversationSteps);\n }\n } catch (loadError) {\n if (!cancelled) {\n setError(loadError instanceof Error ? loadError.message : String(loadError));\n setMessages(undefined);\n setSteps(undefined);\n }\n } finally {\n if (!cancelled) setDetailLoading(false);\n }\n }\n void loadDetail();\n return () => {\n cancelled = true;\n };\n }, [props.enabled, selectedConversationRef, selectedSource]);\n\n const visibleConversations = useMemo(\n () =>\n selectedUserId.length === 0\n ? conversations\n : conversations.filter((conversation) => conversation.userId === selectedUserId),\n [conversations, selectedUserId],\n );\n const totals = useMemo(() => memoryTotals(users, conversations), [conversations, users]);\n const selectedConversation =\n visibleConversations.find((conversation) => conversation.ref === selectedConversationRef) ??\n visibleConversations[0];\n\n useEffect(() => {\n if (visibleConversations.length === 0) {\n setSelectedConversationRef(\"\");\n return;\n }\n if (\n !visibleConversations.some((conversation) => conversation.ref === selectedConversationRef)\n ) {\n setSelectedConversationRef(visibleConversations[0]?.ref ?? \"\");\n }\n }, [selectedConversationRef, visibleConversations]);\n\n return (\n <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Memory\">\n <StudioPageHeader\n title=\"Memory\"\n description=\"Inspect persisted agent conversations directly. Studio sessions appear only as a fallback for agents without configured memory.\"\n action={\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start\">\n {sources.length === 0 ? null : (\n <Select value={selectedSourceRef} onValueChange={setSelectedSourceRef}>\n <SelectTrigger className=\"h-8 min-h-8 w-60 rounded-md border-border text-xs max-sm:w-full\">\n <SelectValue placeholder=\"Memory source\" />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {sources.map((source) => (\n <SelectItem value={source.ref} key={source.ref}>\n {source.label}\n {source.available ? \"\" : \" (unavailable)\"}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n <StudioHeaderMetric label=\"users\" value={totals.userCount} />\n <StudioHeaderMetric label=\"conversations\" value={totals.conversationCount} />\n <StudioHeaderMetric label=\"messages\" value={totals.messageCount} />\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n disabled={sourcesLoading || loading}\n onClick={() => void loadSources()}\n >\n Refresh\n </Button>\n </div>\n }\n />\n\n <StudioPageContent className=\"overflow-hidden\">\n {!props.enabled ? (\n <StudioEmptyState\n title=\"Memory unavailable\"\n text=\"No agent memory or Studio session store is configured.\"\n />\n ) : sourcesLoading && sources.length === 0 ? (\n <StudioEmptyState title=\"Loading memory\" text=\"Discovering configured memory sources.\" />\n ) : error.length > 0 && sources.length === 0 ? (\n <StudioEmptyState title=\"Memory error\" text={error} />\n ) : selectedSource === undefined ? (\n <StudioEmptyState title=\"No memory sources\" text=\"No registered agent exposes memory.\" />\n ) : !selectedSource.available ? (\n <UnavailableSource source={selectedSource} />\n ) : loading && conversations.length === 0 ? (\n <StudioEmptyState title=\"Loading memory\" text={`Reading ${selectedSource.label}.`} />\n ) : error.length > 0 && conversations.length === 0 ? (\n <StudioEmptyState title=\"Memory error\" text={error} />\n ) : conversations.length === 0 ? (\n <MemoryEmptyDashboard\n source={selectedSource}\n userCount={users.length}\n onRefresh={() => void loadMemory()}\n />\n ) : (\n <div\n className={[\n \"grid h-full min-h-0 overflow-hidden\",\n error.length === 0 ? \"grid-rows-[minmax(0,1fr)]\" : \"grid-rows-[auto_minmax(0,1fr)]\",\n ].join(\" \")}\n >\n {error.length === 0 ? null : <InlineError message={error} />}\n <div className=\"grid min-h-0 grid-cols-[260px_minmax(320px,0.78fr)_minmax(0,1.22fr)] overflow-hidden border-t border-hair max-xl:grid-cols-[240px_minmax(0,1fr)] max-xl:grid-rows-[minmax(240px,0.42fr)_minmax(0,1fr)] max-md:grid-cols-1 max-md:grid-rows-[auto_minmax(240px,0.38fr)_minmax(0,1fr)]\">\n <MemoryUserRail\n users={users}\n selectedUserId={selectedUserId}\n totalConversations={conversations.length}\n onSelect={setSelectedUserId}\n />\n <ConversationLedger\n agents={props.agents}\n conversations={visibleConversations}\n selectedConversationRef={selectedConversation?.ref ?? \"\"}\n source={selectedSource}\n onSelect={setSelectedConversationRef}\n />\n <ConversationDetail\n agents={props.agents}\n conversation={selectedConversation}\n detailLoading={detailLoading}\n messages={messages}\n source={selectedSource}\n steps={steps}\n />\n </div>\n </div>\n )}\n </StudioPageContent>\n </StudioPageShell>\n );\n}\n\nfunction MemoryUserRail(props: {\n users: StudioMemorySourceUsersPage[\"users\"];\n selectedUserId: string;\n totalConversations: number;\n onSelect: (userId: string) => void;\n}) {\n return (\n <aside className=\"min-h-0 overflow-auto border-r border-hair pr-3 max-md:border-b max-md:border-r-0 max-md:pr-0\">\n <div className=\"grid gap-3 py-4 pr-3 max-md:pr-0\">\n <SectionLabel label=\"Users\" value={props.users.length} />\n <UserFilterButton\n active={props.selectedUserId.length === 0}\n title=\"All users\"\n detail={`${props.totalConversations} conversations`}\n onClick={() => props.onSelect(\"\")}\n />\n <div className=\"grid gap-1\">\n {props.users.map((user) => (\n <UserFilterButton\n active={props.selectedUserId === user.userId}\n title={user.userId}\n detail={`${user.conversationCount} conversations / ${formatRelativeTime(\n user.lastInteractionAt,\n )}`}\n key={user.userId}\n onClick={() => props.onSelect(user.userId)}\n />\n ))}\n </div>\n </div>\n </aside>\n );\n}\n\nfunction UserFilterButton(props: {\n active: boolean;\n title: string;\n detail: string;\n onClick: () => void;\n}) {\n return (\n <button\n className={[\n \"grid min-w-0 gap-1 rounded-lg border border-transparent px-3 py-2.5 text-left transition duration-200 hover:border-hair hover:bg-transparent hover:text-foreground focus-visible:border-ring focus-visible:outline-none\",\n props.active ? \"border-hair bg-row-selected\" : \"\",\n ].join(\" \")}\n type=\"button\"\n onClick={props.onClick}\n >\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">{props.title}</span>\n <span className=\"min-w-0 truncate text-xs leading-5 text-muted-foreground\">\n {props.detail}\n </span>\n </button>\n );\n}\n\nfunction ConversationLedger(props: {\n agents: StudioConfig[\"agents\"];\n conversations: StudioMemorySourceConversationSummary[];\n selectedConversationRef: string;\n source: StudioMemorySourceSummary;\n onSelect: (conversationRef: string) => void;\n}) {\n return (\n <section className=\"min-h-0 overflow-auto border-r border-hair px-4 max-xl:border-r-0 max-xl:pr-0 max-md:border-b max-md:px-0\">\n <div className=\"grid gap-3 py-4\">\n <SectionLabel label=\"Conversations\" value={props.conversations.length} />\n {props.conversations.length === 0 ? (\n <div className=\"border-y border-dashed border-hair px-3 py-8 text-center text-sm text-muted-foreground\">\n No conversations for this user.\n </div>\n ) : (\n <div className=\"grid border-y border-hair\">\n {props.conversations.map((conversation) => (\n <ConversationRow\n active={conversation.ref === props.selectedConversationRef}\n agentName={sourceAgentLabel(props.agents, props.source, conversation.agentIds)}\n conversation={conversation}\n key={conversation.ref}\n onSelect={() => props.onSelect(conversation.ref)}\n />\n ))}\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction ConversationRow(props: {\n conversation: StudioMemorySourceConversationSummary;\n agentName: string;\n active: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n className={[\n \"grid min-w-0 gap-2 border-b border-hair px-3 py-3 text-left transition duration-200 last:border-b-0 hover:bg-transparent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n props.active ? \"bg-row-selected\" : \"\",\n ].join(\" \")}\n type=\"button\"\n onClick={props.onSelect}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"grid min-w-0 gap-1\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.conversation.title ?? props.conversation.sessionId}\n </span>\n <span className=\"min-w-0 truncate text-xs text-muted-foreground\">\n {props.agentName} / {props.conversation.userId}\n </span>\n </div>\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {props.conversation.messageCount}\n </span>\n </div>\n <div className=\"flex min-w-0 flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground\">\n <span>{formatRelativeTime(props.conversation.updatedAt)}</span>\n <span className=\"min-w-0 truncate\">{props.conversation.sessionId}</span>\n </div>\n </button>\n );\n}\n\nfunction ConversationDetail(props: {\n agents: StudioConfig[\"agents\"];\n conversation: StudioMemorySourceConversationSummary | undefined;\n detailLoading: boolean;\n messages: StudioMemorySourceConversationMessages | undefined;\n source: StudioMemorySourceSummary;\n steps: StudioMemorySourceConversationSteps | undefined;\n}) {\n if (props.conversation === undefined) {\n return (\n <section className=\"min-h-0 overflow-auto py-4 pl-5 max-xl:col-span-2 max-xl:pl-0 max-md:col-span-1\">\n <StudioEmptyState\n title=\"No conversation selected\"\n text=\"Choose a conversation to inspect.\"\n />\n </section>\n );\n }\n\n return (\n <section className=\"min-h-0 overflow-auto py-4 pl-5 max-xl:col-span-2 max-xl:pl-0 max-md:col-span-1\">\n <div className=\"grid min-w-0 gap-5\">\n <header className=\"grid gap-4 border-b border-hair pb-5\">\n <div className=\"flex min-w-0 items-start justify-between gap-4 max-md:grid\">\n <div className=\"grid min-w-0 gap-2\">\n <div className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Persisted conversation\n </div>\n <h2 className=\"m-0 min-w-0 truncate text-2xl font-semibold leading-none text-foreground\">\n {props.conversation.title ?? props.conversation.sessionId}\n </h2>\n <span className=\"min-w-0 break-all font-mono text-xs text-muted-foreground\">\n {props.conversation.ref}\n </span>\n </div>\n <div className=\"flex flex-wrap justify-end gap-2 max-md:justify-start\">\n <Badge className=\"border-hair bg-muted text-foreground\">\n {props.source.storeKind ?? props.source.kind}\n </Badge>\n <Badge className=\"border-hair bg-muted text-foreground\">\n {sourceAgentLabel(props.agents, props.source, props.conversation.agentIds)}\n </Badge>\n </div>\n </div>\n <div className=\"grid border-y border-hair sm:grid-cols-4 sm:divide-x sm:divide-hair\">\n <Fact label=\"user\" value={props.conversation.userId} />\n <Fact label=\"messages\" value={props.conversation.messageCount} />\n <Fact label=\"created\" value={formatRelativeTime(props.conversation.createdAt)} />\n <Fact label=\"updated\" value={formatRelativeTime(props.conversation.updatedAt)} />\n </div>\n </header>\n\n {props.detailLoading ? (\n <StudioEmptyState title=\"Loading detail\" text=\"Reading persisted messages.\" />\n ) : (\n <div className=\"grid gap-4\">\n {props.conversation.metadata === undefined ? null : (\n <JsonPanel title=\"metadata\" value={props.conversation.metadata} />\n )}\n <MemoryGenerationLedger records={props.messages?.records ?? []} />\n <JsonPanel title=\"messages\" value={props.messages?.messages ?? []} />\n <JsonPanel title=\"message records\" value={props.messages?.records ?? []} />\n <JsonPanel title=\"derived transcript\" value={props.steps?.steps ?? []} />\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction UnavailableSource(props: { source: StudioMemorySourceSummary }) {\n return (\n <StudioEmptyState\n className=\"h-full\"\n title={`${props.source.label} is not inspectable`}\n text={props.source.reason ?? \"This memory store does not expose read-only discovery.\"}\n />\n );\n}\n\nfunction JsonPanel(props: { title: string; value: unknown }) {\n const count = Array.isArray(props.value) ? props.value.length : undefined;\n return (\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 <span>{props.title}</span>\n <span className=\"font-medium normal-case tracking-normal\">\n {count === undefined ? \"JSON\" : `${count} items`}\n </span>\n </summary>\n <div className=\"min-w-0 overflow-x-auto border-t border-hair\">\n <pre className=\"m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={formatJson(props.value)} />\n </code>\n </pre>\n </div>\n </details>\n );\n}\n\nfunction SectionLabel(props: { label: string; value: number }) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <h2 className=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n {props.label}\n </h2>\n <span className=\"text-xs font-semibold tabular-nums text-muted-foreground\">\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction Fact(props: { label: string; value: string | number }) {\n return (\n <div className=\"grid min-w-0 gap-1 px-3 py-3 first:pl-0 last:pr-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 MemoryEmptyDashboard(props: {\n source: StudioMemorySourceSummary;\n userCount: number;\n onRefresh: () => void;\n}) {\n return (\n <StudioEmptyState\n className=\"h-full\"\n title=\"No saved conversations yet\"\n text={`Conversations will appear here after the connected agent writes to ${props.source.label}. ${props.userCount} users are currently available.`}\n action={\n <div className=\"flex min-w-0 flex-wrap items-center justify-center gap-3\">\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n onClick={props.onRefresh}\n >\n Refresh\n </Button>\n <span className=\"text-xs leading-5 text-muted-foreground\">\n Existing database conversations are discovered automatically.\n </span>\n </div>\n }\n />\n );\n}\n\nfunction InlineError(props: { message: string }) {\n return (\n <div className=\"mb-3 border border-status-danger-ink bg-status-danger-fill px-3 py-2 text-xs leading-5 text-destructive\">\n {props.message}\n </div>\n );\n}\n\nfunction memoryTotals(\n users: StudioMemorySourceUsersPage[\"users\"],\n conversations: StudioMemorySourceConversationSummary[],\n): { userCount: number; conversationCount: number; messageCount: number } {\n return {\n userCount: users.length,\n conversationCount: conversations.length,\n messageCount: conversations.reduce(\n (total, conversation) => total + conversation.messageCount,\n 0,\n ),\n };\n}\n\nfunction defaultSourceRef(sources: StudioMemorySourceSummary[]): string {\n return (\n sources.find((source) => source.kind === \"agent\" && source.available)?.ref ??\n sources.find((source) => source.available)?.ref ??\n sources[0]?.ref ??\n \"\"\n );\n}\n\nfunction formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction sourceAgentLabel(\n agents: StudioConfig[\"agents\"],\n source: StudioMemorySourceSummary,\n agentIds: string[],\n): string {\n if (agentIds.length === 1) {\n const agentId = agentIds[0] ?? \"agent\";\n return agents.find((agent) => agent.id === agentId)?.name ?? agentId;\n }\n return source.label;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e,r as t,s as n,t as r}from"./utils-DzstcfqT.js";import{t as i}from"./button-B_AoswCu.js";import{t as a}from"./ArrowClockwise.es-5vr4h4OH.js";import{n as o,t as s}from"./icon-DyadsXLr.js";import{a as c,i as l,n as ee,r as u,t as d}from"./select-BdCBnmXx.js";import{a as f,c as te,s as ne,t as p}from"./studio-DzEdCFsX.js";import{t as m}from"./textarea-fAtCF2cf.js";import{a as h,i as g,n as _,o as v,r as y,s as b,t as re}from"./style-FGiH1LIC.js";import{t as ie}from"./renderers-DRD34eUr.js";var x=n(e(),1),ae=new Map([[`bold`,x.createElement(x.Fragment,null,x.createElement(`path`,{d:`M234.49,111.07,90.41,22.94A20,20,0,0,0,60,39.87V216.13a20,20,0,0,0,30.41,16.93l144.08-88.13a19.82,19.82,0,0,0,0-33.86ZM84,208.85V47.15L216.16,128Z`}))],[`duotone`,x.createElement(x.Fragment,null,x.createElement(`path`,{d:`M228.23,134.69,84.15,222.81A8,8,0,0,1,72,216.12V39.88a8,8,0,0,1,12.15-6.69l144.08,88.12A7.82,7.82,0,0,1,228.23,134.69Z`,opacity:`0.2`}),x.createElement(`path`,{d:`M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z`}))],[`fill`,x.createElement(x.Fragment,null,x.createElement(`path`,{d:`M240,128a15.74,15.74,0,0,1-7.6,13.51L88.32,229.65a16,16,0,0,1-16.2.3A15.86,15.86,0,0,1,64,216.13V39.87a15.86,15.86,0,0,1,8.12-13.82,16,16,0,0,1,16.2.3L232.4,114.49A15.74,15.74,0,0,1,240,128Z`}))],[`light`,x.createElement(x.Fragment,null,x.createElement(`path`,{d:`M231.36,116.19,87.28,28.06a14,14,0,0,0-14.18-.27A13.69,13.69,0,0,0,66,39.87V216.13a13.69,13.69,0,0,0,7.1,12.08,14,14,0,0,0,14.18-.27l144.08-88.13a13.82,13.82,0,0,0,0-23.62Zm-6.26,13.38L81,217.7a2,2,0,0,1-2.06,0,1.78,1.78,0,0,1-1-1.61V39.87a1.78,1.78,0,0,1,1-1.61A2.06,2.06,0,0,1,80,38a2,2,0,0,1,1,.31L225.1,126.43a1.82,1.82,0,0,1,0,3.14Z`}))],[`regular`,x.createElement(x.Fragment,null,x.createElement(`path`,{d:`M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z`}))],[`thin`,x.createElement(x.Fragment,null,x.createElement(`path`,{d:`M230.32,117.9,86.24,29.79a11.91,11.91,0,0,0-12.17-.23A11.71,11.71,0,0,0,68,39.89V216.11a11.71,11.71,0,0,0,6.07,10.33,11.91,11.91,0,0,0,12.17-.23L230.32,138.1a11.82,11.82,0,0,0,0-20.2Zm-4.18,13.37L82.06,219.39a4,4,0,0,1-4.07.07,3.77,3.77,0,0,1-2-3.35V39.89a3.77,3.77,0,0,1,2-3.35,4,4,0,0,1,4.07.07l144.08,88.12a3.8,3.8,0,0,1,0,6.54Z`}))]]),S=x.forwardRef((e,t)=>x.createElement(o,{ref:t,...e,weights:ae}));S.displayName=`PlayIcon`;var oe=S,C=t();function w(e){let t=E(e.metadata,e.limit),n=k(e.metadata);return t.length===0&&!n?null:(0,C.jsxs)(`div`,{className:`grid min-w-0 gap-1 text-xs leading-5 text-muted-foreground`,children:[t.length===0?null:(0,C.jsx)(`div`,{className:`flex min-w-0 flex-wrap gap-x-2 gap-y-1`,children:t.map(e=>(0,C.jsxs)(`span`,{className:r(`min-w-0 break-words`,e.tone===`error`?`text-destructive`:`text-muted-foreground`),children:[(0,C.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.key,`=`]}),e.value]},e.key))}),n?(0,C.jsxs)(`details`,{className:`group min-w-0 rounded-lg border border-border bg-muted px-2 py-1`,children:[(0,C.jsx)(`summary`,{className:`cursor-pointer select-none text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground transition group-open:text-foreground`,children:`Details`}),(0,C.jsx)(`pre`,{className:`m-0 mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-words text-xs leading-4 text-muted-foreground`,children:A(e.metadata)})]}):null]})}function T(e,t){return E(e,t).map(e=>`${e.key}=${e.value}`).join(` `)}function E(e,t=6){return Object.entries(e??{}).map(([e,t])=>{let n=e===`error`?`error`:`default`;return{key:e,value:D(e,t),tone:n}}).filter(e=>e.value.length>0).slice(0,t)}function D(e,t){return t===null?`null`:typeof t==`string`||typeof t==`number`||typeof t==`boolean`?String(t):Array.isArray(t)?`[${t.length}]`:M(t)?e===`error`?O(t):j(t):``}function O(e){let t=typeof e.name==`string`&&e.name.length>0?e.name:void 0,n=typeof e.message==`string`&&e.message.length>0?e.message:void 0;return t!==void 0&&n!==void 0?`${t}: ${n}`:n===void 0?j(e):n}function k(e){return Object.values(e??{}).some(e=>Array.isArray(e)||M(e))}function A(e){if(e===void 0)return``;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function j(e){try{return JSON.stringify(e)}catch{return String(e)}}function M(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var N={pipelineStage:B},P=`var(--muted-foreground)`,F=`var(--foreground)`,I=`var(--background)`,L=`var(--muted-foreground)`,R=`var(--destructive)`,z=`var(--foreground)`;function B(e){let t=e.data.status;return(0,C.jsxs)(`article`,{className:[`group relative min-h-[74px] w-[210px] rounded-none border bg-card px-4 py-3 text-left shadow-[inset_0_1px_0_var(--sb-inset-highlight)] transition duration-200`,e.selected?`border-foreground`:`border-hair`,t===`running`?`translate-y-[-1px] border-foreground`:``,t===`completed`?`border-muted-foreground`:``,t===`failed`?`border-destructive`:``].join(` `),children:[(0,C.jsx)(g,{type:`target`,position:b.Top,className:`!h-0 !w-0 !border-0 !bg-transparent !opacity-0`}),(0,C.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsx)(`div`,{className:`truncate text-sm font-semibold leading-5 tracking-tight text-foreground`,children:e.data.label}),(0,C.jsxs)(`div`,{className:`mt-1 flex items-center gap-1.5`,children:[(0,C.jsx)(`span`,{className:`h-1.5 w-1.5 rounded-lg`,style:{backgroundColor:e.data.statusColor}}),(0,C.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground`,children:e.data.kind})]})]}),t===void 0?null:(0,C.jsx)(`span`,{className:`rounded-lg border border-hair bg-background px-1.5 py-0.5 text-xs font-semibold uppercase tracking-[0.08em]`,style:{color:e.data.statusColor},children:t})]}),e.data.branchKey===void 0?null:(0,C.jsxs)(`div`,{className:`mt-2 truncate text-xs text-muted-foreground`,children:[`branch: `,e.data.branchKey]}),(0,C.jsx)(g,{type:`source`,position:b.Bottom,className:`!h-0 !w-0 !border-0 !bg-transparent !opacity-0`})]})}function V(e,t){let n=new Map;if(t.length===0)return n;for(let r of e){if(r.runId!==t)continue;let e=G(r.metadata,`nodePath`);if(e===void 0)continue;let i=K(e);r.event.endsWith(`.started`)&&n.set(i,`running`),r.event.endsWith(`.completed`)&&n.set(i,`completed`),r.event.endsWith(`.failed`)&&n.set(i,`failed`)}return n}function H(e,t){let n=U(e),r=new Map,i=new Map;for(let e of n.values())i.set(e,(i.get(e)??0)+1);return{nodes:e.nodes.map(e=>{let a=K(e.path),o=n.get(a)??0,s=r.get(o)??0;r.set(o,s+1);let c=i.get(o)??1,l=t.get(a);return{id:a,type:`pipelineStage`,position:{x:(s-(c-1)/2)*280,y:o*170},sourcePosition:b.Bottom,targetPosition:b.Top,data:{label:e.label,kind:e.kind,status:l,statusColor:W(l),branchKey:e.branchKey}}}),edges:e.edges.map(e=>({id:e.id,source:K(e.source),target:K(e.target),type:`smoothstep`,className:`pipeline-flow-edge`,label:e.label,markerEnd:{type:v.ArrowClosed,width:10,height:10,color:P},style:{stroke:P,strokeWidth:1.6,opacity:.78},labelShowBg:!0,labelStyle:{fill:L,fontSize:11,fontWeight:700},labelBgStyle:{fill:I,fillOpacity:.92},labelBgPadding:[6,4],labelBgBorderRadius:2}))}}function U(e){let t=new Map;for(let n of e.nodes)t.set(K(n.path),0);for(let n=0;n<e.nodes.length;n+=1){let n=!1;for(let r of e.edges){let e=K(r.source),i=K(r.target),a=t.get(e);if(a===void 0||!t.has(i))continue;let o=a+1;o>(t.get(i)??0)&&(t.set(i,o),n=!0)}if(!n)break}return t}function W(e){switch(e){case`running`:return z;case`completed`:return P;case`failed`:return R;default:return F}}function G(e,t){let n=e?.[t];return Array.isArray(n)&&n.every(e=>typeof e==`string`)?n:void 0}function K(e){return JSON.stringify(e)}function se(e){let[t,n]=(0,x.useState)(),r=e.detail?.graph,i=r?.nodes.find(e=>K(e.path)===t)??r?.nodes[0]??void 0,a=(0,x.useMemo)(()=>V(e.logs,e.activeRunId),[e.logs,e.activeRunId]),o=(0,x.useMemo)(()=>r===void 0?{nodes:[],edges:[]}:H(r,a),[r,a]);return!e.enabled||!e.detailLoading&&e.pipelines.length===0?(0,C.jsx)(f,{"aria-label":`Pipelines`,children:(0,C.jsx)(p,{title:e.enabled?`No pipelines`:`Pipelines unavailable`,text:e.enabled?`No pipeline records are available in this Studio runtime.`:`This Studio runtime does not expose pipelines.`})}):(0,C.jsx)(f,{children:(0,C.jsx)(`div`,{className:`grid min-h-0 min-w-0 pb-6 pr-6`,children:(0,C.jsxs)(ne,{className:`grid grid-cols-[minmax(0,2fr)_minmax(0,1fr)] max-lg:grid-cols-1`,children:[(0,C.jsxs)(`div`,{className:`relative min-h-0 min-w-0 overflow-hidden border-r border-hair bg-card max-lg:border-b max-lg:border-r-0`,children:[e.detailLoading&&r===void 0?(0,C.jsx)(`div`,{className:`grid h-full min-h-96 place-items-center p-6`,children:(0,C.jsxs)(`div`,{className:`grid w-full max-w-lg gap-3`,children:[(0,C.jsx)(`div`,{className:`h-4 w-40 animate-pulse rounded-lg bg-muted`}),(0,C.jsx)(`div`,{className:`h-16 animate-pulse rounded-lg bg-muted`}),(0,C.jsx)(`div`,{className:`h-16 w-4/5 animate-pulse rounded-lg bg-muted`})]})}):null,!e.detailLoading&&r===void 0?(0,C.jsx)(p,{className:`h-full`,title:e.pipelines.length===0?`No pipelines`:`No pipeline selected`,text:e.pipelines.length===0?`No pipeline records are available in this Studio runtime.`:`Choose a registered pipeline to inspect its graph and runtime logs.`}):null,r===void 0?null:(0,C.jsxs)(h,{nodes:o.nodes,edges:o.edges,className:`pipeline-flow`,style:{"--xy-edge-stroke":`var(--muted-foreground)`,"--xy-edge-stroke-width":`1.6`,"--xy-edge-stroke-selected":`var(--foreground)`},fitView:!0,fitViewOptions:{padding:.18,maxZoom:.96},minZoom:.48,maxZoom:1.35,colorMode:e.theme,nodeTypes:N,proOptions:{hideAttribution:!0},defaultEdgeOptions:{type:`smoothstep`,focusable:!0},onNodeClick:(e,t)=>n(t.id),children:[(0,C.jsx)(re,{variant:_.Dots,gap:14,size:1.8,color:L,className:`opacity-35`}),(0,C.jsx)(y,{showInteractive:!1})]})]}),(0,C.jsx)(ce,{pipelines:e.pipelines,selectedPipelineId:e.selectedPipelineId,detail:e.detail,logs:e.logs,runs:e.runs,logsLoading:e.logsLoading,runsLoading:e.runsLoading,runState:e.runState,runInput:e.runInput,runOutput:e.runOutput,activeTab:e.activeTab,selectedNode:i,selectedNodeStatus:i?.id===void 0?void 0:a.get(i.id),onSelectPipeline:t=>{n(void 0),e.onSelectPipeline(t)},onRunInputChange:e.onRunInputChange,onRun:e.onRun,onTabChange:e.onTabChange,onReplayRun:e.onReplayRun})]})})})}function ce(e){let t=e.detail?.graph,n=t===void 0?void 0:{nodes:t.nodes.length,edges:t.edges.length,agents:t.nodes.filter(e=>e.kind===`agent`).length,extractors:t.nodes.filter(e=>e.kind===`extractor`).length,parallel:t.nodes.some(e=>e.kind===`parallel`)?`yes`:`no`};return(0,C.jsxs)(`aside`,{className:`grid min-h-0 min-w-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background`,children:[(0,C.jsxs)(`header`,{className:`grid gap-3 bg-card px-4 py-4`,children:[(0,C.jsxs)(`div`,{className:`grid gap-3`,children:[(0,C.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-4`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsx)(`h1`,{className:`m-0 truncate text-base font-semibold tracking-tight text-foreground`,children:e.detail?.name??`Pipeline`}),e.detail?.description===void 0?null:(0,C.jsx)(`p`,{className:`m-0 mt-1 line-clamp-2 text-xs leading-5 text-muted-foreground`,children:e.detail.description})]}),(0,C.jsx)(`span`,{className:`shrink-0 text-xs font-semibold tabular-nums text-muted-foreground`,children:e.logs.length})]}),(0,C.jsxs)(d,{value:e.selectedPipelineId,onValueChange:e.onSelectPipeline,children:[(0,C.jsx)(l,{className:`h-8 w-full rounded-lg border-hair bg-background text-xs hover:border-foreground focus:border-foreground focus:ring-ring`,children:(0,C.jsx)(c,{placeholder:`Select pipeline`})}),(0,C.jsx)(ee,{children:e.pipelines.map(e=>(0,C.jsx)(u,{value:e.id,children:e.name??e.id},e.id))})]})]}),(0,C.jsx)(ue,{activeTab:e.activeTab,onChange:e.onTabChange})]}),(0,C.jsxs)(`div`,{className:[`min-h-0 min-w-0 px-5 py-5`,e.activeTab===`logs`?`grid overflow-hidden`:`overflow-auto`].join(` `),children:[e.activeTab===`input`?(0,C.jsx)(`div`,{"aria-labelledby":q(`input`),id:J(`input`),role:`tabpanel`,children:(0,C.jsx)(de,{runInput:e.runInput,runState:e.runState,disabled:e.detail===void 0,onRunInputChange:e.onRunInputChange,onRun:e.onRun})}):null,e.activeTab===`metadata`?(0,C.jsx)(`div`,{"aria-labelledby":q(`metadata`),id:J(`metadata`),role:`tabpanel`,children:(0,C.jsx)(fe,{graphStats:n,selectedNode:e.selectedNode,selectedNodeStatus:e.selectedNodeStatus})}):null,e.activeTab===`runs`?(0,C.jsx)(`div`,{"aria-labelledby":q(`runs`),id:J(`runs`),role:`tabpanel`,children:(0,C.jsx)(pe,{runs:e.runs,runOutput:e.runOutput,runState:e.runState,loading:e.runsLoading,onReplayRun:e.onReplayRun})}):null,e.activeTab===`logs`?(0,C.jsx)(`div`,{"aria-labelledby":q(`logs`),id:J(`logs`),role:`tabpanel`,children:(0,C.jsx)(ye,{logs:e.logs,selectedPipelineId:e.selectedPipelineId,loading:e.logsLoading})}):null]})]})}var le=[{id:`input`,label:`Input`},{id:`metadata`,label:`Metadata`},{id:`runs`,label:`Runs`},{id:`logs`,label:`Logs`}];function ue(e){return(0,C.jsx)(te,{className:`grid-cols-4`,role:`tablist`,"aria-label":`Pipeline sidebar`,children:le.map(t=>(0,C.jsx)(`button`,{"aria-controls":J(t.id),"aria-selected":e.activeTab===t.id,className:[`h-8 rounded-lg px-2 text-xs font-semibold uppercase tracking-[0.1em] transition duration-200`,e.activeTab===t.id?`bg-foreground text-background`:`text-muted-foreground hover:bg-transparent hover:text-foreground`].join(` `),id:q(t.id),onClick:()=>e.onChange(t.id),role:`tab`,type:`button`,children:t.label},t.id))})}function q(e){return`pipeline-tab-${e}`}function J(e){return`pipeline-panel-${e}`}function Y(e){return(0,C.jsxs)(`div`,{className:`min-w-0 rounded-lg bg-background px-2.5 py-2.5`,children:[(0,C.jsx)(`div`,{className:`truncate text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground`,children:e.label}),(0,C.jsx)(`div`,{className:`mt-1 truncate text-base font-semibold tabular-nums text-foreground`,children:e.value})]})}function de(e){return(0,C.jsxs)(`section`,{className:`grid gap-4`,children:[(0,C.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Pipeline input`}),(0,C.jsx)(`p`,{className:`m-0 mt-1 text-xs leading-5 text-muted-foreground`,children:`Provide JSON-compatible input for this pipeline run.`})]}),(0,C.jsxs)(i,{className:`h-8 shrink-0 gap-1.5 rounded-lg border border-primary bg-primary px-3 text-xs font-semibold text-primary-foreground shadow-none hover:border-action-hover hover:bg-action-hover hover:text-primary-foreground disabled:border-border disabled:bg-muted disabled:text-muted-foreground [&_svg]:!size-3`,disabled:e.runState===`running`||e.disabled,onClick:e.onRun,variant:`ghost`,children:[(0,C.jsx)(s,{icon:oe,"aria-hidden":`true`}),e.runState===`running`?`Running`:`Run`]})]}),(0,C.jsxs)(`label`,{className:`grid gap-2`,htmlFor:`pipeline-run-input`,children:[(0,C.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:`JSON`}),(0,C.jsx)(m,{id:`pipeline-run-input`,value:e.runInput,onChange:t=>e.onRunInputChange(t.target.value),className:`min-h-44 resize-y rounded-lg border-border bg-card text-xs leading-5 text-foreground`,spellCheck:!1})]})]})}function fe(e){return(0,C.jsxs)(`section`,{className:`grid gap-5`,children:[e.graphStats===void 0?null:(0,C.jsxs)(`div`,{className:`grid grid-cols-5 gap-2`,children:[(0,C.jsx)(Y,{label:`Nodes`,value:String(e.graphStats.nodes)}),(0,C.jsx)(Y,{label:`Edges`,value:String(e.graphStats.edges)}),(0,C.jsx)(Y,{label:`Agents`,value:String(e.graphStats.agents)}),(0,C.jsx)(Y,{label:`Extractors`,value:String(e.graphStats.extractors)}),(0,C.jsx)(Y,{label:`Parallel`,value:e.graphStats.parallel})]}),(0,C.jsx)(ve,{node:e.selectedNode,status:e.selectedNodeStatus})]})}function pe(e){return(0,C.jsxs)(`section`,{className:`grid gap-3`,children:[(0,C.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Runs`}),(0,C.jsx)(`p`,{className:`m-0 mt-1 text-xs leading-5 text-muted-foreground`,children:`Persisted pipeline executions.`})]}),(0,C.jsx)(Q,{children:e.runState})]}),e.runOutput.length>0&&e.runs.length===0?(0,C.jsx)(X,{title:`Latest output`,output:e.runOutput}):null,(0,C.jsxs)(`div`,{className:`grid gap-2`,children:[e.loading&&e.runs.length===0?(0,C.jsxs)(`div`,{className:`grid gap-2 py-3`,children:[(0,C.jsx)(`div`,{className:`h-4 w-32 animate-pulse rounded-lg bg-muted`}),(0,C.jsx)(`div`,{className:`h-4 w-56 max-w-full animate-pulse rounded-lg bg-muted`})]}):null,!e.loading&&e.runs.length===0?(0,C.jsx)(p,{size:`compact`,title:`No saved pipeline runs`,text:`Run this pipeline to create its first persisted execution.`}):null,e.runs.map(t=>(0,C.jsx)(me,{disabled:e.runState===`running`,run:t,onReplayRun:e.onReplayRun},t.runId))]})]})}function me(e){let t=he(e.run);return(0,C.jsxs)(`article`,{className:`rounded-none border border-hair bg-background px-4 py-4`,children:[(0,C.jsxs)(`div`,{className:`grid min-w-0 gap-3 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-start`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,C.jsx)(`span`,{className:[`rounded-md border border-hair bg-card px-2 py-1 text-xs font-semibold uppercase tracking-[0.08em]`,_e(e.run.status)].join(` `),children:e.run.status}),(0,C.jsx)(`span`,{className:`min-w-0 truncate text-xs font-semibold text-foreground`,children:e.run.runId})]}),(0,C.jsxs)(`div`,{className:`mt-2 flex min-w-0 flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground`,children:[(0,C.jsx)(`time`,{children:$(e.run.startedAt)}),e.run.durationMs===void 0?null:(0,C.jsxs)(`span`,{className:`tabular-nums`,children:[e.run.durationMs,`ms`]})]})]}),(0,C.jsxs)(i,{className:`h-8 gap-1.5 rounded-lg border border-hair bg-muted px-2.5 text-xs font-semibold text-foreground shadow-none hover:border-foreground hover:bg-transparent hover:text-foreground [&_svg]:!size-3`,disabled:e.disabled||e.run.status===`running`,onClick:()=>e.onReplayRun(e.run.runId),title:`Rerun this pipeline with its saved input`,variant:`ghost`,children:[(0,C.jsx)(s,{icon:a,"aria-hidden":`true`}),`Rerun`]})]}),(0,C.jsx)(X,{title:`Output`,output:t})]})}function X(e){return(0,C.jsxs)(`div`,{className:`mt-4 border-t border-hair pt-3`,children:[(0,C.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,C.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.title}),(0,C.jsxs)(`span`,{className:` text-xs font-medium tabular-nums text-muted-foreground`,children:[e.output.length,` chars`]})]}),(0,C.jsx)(`pre`,{className:`mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-lg bg-card p-3 text-sm leading-6 text-foreground`,children:e.output.length>0?(0,C.jsx)(Z,{text:e.output}):`No output saved.`})]})}function he(e){return e.output===void 0?e.error===void 0?``:JSON.stringify(e.error,null,2):typeof e.output==`string`?e.output:JSON.stringify(e.output,null,2)}function Z(e){return ge(e.text)?(0,C.jsx)(ie,{text:e.text}):e.text}function ge(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function _e(e){switch(e){case`success`:return`text-foreground`;case`error`:return`text-destructive`;case`running`:return`text-muted-foreground`}}function ve(e){if(e.node===void 0)return(0,C.jsx)(`section`,{className:`text-sm font-medium text-muted-foreground`,children:`Select a node for details.`});let t=Object.entries(e.node.metadata??{});return(0,C.jsxs)(`section`,{className:`grid content-start gap-5`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Selected node`}),(0,C.jsx)(`h2`,{className:`m-0 mt-2 text-lg font-semibold tracking-tight text-foreground`,children:e.node.label}),(0,C.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:[(0,C.jsx)(Q,{children:e.node.kind}),e.status===void 0?null:(0,C.jsx)(Q,{children:e.status}),e.node.branchKey===void 0?null:(0,C.jsx)(Q,{children:e.node.branchKey})]})]}),e.node.description===void 0?null:(0,C.jsx)(`p`,{className:`m-0 rounded-lg bg-muted px-3 py-2 text-sm leading-6 text-muted-foreground`,children:e.node.description}),(0,C.jsx)(xe,{items:[[`ID`,e.node.id],[`Agent`,e.node.agentId],[`Pipeline`,e.node.pipelineId]]}),t.length>0?(0,C.jsxs)(`div`,{className:`grid gap-2`,children:[(0,C.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Metadata`}),(0,C.jsx)(`div`,{className:`grid gap-1`,children:t.map(([e,t])=>(0,C.jsxs)(`div`,{className:`grid grid-cols-[82px_minmax(0,1fr)] gap-2 text-xs`,children:[(0,C.jsx)(`span`,{className:`truncate text-muted-foreground`,children:e}),(0,C.jsx)(`span`,{className:`truncate font-medium text-foreground`,children:Se(t)})]},e))})]}):null]})}function ye(e){let t=(0,x.useRef)(null),n=(0,x.useRef)(!0);(0,x.useEffect)(()=>{let e=t.current;e===null||!n.current||(e.scrollTop=e.scrollHeight)});function r(){let e=t.current;e!==null&&(n.current=e.scrollHeight-e.scrollTop-e.clientHeight<24)}return(0,C.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] gap-3`,children:[(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Pipeline logs`}),(0,C.jsx)(`div`,{className:`mt-1 truncate text-xs font-medium text-muted-foreground`,children:e.selectedPipelineId.length===0?`No active pipeline`:e.selectedPipelineId})]}),(0,C.jsx)(`span`,{className:` text-xs font-semibold tabular-nums text-muted-foreground`,children:e.logs.length})]}),(0,C.jsxs)(`div`,{className:`min-h-0 overflow-auto border-t bg-background p-2`,ref:t,onScroll:r,children:[e.selectedPipelineId.length===0?(0,C.jsx)(p,{size:`compact`,title:`No pipeline selected`,text:`Choose a pipeline to view its runtime logs.`}):null,e.selectedPipelineId.length>0&&e.loading&&e.logs.length===0?(0,C.jsxs)(`div`,{className:`grid gap-2 py-4`,children:[(0,C.jsx)(`div`,{className:`h-4 w-32 animate-pulse rounded-lg bg-muted`}),(0,C.jsx)(`div`,{className:`h-4 w-64 max-w-full animate-pulse rounded-lg bg-muted`}),(0,C.jsx)(`div`,{className:`h-4 w-52 max-w-full animate-pulse rounded-lg bg-muted`})]}):null,e.selectedPipelineId.length>0&&!e.loading&&e.logs.length===0?(0,C.jsx)(p,{size:`compact`,title:`No logs yet`,text:`Run the pipeline to populate this console.`}):null,e.logs.map(e=>(0,C.jsx)(be,{log:e},e.id))]})]})}function be(e){let t=T(e.log.metadata,4),n=[$(e.log.timestamp),e.log.level.toUpperCase().padEnd(5,` `),e.log.message,`${e.log.category}/${e.log.event}`,t].filter(e=>e.trim().length>0).join(` `);return(0,C.jsxs)(`article`,{className:[`min-w-full rounded-lg px-3 py-1.5 text-xs leading-5 transition duration-200 hover:bg-transparent hover:text-foreground`].join(` `),title:n,children:[(0,C.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-baseline gap-x-3 gap-y-1`,children:[(0,C.jsx)(`time`,{className:`shrink-0 text-muted-foreground`,children:$(e.log.timestamp)}),(0,C.jsx)(`span`,{className:[`shrink-0 font-semibold`,Ce(e.log.level)].join(` `),children:e.log.level.toUpperCase().padEnd(5,` `)}),(0,C.jsx)(`span`,{className:`min-w-0 break-words font-medium text-foreground`,children:e.log.message})]}),(0,C.jsxs)(`div`,{className:`mt-1 min-w-0 break-words text-muted-foreground`,children:[e.log.category,`/`,e.log.event]}),(0,C.jsx)(w,{metadata:e.log.metadata,limit:4})]})}function xe(e){let t=e.items.filter(([,e])=>e!==void 0&&e.length>0);return t.length===0?null:(0,C.jsx)(`div`,{className:`grid gap-2 rounded-none bg-background p-3`,children:t.map(([e,t])=>(0,C.jsxs)(`div`,{className:`grid grid-cols-[82px_minmax(0,1fr)] gap-2 text-xs`,children:[(0,C.jsx)(`span`,{className:`truncate text-muted-foreground`,children:e}),(0,C.jsx)(`span`,{className:`truncate font-medium text-foreground`,children:t})]},e))})}function Q(e){return(0,C.jsx)(`span`,{className:`rounded-lg border border-hair bg-background px-2 py-1 text-xs font-semibold uppercase tracking-[0.08em] text-muted-foreground`,children:e.children})}function $(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}function Se(e){return e===null?`null`:typeof e==`string`||typeof e==`number`||typeof e==`boolean`?String(e):Array.isArray(e)?`[${e.length}]`:typeof e==`object`&&e?`{...}`:``}function Ce(e){switch(e){case`error`:return`text-destructive`;case`warn`:return`text-muted-foreground`;case`debug`:return`text-muted-foreground`;case`info`:return`text-foreground`}}export{se as PipelinesPage};
|
|
2
|
-
//# sourceMappingURL=pipelines-page-DAqa699J.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pipelines-page-DAqa699J.js","names":["a","t","m"],"sources":["../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Play.es.js","../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Play.es.js","../../../src/ui/app/modules/shared/log-metadata.tsx","../../../src/ui/app/modules/pipelines/pipeline-flow.tsx","../../../src/ui/app/modules/pipelines/pipelines-page.tsx"],"sourcesContent":["import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M234.49,111.07,90.41,22.94A20,20,0,0,0,60,39.87V216.13a20,20,0,0,0,30.41,16.93l144.08-88.13a19.82,19.82,0,0,0,0-33.86ZM84,208.85V47.15L216.16,128Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n \"path\",\n {\n d: \"M228.23,134.69,84.15,222.81A8,8,0,0,1,72,216.12V39.88a8,8,0,0,1,12.15-6.69l144.08,88.12A7.82,7.82,0,0,1,228.23,134.69Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M240,128a15.74,15.74,0,0,1-7.6,13.51L88.32,229.65a16,16,0,0,1-16.2.3A15.86,15.86,0,0,1,64,216.13V39.87a15.86,15.86,0,0,1,8.12-13.82,16,16,0,0,1,16.2.3L232.4,114.49A15.74,15.74,0,0,1,240,128Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M231.36,116.19,87.28,28.06a14,14,0,0,0-14.18-.27A13.69,13.69,0,0,0,66,39.87V216.13a13.69,13.69,0,0,0,7.1,12.08,14,14,0,0,0,14.18-.27l144.08-88.13a13.82,13.82,0,0,0,0-23.62Zm-6.26,13.38L81,217.7a2,2,0,0,1-2.06,0,1.78,1.78,0,0,1-1-1.61V39.87a1.78,1.78,0,0,1,1-1.61A2.06,2.06,0,0,1,80,38a2,2,0,0,1,1,.31L225.1,126.43a1.82,1.82,0,0,1,0,3.14Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M230.32,117.9,86.24,29.79a11.91,11.91,0,0,0-12.17-.23A11.71,11.71,0,0,0,68,39.89V216.11a11.71,11.71,0,0,0,6.07,10.33,11.91,11.91,0,0,0,12.17-.23L230.32,138.1a11.82,11.82,0,0,0,0-20.2Zm-4.18,13.37L82.06,219.39a4,4,0,0,1-4.07.07,3.77,3.77,0,0,1-2-3.35V39.89a3.77,3.77,0,0,1,2-3.35,4,4,0,0,1,4.07.07l144.08,88.12a3.8,3.8,0,0,1,0,6.54Z\" }))\n ]\n]);\nexport {\n a as default\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Play.es.js\";\nconst a = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...e, weights: m }));\na.displayName = \"PlayIcon\";\nconst n = a;\nexport {\n n as Play,\n a as PlayIcon\n};\n","import { cn } from \"../../lib/utils\";\n\ntype MetadataValue = unknown;\n\ntype InlineMetadataItem = {\n key: string;\n value: string;\n tone: \"default\" | \"error\";\n};\n\nexport function LogMetadata(props: {\n metadata?: Record<string, MetadataValue> | undefined;\n limit?: number;\n}) {\n const items = inlineMetadataItems(props.metadata, props.limit);\n const hasStructuredDetails = hasStructuredMetadata(props.metadata);\n if (items.length === 0 && !hasStructuredDetails) {\n return null;\n }\n return (\n <div className=\"grid min-w-0 gap-1 text-xs leading-5 text-muted-foreground\">\n {items.length === 0 ? null : (\n <div className=\"flex min-w-0 flex-wrap gap-x-2 gap-y-1\">\n {items.map((item) => (\n <span\n className={cn(\n \"min-w-0 break-words\",\n item.tone === \"error\" ? \"text-destructive\" : \"text-muted-foreground\",\n )}\n key={item.key}\n >\n <span className=\"text-muted-foreground\">{item.key}=</span>\n {item.value}\n </span>\n ))}\n </div>\n )}\n {hasStructuredDetails ? (\n <details className=\"group min-w-0 rounded-lg border border-border bg-muted px-2 py-1\">\n <summary className=\"cursor-pointer select-none text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground transition group-open:text-foreground\">\n Details\n </summary>\n <pre className=\"m-0 mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-words text-xs leading-4 text-muted-foreground\">\n {formatStructuredDetails(props.metadata)}\n </pre>\n </details>\n ) : null}\n </div>\n );\n}\n\nexport function formatLogMetadataText(\n metadata?: Record<string, MetadataValue>,\n limit?: number,\n): string {\n return inlineMetadataItems(metadata, limit)\n .map((item) => `${item.key}=${item.value}`)\n .join(\" \");\n}\n\nfunction inlineMetadataItems(\n metadata?: Record<string, MetadataValue>,\n limit = 6,\n): InlineMetadataItem[] {\n return Object.entries(metadata ?? {})\n .map(([key, value]): InlineMetadataItem => {\n const tone: InlineMetadataItem[\"tone\"] = key === \"error\" ? \"error\" : \"default\";\n return {\n key,\n value: formatInlineMetadataValue(key, value),\n tone,\n };\n })\n .filter((item) => item.value.length > 0)\n .slice(0, limit);\n}\n\nfunction formatInlineMetadataValue(key: string, value: MetadataValue): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `[${value.length}]`;\n }\n if (isRecord(value)) {\n if (key === \"error\") {\n return formatErrorMetadata(value);\n }\n return compactJson(value);\n }\n return \"\";\n}\n\nfunction formatErrorMetadata(value: Record<string, MetadataValue>): string {\n const name = typeof value.name === \"string\" && value.name.length > 0 ? value.name : undefined;\n const message =\n typeof value.message === \"string\" && value.message.length > 0 ? value.message : undefined;\n if (name !== undefined && message !== undefined) {\n return `${name}: ${message}`;\n }\n if (message !== undefined) {\n return message;\n }\n return compactJson(value);\n}\n\nfunction hasStructuredMetadata(metadata?: Record<string, MetadataValue>): boolean {\n return Object.values(metadata ?? {}).some((value) => Array.isArray(value) || isRecord(value));\n}\n\nfunction formatStructuredDetails(metadata?: Record<string, MetadataValue>): string {\n if (metadata === undefined) {\n return \"\";\n }\n try {\n return JSON.stringify(metadata, null, 2);\n } catch {\n return String(metadata);\n }\n}\n\nfunction compactJson(value: MetadataValue): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction isRecord(value: MetadataValue): value is Record<string, MetadataValue> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { type Edge, Handle, MarkerType, type Node, type NodeProps, Position } from \"@xyflow/react\";\nimport type { StudioPipelineDetail, StudioPipelineLogEntry } from \"../../../../types\";\n\nexport const nodeTypes = {\n pipelineStage: PipelineStageNode,\n};\n\nexport type PipelineFlow = { nodes: Node[]; edges: Edge[] };\n\nconst flowEdgeColor = \"var(--muted-foreground)\";\nconst flowSelectedColor = \"var(--foreground)\";\nconst flowBackgroundColor = \"var(--background)\";\nexport const flowMutedForegroundColor = \"var(--muted-foreground)\";\nconst flowDestructiveColor = \"var(--destructive)\";\nconst flowRunningColor = \"var(--foreground)\";\n\ntype PipelineNodeData = {\n label: string;\n kind: StudioPipelineDetail[\"graph\"][\"nodes\"][number][\"kind\"];\n status: NodeStatus | undefined;\n statusColor: string;\n branchKey: string | undefined;\n};\n\nfunction PipelineStageNode(props: NodeProps<Node<PipelineNodeData>>) {\n const status = props.data.status;\n return (\n <article\n className={[\n \"group relative min-h-[74px] w-[210px] rounded-none border bg-card px-4 py-3 text-left shadow-[inset_0_1px_0_var(--sb-inset-highlight)] transition duration-200\",\n props.selected ? \"border-foreground\" : \"border-hair\",\n status === \"running\" ? \"translate-y-[-1px] border-foreground\" : \"\",\n status === \"completed\" ? \"border-muted-foreground\" : \"\",\n status === \"failed\" ? \"border-destructive\" : \"\",\n ].join(\" \")}\n >\n <Handle\n type=\"target\"\n position={Position.Top}\n className=\"!h-0 !w-0 !border-0 !bg-transparent !opacity-0\"\n />\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold leading-5 tracking-tight text-foreground\">\n {props.data.label}\n </div>\n <div className=\"mt-1 flex items-center gap-1.5\">\n <span\n className=\"h-1.5 w-1.5 rounded-lg\"\n style={{ backgroundColor: props.data.statusColor }}\n />\n <span className=\" text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {props.data.kind}\n </span>\n </div>\n </div>\n {status === undefined ? null : (\n <span\n className=\"rounded-lg border border-hair bg-background px-1.5 py-0.5 text-xs font-semibold uppercase tracking-[0.08em]\"\n style={{ color: props.data.statusColor }}\n >\n {status}\n </span>\n )}\n </div>\n {props.data.branchKey === undefined ? null : (\n <div className=\"mt-2 truncate text-xs text-muted-foreground\">\n branch: {props.data.branchKey}\n </div>\n )}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n className=\"!h-0 !w-0 !border-0 !bg-transparent !opacity-0\"\n />\n </article>\n );\n}\n\nexport type NodeStatus = \"running\" | \"completed\" | \"failed\";\n\nexport function nodeStatusFromLogs(\n logs: StudioPipelineLogEntry[],\n activeRunId: string,\n): Map<string, NodeStatus> {\n const statuses = new Map<string, NodeStatus>();\n if (activeRunId.length === 0) {\n return statuses;\n }\n for (const log of logs) {\n if (log.runId !== activeRunId) {\n continue;\n }\n const nodePath = metadataPath(log.metadata, \"nodePath\");\n if (nodePath === undefined) {\n continue;\n }\n const nodeId = pipelineNodeKey(nodePath);\n if (log.event.endsWith(\".started\")) {\n statuses.set(nodeId, \"running\");\n }\n if (log.event.endsWith(\".completed\")) {\n statuses.set(nodeId, \"completed\");\n }\n if (log.event.endsWith(\".failed\")) {\n statuses.set(nodeId, \"failed\");\n }\n }\n return statuses;\n}\n\nexport function toFlow(\n graph: StudioPipelineDetail[\"graph\"],\n statuses: Map<string, NodeStatus>,\n): PipelineFlow {\n const depths = nodeDepths(graph);\n const depthSlots = new Map<number, number>();\n const depthCounts = new Map<number, number>();\n for (const depth of depths.values()) {\n depthCounts.set(depth, (depthCounts.get(depth) ?? 0) + 1);\n }\n\n const nodes: Node[] = graph.nodes.map((node) => {\n const nodeId = pipelineNodeKey(node.path);\n const depth = depths.get(nodeId) ?? 0;\n const slot = depthSlots.get(depth) ?? 0;\n depthSlots.set(depth, slot + 1);\n const count = depthCounts.get(depth) ?? 1;\n const status = statuses.get(nodeId);\n return {\n id: nodeId,\n type: \"pipelineStage\",\n position: {\n x: (slot - (count - 1) / 2) * 280,\n y: depth * 170,\n },\n sourcePosition: Position.Bottom,\n targetPosition: Position.Top,\n data: {\n label: node.label,\n kind: node.kind,\n status,\n statusColor: statusColor(status),\n branchKey: node.branchKey,\n },\n };\n });\n\n const edges: Edge[] = graph.edges.map((edge) => ({\n id: edge.id,\n source: pipelineNodeKey(edge.source),\n target: pipelineNodeKey(edge.target),\n type: \"smoothstep\",\n className: \"pipeline-flow-edge\",\n label: edge.label,\n markerEnd: {\n type: MarkerType.ArrowClosed,\n width: 10,\n height: 10,\n color: flowEdgeColor,\n },\n style: {\n stroke: flowEdgeColor,\n strokeWidth: 1.6,\n opacity: 0.78,\n },\n labelShowBg: true,\n labelStyle: {\n fill: flowMutedForegroundColor,\n fontSize: 11,\n fontWeight: 700,\n },\n labelBgStyle: {\n fill: flowBackgroundColor,\n fillOpacity: 0.92,\n },\n labelBgPadding: [6, 4],\n labelBgBorderRadius: 2,\n }));\n\n return { nodes, edges };\n}\n\nfunction nodeDepths(graph: StudioPipelineDetail[\"graph\"]): Map<string, number> {\n const depths = new Map<string, number>();\n for (const node of graph.nodes) {\n depths.set(pipelineNodeKey(node.path), 0);\n }\n\n for (let index = 0; index < graph.nodes.length; index += 1) {\n let changed = false;\n for (const edge of graph.edges) {\n const source = pipelineNodeKey(edge.source);\n const target = pipelineNodeKey(edge.target);\n const sourceDepth = depths.get(source);\n if (sourceDepth === undefined || !depths.has(target)) {\n continue;\n }\n const nextDepth = sourceDepth + 1;\n if (nextDepth > (depths.get(target) ?? 0)) {\n depths.set(target, nextDepth);\n changed = true;\n }\n }\n if (!changed) {\n break;\n }\n }\n return depths;\n}\n\nfunction statusColor(status: NodeStatus | undefined): string {\n switch (status) {\n case \"running\":\n return flowRunningColor;\n case \"completed\":\n return flowEdgeColor;\n case \"failed\":\n return flowDestructiveColor;\n default:\n return flowSelectedColor;\n }\n}\n\nfunction metadataPath(\n metadata: StudioPipelineLogEntry[\"metadata\"],\n key: string,\n): string[] | undefined {\n const value = metadata?.[key];\n return Array.isArray(value) && value.every((segment) => typeof segment === \"string\")\n ? value\n : undefined;\n}\n\nexport function pipelineNodeKey(path: readonly string[]): string {\n return JSON.stringify(path);\n}\n","import { Background, BackgroundVariant, Controls, ReactFlow } from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { ArrowClockwise, Play } from \"@phosphor-icons/react\";\nimport { type CSSProperties, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n StudioConfig,\n StudioPipelineDetail,\n StudioPipelineLogEntry,\n StudioPipelineRunRecord,\n} from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport {\n StudioEmptyState,\n StudioPageShell,\n StudioSurface,\n StudioTabs,\n} from \"../../components/ui/studio\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport { formatLogMetadataText, LogMetadata } from \"../shared/log-metadata\";\nimport { JsonSyntax } from \"../shared/renderers\";\nimport {\n flowMutedForegroundColor,\n type NodeStatus,\n nodeStatusFromLogs,\n nodeTypes,\n type PipelineFlow,\n pipelineNodeKey,\n toFlow,\n} from \"./pipeline-flow\";\n\nexport function PipelinesPage(props: {\n pipelines: StudioConfig[\"pipelines\"];\n selectedPipelineId: string;\n detail: StudioPipelineDetail | undefined;\n logs: StudioPipelineLogEntry[];\n activeRunId: string;\n runs: StudioPipelineRunRecord[];\n enabled: boolean;\n detailLoading: boolean;\n logsLoading: boolean;\n runsLoading: boolean;\n runState: \"idle\" | \"running\";\n runInput: string;\n runOutput: string;\n theme: \"light\" | \"dark\";\n activeTab: PipelineSidebarTab;\n onSelectPipeline: (pipelineId: string) => void;\n onRunInputChange: (value: string) => void;\n onRun: () => void;\n onTabChange: (tab: PipelineSidebarTab) => void;\n onReplayRun: (runId: string) => void;\n}) {\n const [selectedNodeId, setSelectedNodeId] = useState<string | undefined>();\n const graph = props.detail?.graph;\n const selectedNode =\n graph?.nodes.find((node) => pipelineNodeKey(node.path) === selectedNodeId) ??\n graph?.nodes[0] ??\n undefined;\n const nodeStatuses = useMemo(\n () => nodeStatusFromLogs(props.logs, props.activeRunId),\n [props.logs, props.activeRunId],\n );\n const flow = useMemo(() => {\n if (graph === undefined) {\n return { nodes: [], edges: [] } satisfies PipelineFlow;\n }\n return toFlow(graph, nodeStatuses);\n }, [graph, nodeStatuses]);\n\n if (!props.enabled || (!props.detailLoading && props.pipelines.length === 0)) {\n return (\n <StudioPageShell aria-label=\"Pipelines\">\n <StudioEmptyState\n title={props.enabled ? \"No pipelines\" : \"Pipelines unavailable\"}\n text={\n props.enabled\n ? \"No pipeline records are available in this Studio runtime.\"\n : \"This Studio runtime does not expose pipelines.\"\n }\n />\n </StudioPageShell>\n );\n }\n\n return (\n <StudioPageShell>\n <div className=\"grid min-h-0 min-w-0 pb-6 pr-6\">\n <StudioSurface className=\"grid grid-cols-[minmax(0,2fr)_minmax(0,1fr)] max-lg:grid-cols-1\">\n <div className=\"relative min-h-0 min-w-0 overflow-hidden border-r border-hair bg-card max-lg:border-b max-lg:border-r-0\">\n {props.detailLoading && graph === undefined ? (\n <div className=\"grid h-full min-h-96 place-items-center p-6\">\n <div className=\"grid w-full max-w-lg gap-3\">\n <div className=\"h-4 w-40 animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-16 animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-16 w-4/5 animate-pulse rounded-lg bg-muted\" />\n </div>\n </div>\n ) : null}\n {!props.detailLoading && graph === undefined ? (\n <StudioEmptyState\n className=\"h-full\"\n title={props.pipelines.length === 0 ? \"No pipelines\" : \"No pipeline selected\"}\n text={\n props.pipelines.length === 0\n ? \"No pipeline records are available in this Studio runtime.\"\n : \"Choose a registered pipeline to inspect its graph and runtime logs.\"\n }\n />\n ) : null}\n {graph !== undefined ? (\n <ReactFlow\n nodes={flow.nodes}\n edges={flow.edges}\n className=\"pipeline-flow\"\n style={\n {\n \"--xy-edge-stroke\": \"var(--muted-foreground)\",\n \"--xy-edge-stroke-width\": \"1.6\",\n \"--xy-edge-stroke-selected\": \"var(--foreground)\",\n } as CSSProperties\n }\n fitView\n fitViewOptions={{ padding: 0.18, maxZoom: 0.96 }}\n minZoom={0.48}\n maxZoom={1.35}\n colorMode={props.theme}\n nodeTypes={nodeTypes}\n proOptions={{ hideAttribution: true }}\n defaultEdgeOptions={{\n type: \"smoothstep\",\n focusable: true,\n }}\n onNodeClick={(_, node) => setSelectedNodeId(node.id)}\n >\n <Background\n variant={BackgroundVariant.Dots}\n gap={14}\n size={1.8}\n color={flowMutedForegroundColor}\n className=\"opacity-35\"\n />\n <Controls showInteractive={false} />\n </ReactFlow>\n ) : null}\n </div>\n <PipelineInspectorSidebar\n pipelines={props.pipelines}\n selectedPipelineId={props.selectedPipelineId}\n detail={props.detail}\n logs={props.logs}\n runs={props.runs}\n logsLoading={props.logsLoading}\n runsLoading={props.runsLoading}\n runState={props.runState}\n runInput={props.runInput}\n runOutput={props.runOutput}\n activeTab={props.activeTab}\n selectedNode={selectedNode}\n selectedNodeStatus={\n selectedNode?.id === undefined ? undefined : nodeStatuses.get(selectedNode.id)\n }\n onSelectPipeline={(pipelineId) => {\n setSelectedNodeId(undefined);\n props.onSelectPipeline(pipelineId);\n }}\n onRunInputChange={props.onRunInputChange}\n onRun={props.onRun}\n onTabChange={props.onTabChange}\n onReplayRun={props.onReplayRun}\n />\n </StudioSurface>\n </div>\n </StudioPageShell>\n );\n}\n\nfunction PipelineInspectorSidebar(props: {\n pipelines: StudioConfig[\"pipelines\"];\n selectedPipelineId: string;\n detail: StudioPipelineDetail | undefined;\n logs: StudioPipelineLogEntry[];\n runs: StudioPipelineRunRecord[];\n logsLoading: boolean;\n runsLoading: boolean;\n runState: \"idle\" | \"running\";\n runInput: string;\n runOutput: string;\n activeTab: PipelineSidebarTab;\n selectedNode: NonNullable<StudioPipelineDetail[\"graph\"][\"nodes\"][number]> | undefined;\n selectedNodeStatus: NodeStatus | undefined;\n onSelectPipeline: (pipelineId: string) => void;\n onRunInputChange: (value: string) => void;\n onRun: () => void;\n onTabChange: (tab: PipelineSidebarTab) => void;\n onReplayRun: (runId: string) => void;\n}) {\n const graph = props.detail?.graph;\n const graphStats =\n graph === undefined\n ? undefined\n : {\n nodes: graph.nodes.length,\n edges: graph.edges.length,\n agents: graph.nodes.filter((node) => node.kind === \"agent\").length,\n extractors: graph.nodes.filter((node) => node.kind === \"extractor\").length,\n parallel: graph.nodes.some((node) => node.kind === \"parallel\") ? \"yes\" : \"no\",\n };\n\n return (\n <aside className=\"grid min-h-0 min-w-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background\">\n <header className=\"grid gap-3 bg-card px-4 py-4\">\n <div className=\"grid gap-3\">\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <h1 className=\"m-0 truncate text-base font-semibold tracking-tight text-foreground\">\n {props.detail?.name ?? \"Pipeline\"}\n </h1>\n {props.detail?.description === undefined ? null : (\n <p className=\"m-0 mt-1 line-clamp-2 text-xs leading-5 text-muted-foreground\">\n {props.detail.description}\n </p>\n )}\n </div>\n <span className=\"shrink-0 text-xs font-semibold tabular-nums text-muted-foreground\">\n {props.logs.length}\n </span>\n </div>\n <Select value={props.selectedPipelineId} onValueChange={props.onSelectPipeline}>\n <SelectTrigger className=\"h-8 w-full rounded-lg border-hair bg-background text-xs hover:border-foreground focus:border-foreground focus:ring-ring\">\n <SelectValue placeholder=\"Select pipeline\" />\n </SelectTrigger>\n <SelectContent>\n {props.pipelines.map((pipeline) => (\n <SelectItem key={pipeline.id} value={pipeline.id}>\n {pipeline.name ?? pipeline.id}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <PipelineSidebarTabs activeTab={props.activeTab} onChange={props.onTabChange} />\n </header>\n <div\n className={[\n \"min-h-0 min-w-0 px-5 py-5\",\n props.activeTab === \"logs\" ? \"grid overflow-hidden\" : \"overflow-auto\",\n ].join(\" \")}\n >\n {props.activeTab === \"input\" ? (\n <div\n aria-labelledby={pipelineTabId(\"input\")}\n id={pipelinePanelId(\"input\")}\n role=\"tabpanel\"\n >\n <PipelineInputPanel\n runInput={props.runInput}\n runState={props.runState}\n disabled={props.detail === undefined}\n onRunInputChange={props.onRunInputChange}\n onRun={props.onRun}\n />\n </div>\n ) : null}\n {props.activeTab === \"metadata\" ? (\n <div\n aria-labelledby={pipelineTabId(\"metadata\")}\n id={pipelinePanelId(\"metadata\")}\n role=\"tabpanel\"\n >\n <PipelineMetadataPanel\n graphStats={graphStats}\n selectedNode={props.selectedNode}\n selectedNodeStatus={props.selectedNodeStatus}\n />\n </div>\n ) : null}\n {props.activeTab === \"runs\" ? (\n <div aria-labelledby={pipelineTabId(\"runs\")} id={pipelinePanelId(\"runs\")} role=\"tabpanel\">\n <PipelineRunsPanel\n runs={props.runs}\n runOutput={props.runOutput}\n runState={props.runState}\n loading={props.runsLoading}\n onReplayRun={props.onReplayRun}\n />\n </div>\n ) : null}\n {props.activeTab === \"logs\" ? (\n <div aria-labelledby={pipelineTabId(\"logs\")} id={pipelinePanelId(\"logs\")} role=\"tabpanel\">\n <PipelineLogsSection\n logs={props.logs}\n selectedPipelineId={props.selectedPipelineId}\n loading={props.logsLoading}\n />\n </div>\n ) : null}\n </div>\n </aside>\n );\n}\n\nexport type PipelineSidebarTab = \"input\" | \"metadata\" | \"runs\" | \"logs\";\n\nconst pipelineSidebarTabs: Array<{ id: PipelineSidebarTab; label: string }> = [\n { id: \"input\", label: \"Input\" },\n { id: \"metadata\", label: \"Metadata\" },\n { id: \"runs\", label: \"Runs\" },\n { id: \"logs\", label: \"Logs\" },\n];\n\nfunction PipelineSidebarTabs(props: {\n activeTab: PipelineSidebarTab;\n onChange: (tab: PipelineSidebarTab) => void;\n}) {\n return (\n <StudioTabs className=\"grid-cols-4\" role=\"tablist\" aria-label=\"Pipeline sidebar\">\n {pipelineSidebarTabs.map((tab) => (\n <button\n aria-controls={pipelinePanelId(tab.id)}\n aria-selected={props.activeTab === tab.id}\n className={[\n \"h-8 rounded-lg px-2 text-xs font-semibold uppercase tracking-[0.1em] transition duration-200\",\n props.activeTab === tab.id\n ? \"bg-foreground text-background\"\n : \"text-muted-foreground hover:bg-transparent hover:text-foreground\",\n ].join(\" \")}\n key={tab.id}\n id={pipelineTabId(tab.id)}\n onClick={() => props.onChange(tab.id)}\n role=\"tab\"\n type=\"button\"\n >\n {tab.label}\n </button>\n ))}\n </StudioTabs>\n );\n}\n\nfunction pipelineTabId(tab: PipelineSidebarTab): string {\n return `pipeline-tab-${tab}`;\n}\n\nfunction pipelinePanelId(tab: PipelineSidebarTab): string {\n return `pipeline-panel-${tab}`;\n}\n\nfunction Metric(props: { label: string; value: string }) {\n return (\n <div className=\"min-w-0 rounded-lg bg-background px-2.5 py-2.5\">\n <div className=\"truncate text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {props.label}\n </div>\n <div className=\"mt-1 truncate text-base font-semibold tabular-nums text-foreground\">\n {props.value}\n </div>\n </div>\n );\n}\n\nfunction PipelineInputPanel(props: {\n runInput: string;\n runState: \"idle\" | \"running\";\n disabled: boolean;\n onRunInputChange: (value: string) => void;\n onRun: () => void;\n}) {\n return (\n <section className=\"grid gap-4\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Pipeline input\n </div>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n Provide JSON-compatible input for this pipeline run.\n </p>\n </div>\n <Button\n className=\"h-8 shrink-0 gap-1.5 rounded-lg border border-primary bg-primary px-3 text-xs font-semibold text-primary-foreground shadow-none hover:border-action-hover hover:bg-action-hover hover:text-primary-foreground disabled:border-border disabled:bg-muted disabled:text-muted-foreground [&_svg]:!size-3\"\n disabled={props.runState === \"running\" || props.disabled}\n onClick={props.onRun}\n variant=\"ghost\"\n >\n <StudioIcon icon={Play} aria-hidden=\"true\" />\n {props.runState === \"running\" ? \"Running\" : \"Run\"}\n </Button>\n </div>\n <label className=\"grid gap-2\" htmlFor=\"pipeline-run-input\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n JSON\n </span>\n <Textarea\n id=\"pipeline-run-input\"\n value={props.runInput}\n onChange={(event) => props.onRunInputChange(event.target.value)}\n className=\"min-h-44 resize-y rounded-lg border-border bg-card text-xs leading-5 text-foreground\"\n spellCheck={false}\n />\n </label>\n </section>\n );\n}\n\nfunction PipelineMetadataPanel(props: {\n graphStats:\n | {\n nodes: number;\n edges: number;\n agents: number;\n extractors: number;\n parallel: string;\n }\n | undefined;\n selectedNode: NonNullable<StudioPipelineDetail[\"graph\"][\"nodes\"][number]> | undefined;\n selectedNodeStatus: NodeStatus | undefined;\n}) {\n return (\n <section className=\"grid gap-5\">\n {props.graphStats === undefined ? null : (\n <div className=\"grid grid-cols-5 gap-2\">\n <Metric label=\"Nodes\" value={String(props.graphStats.nodes)} />\n <Metric label=\"Edges\" value={String(props.graphStats.edges)} />\n <Metric label=\"Agents\" value={String(props.graphStats.agents)} />\n <Metric label=\"Extractors\" value={String(props.graphStats.extractors)} />\n <Metric label=\"Parallel\" value={props.graphStats.parallel} />\n </div>\n )}\n <NodeInspector node={props.selectedNode} status={props.selectedNodeStatus} />\n </section>\n );\n}\n\nfunction PipelineRunsPanel(props: {\n runs: StudioPipelineRunRecord[];\n runOutput: string;\n runState: \"idle\" | \"running\";\n loading: boolean;\n onReplayRun: (runId: string) => void;\n}) {\n return (\n <section className=\"grid gap-3\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Runs\n </div>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n Persisted pipeline executions.\n </p>\n </div>\n <Badge>{props.runState}</Badge>\n </div>\n {props.runOutput.length > 0 && props.runs.length === 0 ? (\n <PipelineRunOutputBlock title=\"Latest output\" output={props.runOutput} />\n ) : null}\n <div className=\"grid gap-2\">\n {props.loading && props.runs.length === 0 ? (\n <div className=\"grid gap-2 py-3\">\n <div className=\"h-4 w-32 animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-4 w-56 max-w-full animate-pulse rounded-lg bg-muted\" />\n </div>\n ) : null}\n {!props.loading && props.runs.length === 0 ? (\n <StudioEmptyState\n size=\"compact\"\n title=\"No saved pipeline runs\"\n text=\"Run this pipeline to create its first persisted execution.\"\n />\n ) : null}\n {props.runs.map((run) => (\n <PipelineRunRow\n disabled={props.runState === \"running\"}\n run={run}\n key={run.runId}\n onReplayRun={props.onReplayRun}\n />\n ))}\n </div>\n </section>\n );\n}\n\nfunction PipelineRunRow(props: {\n run: StudioPipelineRunRecord;\n disabled: boolean;\n onReplayRun: (runId: string) => void;\n}) {\n const output = pipelineRunOutputText(props.run);\n return (\n <article className=\"rounded-none border border-hair bg-background px-4 py-4\">\n <div className=\"grid min-w-0 gap-3 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-start\">\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span\n className={[\n \"rounded-md border border-hair bg-card px-2 py-1 text-xs font-semibold uppercase tracking-[0.08em]\",\n pipelineRunStatusClass(props.run.status),\n ].join(\" \")}\n >\n {props.run.status}\n </span>\n <span className=\"min-w-0 truncate text-xs font-semibold text-foreground\">\n {props.run.runId}\n </span>\n </div>\n <div className=\"mt-2 flex min-w-0 flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <time>{formatLogTime(props.run.startedAt)}</time>\n {props.run.durationMs === undefined ? null : (\n <span className=\"tabular-nums\">{props.run.durationMs}ms</span>\n )}\n </div>\n </div>\n <Button\n className=\"h-8 gap-1.5 rounded-lg border border-hair bg-muted px-2.5 text-xs font-semibold text-foreground shadow-none hover:border-foreground hover:bg-transparent hover:text-foreground [&_svg]:!size-3\"\n disabled={props.disabled || props.run.status === \"running\"}\n onClick={() => props.onReplayRun(props.run.runId)}\n title=\"Rerun this pipeline with its saved input\"\n variant=\"ghost\"\n >\n <StudioIcon icon={ArrowClockwise} aria-hidden=\"true\" />\n Rerun\n </Button>\n </div>\n <PipelineRunOutputBlock title=\"Output\" output={output} />\n </article>\n );\n}\n\nfunction PipelineRunOutputBlock(props: { title: string; output: string }) {\n return (\n <div className=\"mt-4 border-t border-hair pt-3\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {props.title}\n </span>\n <span className=\" text-xs font-medium tabular-nums text-muted-foreground\">\n {props.output.length} chars\n </span>\n </div>\n <pre className=\"mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-lg bg-card p-3 text-sm leading-6 text-foreground\">\n {props.output.length > 0 ? <PipelineOutputText text={props.output} /> : \"No output saved.\"}\n </pre>\n </div>\n );\n}\n\nfunction pipelineRunOutputText(run: StudioPipelineRunRecord): string {\n if (run.output !== undefined) {\n return typeof run.output === \"string\" ? run.output : JSON.stringify(run.output, null, 2);\n }\n if (run.error !== undefined) {\n return JSON.stringify(run.error, null, 2);\n }\n return \"\";\n}\n\nfunction PipelineOutputText(props: { text: string }) {\n return isStructuredOutput(props.text) ? <JsonSyntax text={props.text} /> : props.text;\n}\n\nfunction isStructuredOutput(text: string): boolean {\n const trimmed = text.trim();\n return (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n );\n}\n\nfunction pipelineRunStatusClass(status: StudioPipelineRunRecord[\"status\"]): string {\n switch (status) {\n case \"success\":\n return \"text-foreground\";\n case \"error\":\n return \"text-destructive\";\n case \"running\":\n return \"text-muted-foreground\";\n }\n}\n\nfunction NodeInspector(props: {\n node: NonNullable<StudioPipelineDetail[\"graph\"][\"nodes\"][number]> | undefined;\n status: NodeStatus | undefined;\n}) {\n if (props.node === undefined) {\n return (\n <section className=\"text-sm font-medium text-muted-foreground\">\n Select a node for details.\n </section>\n );\n }\n\n const metadata = Object.entries(props.node.metadata ?? {});\n return (\n <section className=\"grid content-start gap-5\">\n <div>\n <div className=\" text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Selected node\n </div>\n <h2 className=\"m-0 mt-2 text-lg font-semibold tracking-tight text-foreground\">\n {props.node.label}\n </h2>\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n <Badge>{props.node.kind}</Badge>\n {props.status === undefined ? null : <Badge>{props.status}</Badge>}\n {props.node.branchKey === undefined ? null : <Badge>{props.node.branchKey}</Badge>}\n </div>\n </div>\n {props.node.description === undefined ? null : (\n <p className=\"m-0 rounded-lg bg-muted px-3 py-2 text-sm leading-6 text-muted-foreground\">\n {props.node.description}\n </p>\n )}\n <DetailList\n items={[\n [\"ID\", props.node.id],\n [\"Agent\", props.node.agentId],\n [\"Pipeline\", props.node.pipelineId],\n ]}\n />\n {metadata.length > 0 ? (\n <div className=\"grid gap-2\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Metadata\n </div>\n <div className=\"grid gap-1\">\n {metadata.map(([key, value]) => (\n <div className=\"grid grid-cols-[82px_minmax(0,1fr)] gap-2 text-xs\" key={key}>\n <span className=\"truncate text-muted-foreground\">{key}</span>\n <span className=\"truncate font-medium text-foreground\">\n {formatMetadataValue(value)}\n </span>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction PipelineLogsSection(props: {\n logs: StudioPipelineLogEntry[];\n selectedPipelineId: string;\n loading: boolean;\n}) {\n const scrollerRef = useRef<HTMLDivElement | null>(null);\n const stickToBottomRef = useRef(true);\n\n useEffect(() => {\n const node = scrollerRef.current;\n if (node === null || !stickToBottomRef.current) {\n return;\n }\n node.scrollTop = node.scrollHeight;\n });\n\n function updateStickiness() {\n const node = scrollerRef.current;\n if (node === null) {\n return;\n }\n stickToBottomRef.current = node.scrollHeight - node.scrollTop - node.clientHeight < 24;\n }\n\n return (\n <section className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <div className=\" text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Pipeline logs\n </div>\n <div className=\"mt-1 truncate text-xs font-medium text-muted-foreground\">\n {props.selectedPipelineId.length === 0\n ? \"No active pipeline\"\n : props.selectedPipelineId}\n </div>\n </div>\n <span className=\" text-xs font-semibold tabular-nums text-muted-foreground\">\n {props.logs.length}\n </span>\n </div>\n <div\n className=\"min-h-0 overflow-auto border-t bg-background p-2\"\n ref={scrollerRef}\n onScroll={updateStickiness}\n >\n {props.selectedPipelineId.length === 0 ? (\n <StudioEmptyState\n size=\"compact\"\n title=\"No pipeline selected\"\n text=\"Choose a pipeline to view its runtime logs.\"\n />\n ) : null}\n {props.selectedPipelineId.length > 0 && props.loading && props.logs.length === 0 ? (\n <div className=\"grid gap-2 py-4\">\n <div className=\"h-4 w-32 animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-4 w-64 max-w-full animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-4 w-52 max-w-full animate-pulse rounded-lg bg-muted\" />\n </div>\n ) : null}\n {props.selectedPipelineId.length > 0 && !props.loading && props.logs.length === 0 ? (\n <StudioEmptyState\n size=\"compact\"\n title=\"No logs yet\"\n text=\"Run the pipeline to populate this console.\"\n />\n ) : null}\n {props.logs.map((log) => (\n <PipelineLogRow log={log} key={log.id} />\n ))}\n </div>\n </section>\n );\n}\n\nfunction PipelineLogRow(props: { log: StudioPipelineLogEntry }) {\n const metadataText = formatLogMetadataText(props.log.metadata, 4);\n const line = [\n formatLogTime(props.log.timestamp),\n props.log.level.toUpperCase().padEnd(5, \" \"),\n props.log.message,\n `${props.log.category}/${props.log.event}`,\n metadataText,\n ]\n .filter((item) => item.trim().length > 0)\n .join(\" \");\n return (\n <article\n className={[\n \"min-w-full rounded-lg px-3 py-1.5 text-xs leading-5 transition duration-200 hover:bg-transparent hover:text-foreground\",\n ].join(\" \")}\n title={line}\n >\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-3 gap-y-1\">\n <time className=\"shrink-0 text-muted-foreground\">{formatLogTime(props.log.timestamp)}</time>\n <span className={[\"shrink-0 font-semibold\", logLevelTextClass(props.log.level)].join(\" \")}>\n {props.log.level.toUpperCase().padEnd(5, \" \")}\n </span>\n <span className=\"min-w-0 break-words font-medium text-foreground\">{props.log.message}</span>\n </div>\n <div className=\"mt-1 min-w-0 break-words text-muted-foreground\">\n {props.log.category}/{props.log.event}\n </div>\n <LogMetadata metadata={props.log.metadata} limit={4} />\n </article>\n );\n}\n\nfunction DetailList(props: { items: Array<[string, string | undefined]> }) {\n const items = props.items.filter(([, value]) => value !== undefined && value.length > 0);\n if (items.length === 0) {\n return null;\n }\n return (\n <div className=\"grid gap-2 rounded-none bg-background p-3\">\n {items.map(([label, value]) => (\n <div className=\"grid grid-cols-[82px_minmax(0,1fr)] gap-2 text-xs\" key={label}>\n <span className=\"truncate text-muted-foreground\">{label}</span>\n <span className=\"truncate font-medium text-foreground\">{value}</span>\n </div>\n ))}\n </div>\n );\n}\n\nfunction Badge(props: { children: string }) {\n return (\n <span className=\"rounded-lg border border-hair bg-background px-2 py-1 text-xs font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n {props.children}\n </span>\n );\n}\n\nfunction formatLogTime(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return \"\";\n }\n return date.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n\nfunction formatMetadataValue(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `[${value.length}]`;\n }\n if (typeof value === \"object\" && value !== null) {\n return \"{...}\";\n }\n return \"\";\n}\n\nfunction logLevelTextClass(level: StudioPipelineLogEntry[\"level\"]): string {\n switch (level) {\n case \"error\":\n return \"text-destructive\";\n case \"warn\":\n return \"text-muted-foreground\";\n case \"debug\":\n return \"text-muted-foreground\";\n case \"info\":\n return \"text-foreground\";\n }\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|