@anvia/studio 0.7.26 → 0.7.28

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.
Files changed (28) hide show
  1. package/dist/ui/assets/{evals-page-DYejWQfp.js → evals-page-7nLpk1vO.js} +2 -2
  2. package/dist/ui/assets/{evals-page-DYejWQfp.js.map → evals-page-7nLpk1vO.js.map} +1 -1
  3. package/dist/ui/assets/index-CDwzNuFN.js +55 -0
  4. package/dist/ui/assets/index-CDwzNuFN.js.map +1 -0
  5. package/dist/ui/assets/{knowledge-page-CpQCK-1A.js → knowledge-page-DevVjoVt.js} +2 -2
  6. package/dist/ui/assets/{knowledge-page-CpQCK-1A.js.map → knowledge-page-DevVjoVt.js.map} +1 -1
  7. package/dist/ui/assets/{mcps-page-DwZAv13N.js → mcps-page-gSjG8fUN.js} +2 -2
  8. package/dist/ui/assets/{mcps-page-DwZAv13N.js.map → mcps-page-gSjG8fUN.js.map} +1 -1
  9. package/dist/ui/assets/{memory-page-Cn-wzJHp.js → memory-page-LbQjoiJi.js} +2 -2
  10. package/dist/ui/assets/{memory-page-Cn-wzJHp.js.map → memory-page-LbQjoiJi.js.map} +1 -1
  11. package/dist/ui/assets/{pipelines-page-BA9WCR9D.js → pipelines-page-BDnSsw3p.js} +2 -2
  12. package/dist/ui/assets/{pipelines-page-BA9WCR9D.js.map → pipelines-page-BDnSsw3p.js.map} +1 -1
  13. package/dist/ui/assets/{sessions-page-BuNnb20D.js → sessions-page-DuFkengk.js} +2 -2
  14. package/dist/ui/assets/{sessions-page-BuNnb20D.js.map → sessions-page-DuFkengk.js.map} +1 -1
  15. package/dist/ui/assets/{status-page-B8-sSeYx.js → status-page-Cp63l30c.js} +2 -2
  16. package/dist/ui/assets/{status-page-B8-sSeYx.js.map → status-page-Cp63l30c.js.map} +1 -1
  17. package/dist/ui/assets/{tool-runner-5JJHI3LO.js → tool-runner-D09nhpss.js} +2 -2
  18. package/dist/ui/assets/{tool-runner-5JJHI3LO.js.map → tool-runner-D09nhpss.js.map} +1 -1
  19. package/dist/ui/assets/{tools-page-kXLllnlT.js → tools-page-BwgQMVke.js} +2 -2
  20. package/dist/ui/assets/{tools-page-kXLllnlT.js.map → tools-page-BwgQMVke.js.map} +1 -1
  21. package/dist/ui/assets/{trace-browser-C0vy4e41.js → trace-browser-B7BK2f--.js} +2 -2
  22. package/dist/ui/assets/{trace-browser-C0vy4e41.js.map → trace-browser-B7BK2f--.js.map} +1 -1
  23. package/dist/ui/assets/{transcript-item-cUscZoNb.js → transcript-item-DEZpZ7fg.js} +2 -2
  24. package/dist/ui/assets/{transcript-item-cUscZoNb.js.map → transcript-item-DEZpZ7fg.js.map} +1 -1
  25. package/dist/ui/index.html +1 -1
  26. package/package.json +4 -4
  27. package/dist/ui/assets/index-DxSIQUax.js +0 -55
  28. package/dist/ui/assets/index-DxSIQUax.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{i as e,r as t,s as n}from"./utils-BN2yP0LH.js";import{m as r}from"./format-C9HPGfkW.js";import{t as i}from"./RefreshIcon-B3w42HZJ.js";import{A as a,F as o,I as s,M as c,N as l,P as u,j as d}from"./index-DxSIQUax.js";import{t as f}from"./badge-BH7gz3tB.js";import{n as p,t as m}from"./renderers-m-gqGocU.js";var h=n(e(),1),g=t();function _(e){let t=e.state;return e.source?.source.kind===`dynamic_tools`?(0,g.jsx)(y,{source:e.source,state:t,onLoadMore:e.onLoadMore}):(0,g.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[minmax(0,1fr)_auto] overflow-hidden`,children:[(0,g.jsx)(`div`,{className:`min-h-0 overflow-auto`,children:(0,g.jsxs)(`div`,{className:`pb-4 pt-0`,children:[e.source===void 0?(0,g.jsx)(I,{text:`No knowledge source selected`}):null,t?.loading===!0&&t.items.length===0?(0,g.jsx)(I,{text:`Loading items`}):null,t?.error===void 0?null:(0,g.jsx)(I,{text:t.error}),t?.inspectable===!1?(0,g.jsx)(I,{text:t.message??`This source does not expose browseable chunks.`}):null,t?.inspectable!==!1&&t?.loading===!1&&t.items.length===0?(0,g.jsx)(I,{text:`No items in this source`}):null,(0,g.jsx)(`div`,{className:`grid gap-3`,children:t?.items.map(t=>(0,g.jsx)(v,{item:t,source:e.source},`${t.kind}:${t.id}`))})]})}),(0,g.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 border-t border-border/80 bg-muted/10 py-2`,children:[(0,g.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:t===void 0?`0 loaded`:`${t.items.length} loaded`}),(0,g.jsx)(s,{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 v(e){return e.item.kind===`dynamic_tool`?(0,g.jsx)(`article`,{className:`rounded-xl border border-border/80 bg-background/55 p-4`,children:(0,g.jsx)(x,{item:e.item,source:e.source})}):(0,g.jsxs)(`article`,{className:`grid gap-3 rounded-xl border border-border/80 bg-background/55 p-4`,children:[(0,g.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,g.jsx)(`div`,{className:`min-w-0`,children:(0,g.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,g.jsxs)(f,{children:[e.item.parameterKeys.length,` params`]})]}),e.item.description===void 0||e.item.description.length===0?null:(0,g.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,g.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,g.jsx)(F,{title:`Document`,value:e.item.document}),e.item.metadata===void 0?null:(0,g.jsx)(F,{title:`Metadata`,value:e.item.metadata}),e.item.parameterKeys===void 0||e.item.parameterKeys.length===0?null:(0,g.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.item.parameterKeys.map(e=>(0,g.jsx)(f,{children:e},e))})]})}function y(e){let t=(0,h.useMemo)(()=>(e.state?.items??[]).filter(D),[e.state?.items]),[n,r]=(0,h.useState)(``),i=t.find(e=>e.id===n)??t[0],a=(0,h.useMemo)(()=>O(t),[t]);return(0,h.useEffect)(()=>{if(t.length===0){r(``);return}t.some(e=>e.id===n)||r(t[0]?.id??``)},[n,t]),(0,g.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden`,children:[(0,g.jsxs)(`header`,{className:`grid min-h-16 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 border-b border-border/80 py-3 max-md:grid-cols-1`,children:[(0,g.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,g.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Runtime tool index`}),(0,g.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-sm`,children:[(0,g.jsx)(`span`,{className:`font-semibold text-foreground`,children:e.source.source.label??l(e.source.source.kind)}),(0,g.jsx)(`span`,{className:`text-muted-foreground`,children:e.source.agentName})]})]}),(0,g.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,g.jsx)(A,{label:`tools`,value:t.length}),(0,g.jsx)(A,{label:`params`,value:a.parameterCount}),(0,g.jsx)(A,{label:`required`,value:a.requiredCount})]})]}),(0,g.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,g.jsx)(`aside`,{className:`min-h-0 overflow-auto border-r border-border/80 pr-3 max-lg:border-b max-lg:border-r-0 max-lg:pr-0`,children:(0,g.jsxs)(`div`,{className:`grid gap-1 py-3 pr-3 max-lg:pr-0`,children:[e.source===void 0?(0,g.jsx)(I,{text:`No knowledge source selected`}):null,e.state?.loading===!0&&t.length===0?(0,g.jsx)(I,{text:`Loading dynamic tools`}):null,e.state?.error===void 0?null:(0,g.jsx)(I,{text:e.state.error}),e.state?.inspectable===!1?(0,g.jsx)(I,{text:e.state.message??`This source does not expose browseable tools.`}):null,e.state?.inspectable!==!1&&e.state?.loading===!1&&t.length===0?(0,g.jsx)(I,{text:`No dynamic tools in this source`}):null,t.map(e=>(0,g.jsx)(b,{active:i?.id===e.id,item:e,onSelect:()=>r(e.id)},e.id))]})}),(0,g.jsx)(`div`,{className:`min-h-0 overflow-auto py-4 pl-5 max-lg:pl-0`,children:i===void 0?(0,g.jsx)(w,{}):(0,g.jsx)(x,{item:i,source:e.source})})]}),(0,g.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 border-t border-border/80 bg-background/30 py-2`,children:[(0,g.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.state===void 0?`0 loaded`:`${e.state.items.length} loaded`}),(0,g.jsx)(s,{className:`h-8 min-h-8`,type:`button`,variant:`secondary`,disabled:e.state?.loading===!0||e.state?.nextCursor===void 0,onClick:e.onLoadMore,children:`Load more`})]})]})}function b(e){let t=T(e.item),n=E(e.item),r=n.filter(e=>e.required).length,i=t.name??e.item.toolName??e.item.id;return(0,g.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-border/80 hover:bg-muted/25 focus-visible:border-ring focus-visible:outline-none`,e.active?`border-border/80 bg-muted/35 text-foreground`:`text-muted-foreground`].join(` `),type:`button`,onClick:e.onSelect,children:[(0,g.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,g.jsx)(`span`,{className:`min-w-0 truncate font-mono text-sm font-semibold text-foreground`,children:i}),(0,g.jsx)(`span`,{className:`shrink-0 text-xs tabular-nums text-muted-foreground`,children:n.length})]}),(0,g.jsx)(`p`,{className:`m-0 line-clamp-2 text-xs leading-5 text-muted-foreground`,children:t.description??e.item.description??`No description`}),(0,g.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2 text-[11px] font-medium text-muted-foreground`,children:[(0,g.jsxs)(`span`,{children:[r,` required`]}),(0,g.jsxs)(`span`,{children:[n.length-r,` optional`]})]})]})}function x(e){let t=T(e.item),n=E(e.item),r=t.description??e.item.description,i=t.name??e.item.toolName??e.item.id;return(0,g.jsxs)(`article`,{className:`grid min-w-0 gap-5`,children:[(0,g.jsxs)(`header`,{className:`grid gap-4 border-b border-border/80 pb-5`,children:[(0,g.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-4 max-md:grid`,children:[(0,g.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,g.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Selected tool`}),(0,g.jsx)(`h2`,{className:`m-0 truncate font-mono text-2xl font-semibold leading-none text-foreground`,children:i})]}),(0,g.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,g.jsxs)(f,{children:[n.length,` params`]}),(0,g.jsxs)(f,{children:[n.filter(e=>e.required).length,` required`]})]})]}),r===void 0||r.length===0?null:(0,g.jsx)(`p`,{className:`m-0 max-w-[72ch] text-base leading-7 text-muted-foreground [overflow-wrap:anywhere]`,children:r}),(0,g.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-y border-border/80 bg-muted/15 px-3 py-2`,children:(0,g.jsx)(`code`,{className:`font-mono text-sm leading-6 text-foreground`,children:k(i,n)})})]}),(0,g.jsx)(S,{parameters:n}),(0,g.jsx)(C,{item:e.item,source:e.source}),e.item.document===void 0?null:(0,g.jsx)(M,{title:`Raw definition`,value:e.item.document}),e.item.metadata===void 0?null:(0,g.jsx)(M,{title:`Metadata`,value:e.item.metadata})]})}function S(e){return(0,g.jsxs)(`section`,{className:`grid gap-3`,children:[(0,g.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,g.jsx)(`h3`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Parameters`}),(0,g.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,g.jsx)(`div`,{className:`border-y border-dashed border-border/80 px-3 py-4 text-sm text-muted-foreground`,children:`This tool does not declare input parameters.`}):(0,g.jsx)(`div`,{className:`min-w-0 overflow-hidden border-y border-border/80`,children:e.parameters.map(e=>(0,g.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-border/70 py-3 last:border-b-0 max-md:grid-cols-1 max-md:gap-1`,children:[(0,g.jsx)(`div`,{className:`min-w-0 font-mono text-sm font-semibold text-foreground [overflow-wrap:anywhere]`,children:e.name}),(0,g.jsx)(`div`,{className:`text-sm text-muted-foreground [overflow-wrap:anywhere]`,children:e.type}),(0,g.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:e.required?`Required`:`Optional`}),(0,g.jsx)(`div`,{className:`text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]`,children:e.description??`No description`})]},e.name))})]})}function C(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??l(e.source.source.kind)} / ${d(e.source.source)}`},{label:`Item ID`,value:e.item.id}].filter(e=>e.value!==void 0);return t.length===0?null:(0,g.jsxs)(`section`,{className:`grid gap-3 border-t border-border/80 pt-4`,children:[(0,g.jsx)(`h3`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Source`}),(0,g.jsx)(`dl`,{className:`grid border-y border-border/80 sm:grid-cols-3 sm:divide-x sm:divide-border/80`,children:t.map(e=>(0,g.jsxs)(`div`,{className:`min-w-0 px-3 py-3 first:pl-0 last:pr-0`,children:[(0,g.jsx)(`dt`,{className:`text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.label}),(0,g.jsx)(`dd`,{className:`m-0 mt-1 truncate text-sm font-medium text-foreground`,children:e.value})]},e.label))})]})}function w(){return(0,g.jsx)(`section`,{className:`grid h-full min-h-80 place-items-center border-y border-dashed border-border/80 px-6 text-center`,children:(0,g.jsxs)(`div`,{className:`grid max-w-sm gap-2`,children:[(0,g.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:`No dynamic tool selected`}),(0,g.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:`Select a tool from the index to inspect its definition and parameters.`})]})})}function T(e){let t=r(e.document)?e.document:void 0,n=r(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 E(e){let t=T(e),n=r(t.parameters)?t.parameters:void 0,i=r(n?.properties)?n.properties:void 0,a=new Set(Array.isArray(n?.required)?n.required.filter(e=>typeof e==`string`):[]);return i===void 0?(e.parameterKeys??[]).map(e=>({name:e,type:`unknown`,required:!1,description:void 0})):Object.entries(i).map(([e,t])=>{let n=r(t)?t:{};return{name:e,type:j(n.type),required:a.has(e),description:typeof n.description==`string`?n.description:void 0}})}function D(e){return e.kind===`dynamic_tool`}function O(e){return e.reduce((e,t)=>{let n=E(t);return e.parameterCount+=n.length,e.requiredCount+=n.filter(e=>e.required).length,e},{parameterCount:0,requiredCount:0})}function k(e,t){return t.length===0?`${e}()`:`${e}({ ${t.map(e=>`${e.name}${e.required?``:`?`}: ${e.type}`).join(`, `)} })`}function A(e){return(0,g.jsxs)(`span`,{className:`inline-flex h-8 items-center gap-2 border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground`,children:[(0,g.jsx)(`span`,{className:`font-semibold tabular-nums text-foreground`,children:e.value}),e.label]})}function j(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 M(e){let t=N(e.value);return(0,g.jsxs)(`details`,{className:`group rounded-xl border border-border/80 bg-card/30`,children:[(0,g.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,g.jsx)(`span`,{children:e.title}),(0,g.jsx)(`span`,{className:`text-xs normal-case tracking-normal text-muted-foreground group-open:hidden`,children:`Show`}),(0,g.jsx)(`span`,{className:`hidden text-xs normal-case tracking-normal text-muted-foreground group-open:inline`,children:`Hide`})]}),(0,g.jsx)(`div`,{className:`border-t border-border/70`,children:(0,g.jsx)(`pre`,{className:`m-0 max-h-96 overflow-auto p-4 font-mono text-xs leading-5 text-foreground`,children:(0,g.jsx)(`code`,{children:(0,g.jsx)(m,{text:t})})})})]})}function N(e){try{return JSON.stringify(e,null,2)}catch{return JSON.stringify(String(e),null,2)}}function P(e){return(0,g.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden rounded-xl border border-border/80 bg-card/55`,children:[(0,g.jsx)(`div`,{className:`border-b border-border/80 px-4 py-3`,children:(0,g.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,g.jsxs)(`div`,{className:`min-w-0`,children:[(0,g.jsx)(`h2`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:`Retrieval log`}),(0,g.jsx)(`p`,{className:`m-0 mt-1 truncate text-xs text-muted-foreground`,children:`traces / retrieval-evidence`})]}),(0,g.jsxs)(f,{children:[e.evidence.length,` entries`]})]})}),(0,g.jsxs)(`div`,{className:`min-h-0 overflow-auto p-4`,children:[e.evidence.length===0?(0,g.jsx)(I,{text:`No retrieval evidence captured yet`}):null,(0,g.jsx)(`div`,{className:`grid gap-3`,children:e.evidence.map(t=>(0,g.jsxs)(`article`,{className:`grid gap-3 rounded-xl border border-border/80 bg-background/45 p-3`,children:[(0,g.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,g.jsxs)(`div`,{className:`min-w-0`,children:[(0,g.jsx)(`div`,{className:`truncate text-sm font-semibold text-foreground`,children:t.observationName}),(0,g.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Turn `,t.turn]})]}),(0,g.jsx)(s,{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,g.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,g.jsxs)(f,{children:[t.documentCount,` docs`]}),(0,g.jsxs)(f,{children:[t.toolCount,` tools`]})]}),t.query===void 0?null:(0,g.jsxs)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]`,children:[(0,g.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,g.jsxs)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground [overflow-wrap:anywhere]`,children:[(0,g.jsx)(`span`,{className:` text-foreground`,children:e.id??`document`}),` `,e.text??``]},`${e.id??`doc`}:${e.text??``}`)),t.tools.length===0?null:(0,g.jsxs)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:[`Tools: `,t.tools.join(`, `)]})]},`${t.traceId}:${t.observationId}`))})]})]})}function F(e){return(0,g.jsxs)(`div`,{className:`grid gap-2 border-t border-border/70 pt-3`,children:[(0,g.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.title}),(0,g.jsx)(p,{value:e.value})]})}function I(e){return(0,g.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 L(e){let[t,n]=(0,h.useState)(``),[r,l]=(0,h.useState)(),f=e.summary?.agents??[],p=e.summary?.evidence??[],m=(0,h.useMemo)(()=>a(f),[f]),v=c(e.activeTab),y=(0,h.useMemo)(()=>v===void 0?[]:m.filter(e=>e.source.kind===v),[v,m]),b=y.find(e=>e.key===t)??y[0];(0,h.useEffect)(()=>{if(y.length===0){n(``);return}y.some(e=>e.key===t)||n((y.find(e=>e.source.inspectable===!0&&(e.source.itemCount??0)>0)??y.find(e=>e.source.inspectable===!0)??y[0])?.key??``)},[t,y]);let x=(0,h.useCallback)(async(e,t)=>{let n=e.key;l(r=>({key:n,loading:!0,inspectable:r?.key===n?r.inspectable:e.source.inspectable===!0,items:t.append&&r?.key===n?r.items:[],...t.append&&r?.key===n&&r.nextCursor!==void 0?{nextCursor:r.nextCursor}:{},...r?.key===n&&r.totalCount!==void 0?{totalCount:r.totalCount}:{}}));try{let r=new URLSearchParams({agentId:e.agentId,sourceId:d(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();l(e=>e?.key===n?{key:n,loading:!1,inspectable:a.inspectable,items:t.append?[...e.items,...a.items]:a.items,...a.nextCursor===void 0?{}:{nextCursor:a.nextCursor},...a.totalCount===void 0?{}:{totalCount:a.totalCount},...a.message===void 0?{}:{message:a.message}}:e)}catch(e){l(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,h.useEffect)(()=>{if(!e.enabled||b===void 0){l(void 0);return}x(b,{append:!1})},[x,e.enabled,b]),(0,g.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55`,children:[(0,g.jsx)(`header`,{className:`bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur`,children:(0,g.jsxs)(`div`,{className:`grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1`,children:[(0,g.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,g.jsx)(`h1`,{className:`m-0 text-2xl font-semibold leading-none tracking-tight text-foreground`,children:u(e.activeTab)}),(0,g.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:z(e.activeTab)})]}),(0,g.jsxs)(s,{className:`h-8 min-h-8 gap-2`,type:`button`,variant:`secondary`,disabled:!e.enabled,onClick:e.onRefresh,children:[(0,g.jsx)(o,{icon:i,"aria-hidden":`true`}),`Refresh`]})]})}),(0,g.jsx)(`div`,{className:`grid min-h-0 grid-rows-[minmax(0,1fr)] overflow-hidden pb-6 pl-4 pr-6 pt-0`,children:e.activeTab===`retrieval-log`?(0,g.jsx)(P,{evidence:p,onOpenTrace:e.onOpenTrace}):(0,g.jsx)(R,{sources:y,selectedKey:b?.key??``,loading:e.loading,activeTab:e.activeTab,onSelect:n,children:(0,g.jsx)(_,{source:b,state:r,onLoadMore:()=>{b!==void 0&&x(b,r?.nextCursor===void 0?{append:!0}:{append:!0,cursor:r.nextCursor})}})})})]})}function R(e){let t=e.sources.length!==1||e.loading;return(0,g.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,g.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-b border-border/80`,children:(0,g.jsxs)(`div`,{className:`flex min-h-11 min-w-max items-center gap-2`,children:[(0,g.jsx)(`span`,{className:`mr-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:u(e.activeTab)}),e.loading&&e.sources.length===0?(0,g.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:`Loading sources`}):null,!e.loading&&e.sources.length===0?(0,g.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:`No knowledge sources`}):null,e.sources.map(t=>(0,g.jsxs)(`button`,{className:[`flex h-7 items-center gap-2 rounded-lg border border-border/80 bg-background/45 px-2.5 text-xs font-semibold text-muted-foreground transition duration-200 hover:border-border/80 hover:bg-muted/45 hover:text-foreground focus-visible:border-ring focus-visible:outline-none`,e.selectedKey===t.key?`border-border/80 bg-muted/45 text-foreground`:``].join(` `),type:`button`,onClick:()=>e.onSelect(t.key),children:[(0,g.jsx)(`span`,{children:t.source.label??l(t.source.kind)}),t.source.itemCount===void 0?null:(0,g.jsx)(`span`,{className:`text-muted-foreground`,children:t.source.itemCount})]},t.key))]})}):null,e.children]})}function z(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{L as KnowledgePage};
2
- //# sourceMappingURL=knowledge-page-CpQCK-1A.js.map
1
+ import{i as e,r as t,s as n}from"./utils-BN2yP0LH.js";import{m as r}from"./format-C9HPGfkW.js";import{t as i}from"./RefreshIcon-B3w42HZJ.js";import{A as a,F as o,I as s,M as c,N as l,P as u,j as d}from"./index-CDwzNuFN.js";import{t as f}from"./badge-BH7gz3tB.js";import{n as p,t as m}from"./renderers-m-gqGocU.js";var h=n(e(),1),g=t();function _(e){let t=e.state;return e.source?.source.kind===`dynamic_tools`?(0,g.jsx)(y,{source:e.source,state:t,onLoadMore:e.onLoadMore}):(0,g.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[minmax(0,1fr)_auto] overflow-hidden`,children:[(0,g.jsx)(`div`,{className:`min-h-0 overflow-auto`,children:(0,g.jsxs)(`div`,{className:`pb-4 pt-0`,children:[e.source===void 0?(0,g.jsx)(I,{text:`No knowledge source selected`}):null,t?.loading===!0&&t.items.length===0?(0,g.jsx)(I,{text:`Loading items`}):null,t?.error===void 0?null:(0,g.jsx)(I,{text:t.error}),t?.inspectable===!1?(0,g.jsx)(I,{text:t.message??`This source does not expose browseable chunks.`}):null,t?.inspectable!==!1&&t?.loading===!1&&t.items.length===0?(0,g.jsx)(I,{text:`No items in this source`}):null,(0,g.jsx)(`div`,{className:`grid gap-3`,children:t?.items.map(t=>(0,g.jsx)(v,{item:t,source:e.source},`${t.kind}:${t.id}`))})]})}),(0,g.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 border-t border-border/80 bg-muted/10 py-2`,children:[(0,g.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:t===void 0?`0 loaded`:`${t.items.length} loaded`}),(0,g.jsx)(s,{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 v(e){return e.item.kind===`dynamic_tool`?(0,g.jsx)(`article`,{className:`rounded-xl border border-border/80 bg-background/55 p-4`,children:(0,g.jsx)(x,{item:e.item,source:e.source})}):(0,g.jsxs)(`article`,{className:`grid gap-3 rounded-xl border border-border/80 bg-background/55 p-4`,children:[(0,g.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,g.jsx)(`div`,{className:`min-w-0`,children:(0,g.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,g.jsxs)(f,{children:[e.item.parameterKeys.length,` params`]})]}),e.item.description===void 0||e.item.description.length===0?null:(0,g.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,g.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,g.jsx)(F,{title:`Document`,value:e.item.document}),e.item.metadata===void 0?null:(0,g.jsx)(F,{title:`Metadata`,value:e.item.metadata}),e.item.parameterKeys===void 0||e.item.parameterKeys.length===0?null:(0,g.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.item.parameterKeys.map(e=>(0,g.jsx)(f,{children:e},e))})]})}function y(e){let t=(0,h.useMemo)(()=>(e.state?.items??[]).filter(D),[e.state?.items]),[n,r]=(0,h.useState)(``),i=t.find(e=>e.id===n)??t[0],a=(0,h.useMemo)(()=>O(t),[t]);return(0,h.useEffect)(()=>{if(t.length===0){r(``);return}t.some(e=>e.id===n)||r(t[0]?.id??``)},[n,t]),(0,g.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden`,children:[(0,g.jsxs)(`header`,{className:`grid min-h-16 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 border-b border-border/80 py-3 max-md:grid-cols-1`,children:[(0,g.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,g.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Runtime tool index`}),(0,g.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-sm`,children:[(0,g.jsx)(`span`,{className:`font-semibold text-foreground`,children:e.source.source.label??l(e.source.source.kind)}),(0,g.jsx)(`span`,{className:`text-muted-foreground`,children:e.source.agentName})]})]}),(0,g.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,g.jsx)(A,{label:`tools`,value:t.length}),(0,g.jsx)(A,{label:`params`,value:a.parameterCount}),(0,g.jsx)(A,{label:`required`,value:a.requiredCount})]})]}),(0,g.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,g.jsx)(`aside`,{className:`min-h-0 overflow-auto border-r border-border/80 pr-3 max-lg:border-b max-lg:border-r-0 max-lg:pr-0`,children:(0,g.jsxs)(`div`,{className:`grid gap-1 py-3 pr-3 max-lg:pr-0`,children:[e.source===void 0?(0,g.jsx)(I,{text:`No knowledge source selected`}):null,e.state?.loading===!0&&t.length===0?(0,g.jsx)(I,{text:`Loading dynamic tools`}):null,e.state?.error===void 0?null:(0,g.jsx)(I,{text:e.state.error}),e.state?.inspectable===!1?(0,g.jsx)(I,{text:e.state.message??`This source does not expose browseable tools.`}):null,e.state?.inspectable!==!1&&e.state?.loading===!1&&t.length===0?(0,g.jsx)(I,{text:`No dynamic tools in this source`}):null,t.map(e=>(0,g.jsx)(b,{active:i?.id===e.id,item:e,onSelect:()=>r(e.id)},e.id))]})}),(0,g.jsx)(`div`,{className:`min-h-0 overflow-auto py-4 pl-5 max-lg:pl-0`,children:i===void 0?(0,g.jsx)(w,{}):(0,g.jsx)(x,{item:i,source:e.source})})]}),(0,g.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 border-t border-border/80 bg-background/30 py-2`,children:[(0,g.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.state===void 0?`0 loaded`:`${e.state.items.length} loaded`}),(0,g.jsx)(s,{className:`h-8 min-h-8`,type:`button`,variant:`secondary`,disabled:e.state?.loading===!0||e.state?.nextCursor===void 0,onClick:e.onLoadMore,children:`Load more`})]})]})}function b(e){let t=T(e.item),n=E(e.item),r=n.filter(e=>e.required).length,i=t.name??e.item.toolName??e.item.id;return(0,g.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-border/80 hover:bg-muted/25 focus-visible:border-ring focus-visible:outline-none`,e.active?`border-border/80 bg-muted/35 text-foreground`:`text-muted-foreground`].join(` `),type:`button`,onClick:e.onSelect,children:[(0,g.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,g.jsx)(`span`,{className:`min-w-0 truncate font-mono text-sm font-semibold text-foreground`,children:i}),(0,g.jsx)(`span`,{className:`shrink-0 text-xs tabular-nums text-muted-foreground`,children:n.length})]}),(0,g.jsx)(`p`,{className:`m-0 line-clamp-2 text-xs leading-5 text-muted-foreground`,children:t.description??e.item.description??`No description`}),(0,g.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2 text-[11px] font-medium text-muted-foreground`,children:[(0,g.jsxs)(`span`,{children:[r,` required`]}),(0,g.jsxs)(`span`,{children:[n.length-r,` optional`]})]})]})}function x(e){let t=T(e.item),n=E(e.item),r=t.description??e.item.description,i=t.name??e.item.toolName??e.item.id;return(0,g.jsxs)(`article`,{className:`grid min-w-0 gap-5`,children:[(0,g.jsxs)(`header`,{className:`grid gap-4 border-b border-border/80 pb-5`,children:[(0,g.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-4 max-md:grid`,children:[(0,g.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,g.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Selected tool`}),(0,g.jsx)(`h2`,{className:`m-0 truncate font-mono text-2xl font-semibold leading-none text-foreground`,children:i})]}),(0,g.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,g.jsxs)(f,{children:[n.length,` params`]}),(0,g.jsxs)(f,{children:[n.filter(e=>e.required).length,` required`]})]})]}),r===void 0||r.length===0?null:(0,g.jsx)(`p`,{className:`m-0 max-w-[72ch] text-base leading-7 text-muted-foreground [overflow-wrap:anywhere]`,children:r}),(0,g.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-y border-border/80 bg-muted/15 px-3 py-2`,children:(0,g.jsx)(`code`,{className:`font-mono text-sm leading-6 text-foreground`,children:k(i,n)})})]}),(0,g.jsx)(S,{parameters:n}),(0,g.jsx)(C,{item:e.item,source:e.source}),e.item.document===void 0?null:(0,g.jsx)(M,{title:`Raw definition`,value:e.item.document}),e.item.metadata===void 0?null:(0,g.jsx)(M,{title:`Metadata`,value:e.item.metadata})]})}function S(e){return(0,g.jsxs)(`section`,{className:`grid gap-3`,children:[(0,g.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,g.jsx)(`h3`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Parameters`}),(0,g.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,g.jsx)(`div`,{className:`border-y border-dashed border-border/80 px-3 py-4 text-sm text-muted-foreground`,children:`This tool does not declare input parameters.`}):(0,g.jsx)(`div`,{className:`min-w-0 overflow-hidden border-y border-border/80`,children:e.parameters.map(e=>(0,g.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-border/70 py-3 last:border-b-0 max-md:grid-cols-1 max-md:gap-1`,children:[(0,g.jsx)(`div`,{className:`min-w-0 font-mono text-sm font-semibold text-foreground [overflow-wrap:anywhere]`,children:e.name}),(0,g.jsx)(`div`,{className:`text-sm text-muted-foreground [overflow-wrap:anywhere]`,children:e.type}),(0,g.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:e.required?`Required`:`Optional`}),(0,g.jsx)(`div`,{className:`text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]`,children:e.description??`No description`})]},e.name))})]})}function C(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??l(e.source.source.kind)} / ${d(e.source.source)}`},{label:`Item ID`,value:e.item.id}].filter(e=>e.value!==void 0);return t.length===0?null:(0,g.jsxs)(`section`,{className:`grid gap-3 border-t border-border/80 pt-4`,children:[(0,g.jsx)(`h3`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Source`}),(0,g.jsx)(`dl`,{className:`grid border-y border-border/80 sm:grid-cols-3 sm:divide-x sm:divide-border/80`,children:t.map(e=>(0,g.jsxs)(`div`,{className:`min-w-0 px-3 py-3 first:pl-0 last:pr-0`,children:[(0,g.jsx)(`dt`,{className:`text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.label}),(0,g.jsx)(`dd`,{className:`m-0 mt-1 truncate text-sm font-medium text-foreground`,children:e.value})]},e.label))})]})}function w(){return(0,g.jsx)(`section`,{className:`grid h-full min-h-80 place-items-center border-y border-dashed border-border/80 px-6 text-center`,children:(0,g.jsxs)(`div`,{className:`grid max-w-sm gap-2`,children:[(0,g.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:`No dynamic tool selected`}),(0,g.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:`Select a tool from the index to inspect its definition and parameters.`})]})})}function T(e){let t=r(e.document)?e.document:void 0,n=r(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 E(e){let t=T(e),n=r(t.parameters)?t.parameters:void 0,i=r(n?.properties)?n.properties:void 0,a=new Set(Array.isArray(n?.required)?n.required.filter(e=>typeof e==`string`):[]);return i===void 0?(e.parameterKeys??[]).map(e=>({name:e,type:`unknown`,required:!1,description:void 0})):Object.entries(i).map(([e,t])=>{let n=r(t)?t:{};return{name:e,type:j(n.type),required:a.has(e),description:typeof n.description==`string`?n.description:void 0}})}function D(e){return e.kind===`dynamic_tool`}function O(e){return e.reduce((e,t)=>{let n=E(t);return e.parameterCount+=n.length,e.requiredCount+=n.filter(e=>e.required).length,e},{parameterCount:0,requiredCount:0})}function k(e,t){return t.length===0?`${e}()`:`${e}({ ${t.map(e=>`${e.name}${e.required?``:`?`}: ${e.type}`).join(`, `)} })`}function A(e){return(0,g.jsxs)(`span`,{className:`inline-flex h-8 items-center gap-2 border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground`,children:[(0,g.jsx)(`span`,{className:`font-semibold tabular-nums text-foreground`,children:e.value}),e.label]})}function j(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 M(e){let t=N(e.value);return(0,g.jsxs)(`details`,{className:`group rounded-xl border border-border/80 bg-card/30`,children:[(0,g.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,g.jsx)(`span`,{children:e.title}),(0,g.jsx)(`span`,{className:`text-xs normal-case tracking-normal text-muted-foreground group-open:hidden`,children:`Show`}),(0,g.jsx)(`span`,{className:`hidden text-xs normal-case tracking-normal text-muted-foreground group-open:inline`,children:`Hide`})]}),(0,g.jsx)(`div`,{className:`border-t border-border/70`,children:(0,g.jsx)(`pre`,{className:`m-0 max-h-96 overflow-auto p-4 font-mono text-xs leading-5 text-foreground`,children:(0,g.jsx)(`code`,{children:(0,g.jsx)(m,{text:t})})})})]})}function N(e){try{return JSON.stringify(e,null,2)}catch{return JSON.stringify(String(e),null,2)}}function P(e){return(0,g.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden rounded-xl border border-border/80 bg-card/55`,children:[(0,g.jsx)(`div`,{className:`border-b border-border/80 px-4 py-3`,children:(0,g.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,g.jsxs)(`div`,{className:`min-w-0`,children:[(0,g.jsx)(`h2`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:`Retrieval log`}),(0,g.jsx)(`p`,{className:`m-0 mt-1 truncate text-xs text-muted-foreground`,children:`traces / retrieval-evidence`})]}),(0,g.jsxs)(f,{children:[e.evidence.length,` entries`]})]})}),(0,g.jsxs)(`div`,{className:`min-h-0 overflow-auto p-4`,children:[e.evidence.length===0?(0,g.jsx)(I,{text:`No retrieval evidence captured yet`}):null,(0,g.jsx)(`div`,{className:`grid gap-3`,children:e.evidence.map(t=>(0,g.jsxs)(`article`,{className:`grid gap-3 rounded-xl border border-border/80 bg-background/45 p-3`,children:[(0,g.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,g.jsxs)(`div`,{className:`min-w-0`,children:[(0,g.jsx)(`div`,{className:`truncate text-sm font-semibold text-foreground`,children:t.observationName}),(0,g.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Turn `,t.turn]})]}),(0,g.jsx)(s,{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,g.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,g.jsxs)(f,{children:[t.documentCount,` docs`]}),(0,g.jsxs)(f,{children:[t.toolCount,` tools`]})]}),t.query===void 0?null:(0,g.jsxs)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]`,children:[(0,g.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,g.jsxs)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground [overflow-wrap:anywhere]`,children:[(0,g.jsx)(`span`,{className:` text-foreground`,children:e.id??`document`}),` `,e.text??``]},`${e.id??`doc`}:${e.text??``}`)),t.tools.length===0?null:(0,g.jsxs)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:[`Tools: `,t.tools.join(`, `)]})]},`${t.traceId}:${t.observationId}`))})]})]})}function F(e){return(0,g.jsxs)(`div`,{className:`grid gap-2 border-t border-border/70 pt-3`,children:[(0,g.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.title}),(0,g.jsx)(p,{value:e.value})]})}function I(e){return(0,g.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 L(e){let[t,n]=(0,h.useState)(``),[r,l]=(0,h.useState)(),f=e.summary?.agents??[],p=e.summary?.evidence??[],m=(0,h.useMemo)(()=>a(f),[f]),v=c(e.activeTab),y=(0,h.useMemo)(()=>v===void 0?[]:m.filter(e=>e.source.kind===v),[v,m]),b=y.find(e=>e.key===t)??y[0];(0,h.useEffect)(()=>{if(y.length===0){n(``);return}y.some(e=>e.key===t)||n((y.find(e=>e.source.inspectable===!0&&(e.source.itemCount??0)>0)??y.find(e=>e.source.inspectable===!0)??y[0])?.key??``)},[t,y]);let x=(0,h.useCallback)(async(e,t)=>{let n=e.key;l(r=>({key:n,loading:!0,inspectable:r?.key===n?r.inspectable:e.source.inspectable===!0,items:t.append&&r?.key===n?r.items:[],...t.append&&r?.key===n&&r.nextCursor!==void 0?{nextCursor:r.nextCursor}:{},...r?.key===n&&r.totalCount!==void 0?{totalCount:r.totalCount}:{}}));try{let r=new URLSearchParams({agentId:e.agentId,sourceId:d(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();l(e=>e?.key===n?{key:n,loading:!1,inspectable:a.inspectable,items:t.append?[...e.items,...a.items]:a.items,...a.nextCursor===void 0?{}:{nextCursor:a.nextCursor},...a.totalCount===void 0?{}:{totalCount:a.totalCount},...a.message===void 0?{}:{message:a.message}}:e)}catch(e){l(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,h.useEffect)(()=>{if(!e.enabled||b===void 0){l(void 0);return}x(b,{append:!1})},[x,e.enabled,b]),(0,g.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55`,children:[(0,g.jsx)(`header`,{className:`bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur`,children:(0,g.jsxs)(`div`,{className:`grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1`,children:[(0,g.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,g.jsx)(`h1`,{className:`m-0 text-2xl font-semibold leading-none tracking-tight text-foreground`,children:u(e.activeTab)}),(0,g.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:z(e.activeTab)})]}),(0,g.jsxs)(s,{className:`h-8 min-h-8 gap-2`,type:`button`,variant:`secondary`,disabled:!e.enabled,onClick:e.onRefresh,children:[(0,g.jsx)(o,{icon:i,"aria-hidden":`true`}),`Refresh`]})]})}),(0,g.jsx)(`div`,{className:`grid min-h-0 grid-rows-[minmax(0,1fr)] overflow-hidden pb-6 pl-4 pr-6 pt-0`,children:e.activeTab===`retrieval-log`?(0,g.jsx)(P,{evidence:p,onOpenTrace:e.onOpenTrace}):(0,g.jsx)(R,{sources:y,selectedKey:b?.key??``,loading:e.loading,activeTab:e.activeTab,onSelect:n,children:(0,g.jsx)(_,{source:b,state:r,onLoadMore:()=>{b!==void 0&&x(b,r?.nextCursor===void 0?{append:!0}:{append:!0,cursor:r.nextCursor})}})})})]})}function R(e){let t=e.sources.length!==1||e.loading;return(0,g.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,g.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-b border-border/80`,children:(0,g.jsxs)(`div`,{className:`flex min-h-11 min-w-max items-center gap-2`,children:[(0,g.jsx)(`span`,{className:`mr-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:u(e.activeTab)}),e.loading&&e.sources.length===0?(0,g.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:`Loading sources`}):null,!e.loading&&e.sources.length===0?(0,g.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:`No knowledge sources`}):null,e.sources.map(t=>(0,g.jsxs)(`button`,{className:[`flex h-7 items-center gap-2 rounded-lg border border-border/80 bg-background/45 px-2.5 text-xs font-semibold text-muted-foreground transition duration-200 hover:border-border/80 hover:bg-muted/45 hover:text-foreground focus-visible:border-ring focus-visible:outline-none`,e.selectedKey===t.key?`border-border/80 bg-muted/45 text-foreground`:``].join(` `),type:`button`,onClick:()=>e.onSelect(t.key),children:[(0,g.jsx)(`span`,{children:t.source.label??l(t.source.kind)}),t.source.itemCount===void 0?null:(0,g.jsx)(`span`,{className:`text-muted-foreground`,children:t.source.itemCount})]},t.key))]})}):null,e.children]})}function z(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{L as KnowledgePage};
2
+ //# sourceMappingURL=knowledge-page-DevVjoVt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-page-CpQCK-1A.js","names":[],"sources":["../../../src/ui/app/modules/knowledge/knowledge-panels.tsx","../../../src/ui/app/modules/knowledge/knowledge-page.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport type { StudioKnowledgeItem, StudioKnowledgeSummary } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { isRecord } from \"../shared/object\";\nimport { JsonSyntax, JsonValueView } from \"../shared/renderers\";\nimport { type ItemState, type KnowledgeSourceRef, sourceId, sourceLabel } from \"./knowledge-model\";\n\nexport function ItemBrowser(props: {\n source: KnowledgeSourceRef | undefined;\n state: ItemState | undefined;\n onLoadMore: () => void;\n}) {\n const state = props.state;\n if (props.source?.source.kind === \"dynamic_tools\") {\n return (\n <DynamicToolsBrowser source={props.source} state={state} onLoadMore={props.onLoadMore} />\n );\n }\n\n return (\n <section className=\"grid min-h-0 grid-rows-[minmax(0,1fr)_auto] overflow-hidden\">\n <div className=\"min-h-0 overflow-auto\">\n <div className=\"pb-4 pt-0\">\n {props.source === undefined ? <MutedRow text=\"No knowledge source selected\" /> : null}\n {state?.loading === true && state.items.length === 0 ? (\n <MutedRow text=\"Loading items\" />\n ) : null}\n {state?.error === undefined ? null : <MutedRow text={state.error} />}\n {state?.inspectable === false ? (\n <MutedRow text={state.message ?? \"This source does not expose browseable chunks.\"} />\n ) : null}\n {state?.inspectable !== false && state?.loading === false && state.items.length === 0 ? (\n <MutedRow text=\"No items in this source\" />\n ) : null}\n <div className=\"grid gap-3\">\n {state?.items.map((item) => (\n <KnowledgeItemCard\n item={item}\n key={`${item.kind}:${item.id}`}\n source={props.source}\n />\n ))}\n </div>\n </div>\n </div>\n <div className=\"flex min-h-12 items-center justify-between gap-3 border-t border-border/80 bg-muted/10 py-2\">\n <span className=\" text-xs text-muted-foreground\">\n {state === undefined ? \"0 loaded\" : `${state.items.length} loaded`}\n </span>\n <Button\n className=\"h-8 min-h-8\"\n type=\"button\"\n variant=\"secondary\"\n disabled={state?.loading === true || state?.nextCursor === undefined}\n onClick={props.onLoadMore}\n >\n Load more\n </Button>\n </div>\n </section>\n );\n}\n\nfunction KnowledgeItemCard(props: {\n item: StudioKnowledgeItem;\n source: KnowledgeSourceRef | undefined;\n}) {\n if (props.item.kind === \"dynamic_tool\") {\n return (\n <article className=\"rounded-xl border border-border/80 bg-background/55 p-4\">\n <DynamicToolInspector item={props.item} source={props.source} />\n </article>\n );\n }\n\n return (\n <article className=\"grid gap-3 rounded-xl border border-border/80 bg-background/55 p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-xs font-semibold text-foreground\">\n {props.item.toolName ?? props.item.id}\n </div>\n </div>\n {props.item.parameterKeys === undefined || props.item.parameterKeys.length === 0 ? null : (\n <Badge>{props.item.parameterKeys.length} params</Badge>\n )}\n </div>\n {props.item.description === undefined || props.item.description.length === 0 ? null : (\n <p className=\"m-0 text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]\">\n {props.item.description}\n </p>\n )}\n {props.item.text === undefined ? null : (\n <p className=\"m-0 whitespace-pre-wrap text-sm leading-6 text-foreground [overflow-wrap:anywhere]\">\n {props.item.text}\n </p>\n )}\n {props.item.document === undefined ? null : (\n <JsonBlock title=\"Document\" value={props.item.document} />\n )}\n {props.item.metadata === undefined ? null : (\n <JsonBlock title=\"Metadata\" value={props.item.metadata} />\n )}\n {props.item.parameterKeys === undefined || props.item.parameterKeys.length === 0 ? null : (\n <div className=\"flex flex-wrap gap-2\">\n {props.item.parameterKeys.map((key) => (\n <Badge key={key}>{key}</Badge>\n ))}\n </div>\n )}\n </article>\n );\n}\n\ntype DynamicToolParameter = {\n name: string;\n type: string;\n required: boolean;\n description: string | undefined;\n};\n\nfunction DynamicToolsBrowser(props: {\n source: KnowledgeSourceRef;\n state: ItemState | undefined;\n onLoadMore: () => void;\n}) {\n const tools = useMemo(\n () => (props.state?.items ?? []).filter(isDynamicToolItem),\n [props.state?.items],\n );\n const [selectedId, setSelectedId] = useState(\"\");\n const selectedTool = tools.find((item) => item.id === selectedId) ?? tools[0];\n const stats = useMemo(() => dynamicToolStats(tools), [tools]);\n\n useEffect(() => {\n if (tools.length === 0) {\n setSelectedId(\"\");\n return;\n }\n if (!tools.some((item) => item.id === selectedId)) {\n setSelectedId(tools[0]?.id ?? \"\");\n }\n }, [selectedId, tools]);\n\n return (\n <section className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden\">\n <header className=\"grid min-h-16 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 border-b border-border/80 py-3 max-md:grid-cols-1\">\n <div className=\"grid min-w-0 gap-1\">\n <div className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Runtime tool index\n </div>\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-sm\">\n <span className=\"font-semibold text-foreground\">\n {props.source.source.label ?? sourceLabel(props.source.source.kind)}\n </span>\n <span className=\"text-muted-foreground\">{props.source.agentName}</span>\n </div>\n </div>\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start\">\n <KnowledgeMetric label=\"tools\" value={tools.length} />\n <KnowledgeMetric label=\"params\" value={stats.parameterCount} />\n <KnowledgeMetric label=\"required\" value={stats.requiredCount} />\n </div>\n </header>\n\n <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)]\">\n <aside className=\"min-h-0 overflow-auto border-r border-border/80 pr-3 max-lg:border-b max-lg:border-r-0 max-lg:pr-0\">\n <div className=\"grid gap-1 py-3 pr-3 max-lg:pr-0\">\n {props.source === undefined ? <MutedRow text=\"No knowledge source selected\" /> : null}\n {props.state?.loading === true && tools.length === 0 ? (\n <MutedRow text=\"Loading dynamic tools\" />\n ) : null}\n {props.state?.error === undefined ? null : <MutedRow text={props.state.error} />}\n {props.state?.inspectable === false ? (\n <MutedRow\n text={props.state.message ?? \"This source does not expose browseable tools.\"}\n />\n ) : null}\n {props.state?.inspectable !== false &&\n props.state?.loading === false &&\n tools.length === 0 ? (\n <MutedRow text=\"No dynamic tools in this source\" />\n ) : null}\n {tools.map((item) => (\n <DynamicToolListItem\n active={selectedTool?.id === item.id}\n item={item}\n key={item.id}\n onSelect={() => setSelectedId(item.id)}\n />\n ))}\n </div>\n </aside>\n\n <div className=\"min-h-0 overflow-auto py-4 pl-5 max-lg:pl-0\">\n {selectedTool === undefined ? (\n <DynamicToolEmptyPanel />\n ) : (\n <DynamicToolInspector item={selectedTool} source={props.source} />\n )}\n </div>\n </div>\n\n <div className=\"flex min-h-12 items-center justify-between gap-3 border-t border-border/80 bg-background/30 py-2\">\n <span className=\"text-xs text-muted-foreground\">\n {props.state === undefined ? \"0 loaded\" : `${props.state.items.length} loaded`}\n </span>\n <Button\n className=\"h-8 min-h-8\"\n type=\"button\"\n variant=\"secondary\"\n disabled={props.state?.loading === true || props.state?.nextCursor === undefined}\n onClick={props.onLoadMore}\n >\n Load more\n </Button>\n </div>\n </section>\n );\n}\n\nfunction DynamicToolListItem(props: {\n item: StudioKnowledgeItem;\n active: boolean;\n onSelect: () => void;\n}) {\n const definition = dynamicToolDefinition(props.item);\n const parameters = dynamicToolParameters(props.item);\n const requiredCount = parameters.filter((parameter) => parameter.required).length;\n const toolName = definition.name ?? props.item.toolName ?? props.item.id;\n\n return (\n <button\n className={[\n \"grid min-w-0 gap-2 rounded-lg border border-transparent px-3 py-3 text-left transition duration-200 hover:border-border/80 hover:bg-muted/25 focus-visible:border-ring focus-visible:outline-none\",\n props.active ? \"border-border/80 bg-muted/35 text-foreground\" : \"text-muted-foreground\",\n ].join(\" \")}\n type=\"button\"\n onClick={props.onSelect}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate font-mono text-sm font-semibold text-foreground\">\n {toolName}\n </span>\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {parameters.length}\n </span>\n </div>\n <p className=\"m-0 line-clamp-2 text-xs leading-5 text-muted-foreground\">\n {definition.description ?? props.item.description ?? \"No description\"}\n </p>\n <div className=\"flex min-w-0 flex-wrap gap-2 text-[11px] font-medium text-muted-foreground\">\n <span>{requiredCount} required</span>\n <span>{parameters.length - requiredCount} optional</span>\n </div>\n </button>\n );\n}\n\nfunction DynamicToolInspector(props: {\n item: StudioKnowledgeItem;\n source: KnowledgeSourceRef | undefined;\n}) {\n const definition = dynamicToolDefinition(props.item);\n const parameters = dynamicToolParameters(props.item);\n const description = definition.description ?? props.item.description;\n const toolName = definition.name ?? props.item.toolName ?? props.item.id;\n\n return (\n <article className=\"grid min-w-0 gap-5\">\n <header className=\"grid gap-4 border-b border-border/80 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 Selected tool\n </div>\n <h2 className=\"m-0 truncate font-mono text-2xl font-semibold leading-none text-foreground\">\n {toolName}\n </h2>\n </div>\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start\">\n <Badge>{parameters.length} params</Badge>\n <Badge>{parameters.filter((parameter) => parameter.required).length} required</Badge>\n </div>\n </div>\n {description === undefined || description.length === 0 ? null : (\n <p className=\"m-0 max-w-[72ch] text-base leading-7 text-muted-foreground [overflow-wrap:anywhere]\">\n {description}\n </p>\n )}\n <div className=\"min-w-0 overflow-x-auto border-y border-border/80 bg-muted/15 px-3 py-2\">\n <code className=\"font-mono text-sm leading-6 text-foreground\">\n {dynamicToolSignature(toolName, parameters)}\n </code>\n </div>\n </header>\n\n <DynamicToolParameterList parameters={parameters} />\n <DynamicToolSourceDetails item={props.item} source={props.source} />\n\n {props.item.document === undefined ? null : (\n <JsonDetails title=\"Raw definition\" value={props.item.document} />\n )}\n\n {props.item.metadata === undefined ? null : (\n <JsonDetails title=\"Metadata\" value={props.item.metadata} />\n )}\n </article>\n );\n}\n\nfunction DynamicToolParameterList(props: { parameters: DynamicToolParameter[] }) {\n return (\n <section className=\"grid gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <h3 className=\"m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Parameters\n </h3>\n <span className=\"text-xs font-medium text-muted-foreground\">\n {props.parameters.length === 0 ? \"No parameters\" : `${props.parameters.length} defined`}\n </span>\n </div>\n {props.parameters.length === 0 ? (\n <div className=\"border-y border-dashed border-border/80 px-3 py-4 text-sm text-muted-foreground\">\n This tool does not declare input parameters.\n </div>\n ) : (\n <div className=\"min-w-0 overflow-hidden border-y border-border/80\">\n {props.parameters.map((parameter) => (\n <div\n 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-border/70 py-3 last:border-b-0 max-md:grid-cols-1 max-md:gap-1\"\n key={parameter.name}\n >\n <div className=\"min-w-0 font-mono text-sm font-semibold text-foreground [overflow-wrap:anywhere]\">\n {parameter.name}\n </div>\n <div className=\"text-sm text-muted-foreground [overflow-wrap:anywhere]\">\n {parameter.type}\n </div>\n <div className=\"text-sm text-muted-foreground\">\n {parameter.required ? \"Required\" : \"Optional\"}\n </div>\n <div className=\"text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]\">\n {parameter.description ?? \"No description\"}\n </div>\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction DynamicToolSourceDetails(props: {\n item: StudioKnowledgeItem;\n source: KnowledgeSourceRef | undefined;\n}) {\n const details = [\n { label: \"Agent\", value: props.source?.agentName ?? props.source?.agentId },\n {\n label: \"Source\",\n value:\n props.source === undefined\n ? undefined\n : `${props.source.source.label ?? sourceLabel(props.source.source.kind)} / ${sourceId(\n props.source.source,\n )}`,\n },\n { label: \"Item ID\", value: props.item.id },\n ].filter((item): item is { label: string; value: string } => item.value !== undefined);\n\n if (details.length === 0) {\n return null;\n }\n\n return (\n <section className=\"grid gap-3 border-t border-border/80 pt-4\">\n <h3 className=\"m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Source\n </h3>\n <dl className=\"grid border-y border-border/80 sm:grid-cols-3 sm:divide-x sm:divide-border/80\">\n {details.map((detail) => (\n <div className=\"min-w-0 px-3 py-3 first:pl-0 last:pr-0\" key={detail.label}>\n <dt className=\"text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {detail.label}\n </dt>\n <dd className=\"m-0 mt-1 truncate text-sm font-medium text-foreground\">\n {detail.value}\n </dd>\n </div>\n ))}\n </dl>\n </section>\n );\n}\n\nfunction DynamicToolEmptyPanel() {\n return (\n <section className=\"grid h-full min-h-80 place-items-center border-y border-dashed border-border/80 px-6 text-center\">\n <div className=\"grid max-w-sm gap-2\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">No dynamic tool selected</h2>\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">\n Select a tool from the index to inspect its definition and parameters.\n </p>\n </div>\n </section>\n );\n}\n\nfunction dynamicToolDefinition(item: StudioKnowledgeItem): {\n name: string | undefined;\n description: string | undefined;\n parameters: unknown;\n} {\n const document = isRecord(item.document) ? item.document : undefined;\n const definition = isRecord(document?.definition) ? document.definition : undefined;\n const name =\n typeof definition?.name === \"string\"\n ? definition.name\n : typeof document?.toolName === \"string\"\n ? document.toolName\n : item.toolName;\n const description =\n typeof definition?.description === \"string\" ? definition.description : item.description;\n\n return {\n name,\n description,\n parameters: definition?.parameters,\n };\n}\n\nfunction dynamicToolParameters(item: StudioKnowledgeItem): DynamicToolParameter[] {\n const definition = dynamicToolDefinition(item);\n const schema = isRecord(definition.parameters) ? definition.parameters : undefined;\n const properties = isRecord(schema?.properties) ? schema.properties : undefined;\n const required = new Set(\n Array.isArray(schema?.required)\n ? schema.required.filter((value): value is string => typeof value === \"string\")\n : [],\n );\n\n if (properties === undefined) {\n return (item.parameterKeys ?? []).map((name) => ({\n name,\n type: \"unknown\",\n required: false,\n description: undefined,\n }));\n }\n\n return Object.entries(properties).map(([name, value]) => {\n const property = isRecord(value) ? value : {};\n return {\n name,\n type: schemaTypeLabel(property.type),\n required: required.has(name),\n description: typeof property.description === \"string\" ? property.description : undefined,\n };\n });\n}\n\nfunction isDynamicToolItem(item: StudioKnowledgeItem): item is StudioKnowledgeItem & {\n kind: \"dynamic_tool\";\n} {\n return item.kind === \"dynamic_tool\";\n}\n\nfunction dynamicToolStats(items: StudioKnowledgeItem[]): {\n parameterCount: number;\n requiredCount: number;\n} {\n return items.reduce(\n (totals, item) => {\n const parameters = dynamicToolParameters(item);\n totals.parameterCount += parameters.length;\n totals.requiredCount += parameters.filter((parameter) => parameter.required).length;\n return totals;\n },\n { parameterCount: 0, requiredCount: 0 },\n );\n}\n\nfunction dynamicToolSignature(toolName: string, parameters: DynamicToolParameter[]): string {\n if (parameters.length === 0) {\n return `${toolName}()`;\n }\n return `${toolName}({ ${parameters\n .map((parameter) => `${parameter.name}${parameter.required ? \"\" : \"?\"}: ${parameter.type}`)\n .join(\", \")} })`;\n}\n\nfunction KnowledgeMetric(props: { label: string; value: number }) {\n return (\n <span className=\"inline-flex h-8 items-center gap-2 border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground\">\n <span className=\"font-semibold tabular-nums text-foreground\">{props.value}</span>\n {props.label}\n </span>\n );\n}\n\nfunction schemaTypeLabel(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value)) {\n const labels = value.filter((item): item is string => typeof item === \"string\");\n return labels.length === 0 ? \"unknown\" : labels.join(\" / \");\n }\n return \"unknown\";\n}\n\nfunction JsonDetails(props: { title: string; value: unknown }) {\n const display = jsonDisplay(props.value);\n\n return (\n <details className=\"group rounded-xl border border-border/80 bg-card/30\">\n <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\">\n <span>{props.title}</span>\n <span className=\"text-xs normal-case tracking-normal text-muted-foreground group-open:hidden\">\n Show\n </span>\n <span className=\"hidden text-xs normal-case tracking-normal text-muted-foreground group-open:inline\">\n Hide\n </span>\n </summary>\n <div className=\"border-t border-border/70\">\n <pre className=\"m-0 max-h-96 overflow-auto p-4 font-mono text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={display} />\n </code>\n </pre>\n </div>\n </details>\n );\n}\n\nfunction jsonDisplay(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return JSON.stringify(String(value), null, 2);\n }\n}\n\nexport function RetrievalLogPanel(props: {\n evidence: NonNullable<StudioKnowledgeSummary[\"evidence\"]>;\n onOpenTrace: (traceId: string) => void;\n}) {\n return (\n <section className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden rounded-xl border border-border/80 bg-card/55\">\n <div className=\"border-b border-border/80 px-4 py-3\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h2 className=\"m-0 truncate text-sm font-semibold text-foreground\">Retrieval log</h2>\n <p className=\"m-0 mt-1 truncate text-xs text-muted-foreground\">\n traces / retrieval-evidence\n </p>\n </div>\n <Badge>{props.evidence.length} entries</Badge>\n </div>\n </div>\n <div className=\"min-h-0 overflow-auto p-4\">\n {props.evidence.length === 0 ? (\n <MutedRow text=\"No retrieval evidence captured yet\" />\n ) : null}\n <div className=\"grid gap-3\">\n {props.evidence.map((item) => (\n <article\n className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-3\"\n key={`${item.traceId}:${item.observationId}`}\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 text-foreground\">\n {item.observationName}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">Turn {item.turn}</div>\n </div>\n <Button\n className=\"h-auto min-h-0 rounded-lg border border-border bg-muted px-2 py-1 text-xs text-muted-foreground\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onOpenTrace(item.traceId)}\n >\n Trace\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Badge>{item.documentCount} docs</Badge>\n <Badge>{item.toolCount} tools</Badge>\n </div>\n {item.query === undefined ? null : (\n <p className=\"m-0 text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.14em] text-foreground\">\n Query\n </span>{\" \"}\n {item.query}\n </p>\n )}\n {item.documents.slice(0, 2).map((document) => (\n <p\n className=\"m-0 text-xs leading-5 text-muted-foreground [overflow-wrap:anywhere]\"\n key={`${document.id ?? \"doc\"}:${document.text ?? \"\"}`}\n >\n <span className=\" text-foreground\">{document.id ?? \"document\"}</span>{\" \"}\n {document.text ?? \"\"}\n </p>\n ))}\n {item.tools.length === 0 ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">\n Tools: {item.tools.join(\", \")}\n </p>\n )}\n </article>\n ))}\n </div>\n </div>\n </section>\n );\n}\n\nfunction JsonBlock(props: { title: string; value: unknown }) {\n return (\n <div className=\"grid gap-2 border-t border-border/70 pt-3\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {props.title}\n </div>\n <JsonValueView value={props.value} />\n </div>\n );\n}\n\nexport function EmptyState(props: { title: string; text: string }) {\n return (\n <section className=\"grid h-full place-items-center p-8\">\n <div className=\"grid max-w-sm gap-2 text-center\">\n <h1 className=\"m-0 text-base font-semibold text-foreground\">{props.title}</h1>\n <p className=\"m-0 text-sm font-medium leading-6 text-muted-foreground\">{props.text}</p>\n </div>\n </section>\n );\n}\n\nfunction MutedRow(props: { text: string }) {\n return (\n <div className=\"rounded-lg border border-dashed border-border px-4 py-3 text-sm font-medium text-muted-foreground\">\n {props.text}\n </div>\n );\n}\n","import { RefreshIcon } from \"@hugeicons/core-free-icons\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { StudioKnowledgeItemsPage, StudioKnowledgeSummary } from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport type { KnowledgeTab } from \"../shared/types\";\nimport {\n flattenSources,\n type ItemState,\n itemLimit,\n type KnowledgeSourceRef,\n sourceId,\n sourceKindForTab,\n sourceLabel,\n tabLabel,\n} from \"./knowledge-model\";\nimport { ItemBrowser, RetrievalLogPanel } from \"./knowledge-panels\";\n\nexport function KnowledgePage(props: {\n activeTab: KnowledgeTab;\n enabled: boolean;\n summary: StudioKnowledgeSummary | undefined;\n loading: boolean;\n onOpenTrace: (traceId: string) => void;\n onRefresh: () => void;\n}) {\n const [selectedKey, setSelectedKey] = useState(\"\");\n const [itemState, setItemState] = useState<ItemState | undefined>();\n\n const agents = props.summary?.agents ?? [];\n const evidence = props.summary?.evidence ?? [];\n const sources = useMemo(() => flattenSources(agents), [agents]);\n const activeSourceKind = sourceKindForTab(props.activeTab);\n const visibleSources = useMemo(\n () =>\n activeSourceKind === undefined\n ? []\n : sources.filter((source) => source.source.kind === activeSourceKind),\n [activeSourceKind, sources],\n );\n const selectedSource =\n visibleSources.find((source) => source.key === selectedKey) ?? visibleSources[0];\n\n useEffect(() => {\n if (visibleSources.length === 0) {\n setSelectedKey(\"\");\n return;\n }\n if (visibleSources.some((source) => source.key === selectedKey)) {\n return;\n }\n const next =\n visibleSources.find(\n (source) => source.source.inspectable === true && (source.source.itemCount ?? 0) > 0,\n ) ??\n visibleSources.find((source) => source.source.inspectable === true) ??\n visibleSources[0];\n setSelectedKey(next?.key ?? \"\");\n }, [selectedKey, visibleSources]);\n\n const loadItems = useCallback(\n async (source: KnowledgeSourceRef, options: { append: boolean; cursor?: string }) => {\n const sourceKey = source.key;\n setItemState((current) => ({\n key: sourceKey,\n loading: true,\n inspectable:\n current?.key === sourceKey ? current.inspectable : source.source.inspectable === true,\n items: options.append && current?.key === sourceKey ? current.items : [],\n ...(options.append && current?.key === sourceKey && current.nextCursor !== undefined\n ? { nextCursor: current.nextCursor }\n : {}),\n ...(current?.key === sourceKey && current.totalCount !== undefined\n ? { totalCount: current.totalCount }\n : {}),\n }));\n\n try {\n const params = new URLSearchParams({\n agentId: source.agentId,\n sourceId: sourceId(source.source),\n limit: String(itemLimit),\n });\n if (options.cursor !== undefined) {\n params.set(\"cursor\", options.cursor);\n }\n const response = await fetch(`/knowledge/items?${params.toString()}`);\n if (!response.ok) {\n throw new Error(`Knowledge items failed with HTTP ${response.status}`);\n }\n const page = (await response.json()) as StudioKnowledgeItemsPage;\n setItemState((current) => {\n if (current?.key !== sourceKey) {\n return current;\n }\n return {\n key: sourceKey,\n loading: false,\n inspectable: page.inspectable,\n items: options.append ? [...current.items, ...page.items] : page.items,\n ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }),\n ...(page.totalCount === undefined ? {} : { totalCount: page.totalCount }),\n ...(page.message === undefined ? {} : { message: page.message }),\n };\n });\n } catch (error) {\n setItemState((current) => {\n if (current?.key !== sourceKey) {\n return current;\n }\n return {\n key: sourceKey,\n loading: false,\n inspectable: current.inspectable,\n items: current.items,\n error: error instanceof Error ? error.message : String(error),\n };\n });\n }\n },\n [],\n );\n\n useEffect(() => {\n if (!props.enabled || selectedSource === undefined) {\n setItemState(undefined);\n return;\n }\n void loadItems(selectedSource, { append: false });\n }, [loadItems, props.enabled, selectedSource]);\n\n return (\n <section className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55\">\n <header className=\"bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur\">\n <div className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1\">\n <div className=\"grid min-w-0 gap-2\">\n <h1 className=\"m-0 text-2xl font-semibold leading-none tracking-tight text-foreground\">\n {tabLabel(props.activeTab)}\n </h1>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n {knowledgePageDescription(props.activeTab)}\n </p>\n </div>\n <Button\n className=\"h-8 min-h-8 gap-2\"\n type=\"button\"\n variant=\"secondary\"\n disabled={!props.enabled}\n onClick={props.onRefresh}\n >\n <StudioIcon icon={RefreshIcon} aria-hidden=\"true\" />\n Refresh\n </Button>\n </div>\n </header>\n <div className=\"grid min-h-0 grid-rows-[minmax(0,1fr)] overflow-hidden pb-6 pl-4 pr-6 pt-0\">\n {props.activeTab === \"retrieval-log\" ? (\n <RetrievalLogPanel evidence={evidence} onOpenTrace={props.onOpenTrace} />\n ) : (\n <SourceWorkspace\n sources={visibleSources}\n selectedKey={selectedSource?.key ?? \"\"}\n loading={props.loading}\n activeTab={props.activeTab}\n onSelect={setSelectedKey}\n >\n <ItemBrowser\n source={selectedSource}\n state={itemState}\n onLoadMore={() => {\n if (selectedSource === undefined) {\n return;\n }\n void loadItems(\n selectedSource,\n itemState?.nextCursor === undefined\n ? { append: true }\n : { append: true, cursor: itemState.nextCursor },\n );\n }}\n />\n </SourceWorkspace>\n )}\n </div>\n </section>\n );\n}\n\nfunction SourceWorkspace(props: {\n sources: KnowledgeSourceRef[];\n selectedKey: string;\n loading: boolean;\n activeTab: KnowledgeTab;\n onSelect: (key: string) => void;\n children: ReactNode;\n}) {\n const showSources = props.sources.length !== 1 || props.loading;\n return (\n <div\n className={[\n \"grid min-h-0 gap-3 overflow-hidden\",\n showSources ? \"grid-rows-[auto_minmax(0,1fr)]\" : \"grid-rows-[minmax(0,1fr)]\",\n ].join(\" \")}\n >\n {showSources ? (\n <div className=\"min-w-0 overflow-x-auto border-b border-border/80\">\n <div className=\"flex min-h-11 min-w-max items-center gap-2\">\n <span className=\"mr-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n {tabLabel(props.activeTab)}\n </span>\n {props.loading && props.sources.length === 0 ? (\n <span className=\" text-xs text-muted-foreground\">Loading sources</span>\n ) : null}\n {!props.loading && props.sources.length === 0 ? (\n <span className=\" text-xs text-muted-foreground\">No knowledge sources</span>\n ) : null}\n {props.sources.map((source) => (\n <button\n className={[\n \"flex h-7 items-center gap-2 rounded-lg border border-border/80 bg-background/45 px-2.5 text-xs font-semibold text-muted-foreground transition duration-200 hover:border-border/80 hover:bg-muted/45 hover:text-foreground focus-visible:border-ring focus-visible:outline-none\",\n props.selectedKey === source.key\n ? \"border-border/80 bg-muted/45 text-foreground\"\n : \"\",\n ].join(\" \")}\n key={source.key}\n type=\"button\"\n onClick={() => props.onSelect(source.key)}\n >\n <span>{source.source.label ?? sourceLabel(source.source.kind)}</span>\n {source.source.itemCount === undefined ? null : (\n <span className=\"text-muted-foreground\">{source.source.itemCount}</span>\n )}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n {props.children}\n </div>\n );\n}\n\nfunction knowledgePageDescription(tab: KnowledgeTab): string {\n switch (tab) {\n case \"static-context\":\n return \"Browse configured static context exposed to agents.\";\n case \"dynamic-context\":\n return \"Inspect dynamic context chunks resolved at runtime.\";\n case \"dynamic-tools\":\n return \"Review dynamic tool definitions and parameters.\";\n case \"retrieval-log\":\n return \"Inspect retrieval evidence and jump into related traces.\";\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-page-DevVjoVt.js","names":[],"sources":["../../../src/ui/app/modules/knowledge/knowledge-panels.tsx","../../../src/ui/app/modules/knowledge/knowledge-page.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport type { StudioKnowledgeItem, StudioKnowledgeSummary } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { isRecord } from \"../shared/object\";\nimport { JsonSyntax, JsonValueView } from \"../shared/renderers\";\nimport { type ItemState, type KnowledgeSourceRef, sourceId, sourceLabel } from \"./knowledge-model\";\n\nexport function ItemBrowser(props: {\n source: KnowledgeSourceRef | undefined;\n state: ItemState | undefined;\n onLoadMore: () => void;\n}) {\n const state = props.state;\n if (props.source?.source.kind === \"dynamic_tools\") {\n return (\n <DynamicToolsBrowser source={props.source} state={state} onLoadMore={props.onLoadMore} />\n );\n }\n\n return (\n <section className=\"grid min-h-0 grid-rows-[minmax(0,1fr)_auto] overflow-hidden\">\n <div className=\"min-h-0 overflow-auto\">\n <div className=\"pb-4 pt-0\">\n {props.source === undefined ? <MutedRow text=\"No knowledge source selected\" /> : null}\n {state?.loading === true && state.items.length === 0 ? (\n <MutedRow text=\"Loading items\" />\n ) : null}\n {state?.error === undefined ? null : <MutedRow text={state.error} />}\n {state?.inspectable === false ? (\n <MutedRow text={state.message ?? \"This source does not expose browseable chunks.\"} />\n ) : null}\n {state?.inspectable !== false && state?.loading === false && state.items.length === 0 ? (\n <MutedRow text=\"No items in this source\" />\n ) : null}\n <div className=\"grid gap-3\">\n {state?.items.map((item) => (\n <KnowledgeItemCard\n item={item}\n key={`${item.kind}:${item.id}`}\n source={props.source}\n />\n ))}\n </div>\n </div>\n </div>\n <div className=\"flex min-h-12 items-center justify-between gap-3 border-t border-border/80 bg-muted/10 py-2\">\n <span className=\" text-xs text-muted-foreground\">\n {state === undefined ? \"0 loaded\" : `${state.items.length} loaded`}\n </span>\n <Button\n className=\"h-8 min-h-8\"\n type=\"button\"\n variant=\"secondary\"\n disabled={state?.loading === true || state?.nextCursor === undefined}\n onClick={props.onLoadMore}\n >\n Load more\n </Button>\n </div>\n </section>\n );\n}\n\nfunction KnowledgeItemCard(props: {\n item: StudioKnowledgeItem;\n source: KnowledgeSourceRef | undefined;\n}) {\n if (props.item.kind === \"dynamic_tool\") {\n return (\n <article className=\"rounded-xl border border-border/80 bg-background/55 p-4\">\n <DynamicToolInspector item={props.item} source={props.source} />\n </article>\n );\n }\n\n return (\n <article className=\"grid gap-3 rounded-xl border border-border/80 bg-background/55 p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-xs font-semibold text-foreground\">\n {props.item.toolName ?? props.item.id}\n </div>\n </div>\n {props.item.parameterKeys === undefined || props.item.parameterKeys.length === 0 ? null : (\n <Badge>{props.item.parameterKeys.length} params</Badge>\n )}\n </div>\n {props.item.description === undefined || props.item.description.length === 0 ? null : (\n <p className=\"m-0 text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]\">\n {props.item.description}\n </p>\n )}\n {props.item.text === undefined ? null : (\n <p className=\"m-0 whitespace-pre-wrap text-sm leading-6 text-foreground [overflow-wrap:anywhere]\">\n {props.item.text}\n </p>\n )}\n {props.item.document === undefined ? null : (\n <JsonBlock title=\"Document\" value={props.item.document} />\n )}\n {props.item.metadata === undefined ? null : (\n <JsonBlock title=\"Metadata\" value={props.item.metadata} />\n )}\n {props.item.parameterKeys === undefined || props.item.parameterKeys.length === 0 ? null : (\n <div className=\"flex flex-wrap gap-2\">\n {props.item.parameterKeys.map((key) => (\n <Badge key={key}>{key}</Badge>\n ))}\n </div>\n )}\n </article>\n );\n}\n\ntype DynamicToolParameter = {\n name: string;\n type: string;\n required: boolean;\n description: string | undefined;\n};\n\nfunction DynamicToolsBrowser(props: {\n source: KnowledgeSourceRef;\n state: ItemState | undefined;\n onLoadMore: () => void;\n}) {\n const tools = useMemo(\n () => (props.state?.items ?? []).filter(isDynamicToolItem),\n [props.state?.items],\n );\n const [selectedId, setSelectedId] = useState(\"\");\n const selectedTool = tools.find((item) => item.id === selectedId) ?? tools[0];\n const stats = useMemo(() => dynamicToolStats(tools), [tools]);\n\n useEffect(() => {\n if (tools.length === 0) {\n setSelectedId(\"\");\n return;\n }\n if (!tools.some((item) => item.id === selectedId)) {\n setSelectedId(tools[0]?.id ?? \"\");\n }\n }, [selectedId, tools]);\n\n return (\n <section className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden\">\n <header className=\"grid min-h-16 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 border-b border-border/80 py-3 max-md:grid-cols-1\">\n <div className=\"grid min-w-0 gap-1\">\n <div className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Runtime tool index\n </div>\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-sm\">\n <span className=\"font-semibold text-foreground\">\n {props.source.source.label ?? sourceLabel(props.source.source.kind)}\n </span>\n <span className=\"text-muted-foreground\">{props.source.agentName}</span>\n </div>\n </div>\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start\">\n <KnowledgeMetric label=\"tools\" value={tools.length} />\n <KnowledgeMetric label=\"params\" value={stats.parameterCount} />\n <KnowledgeMetric label=\"required\" value={stats.requiredCount} />\n </div>\n </header>\n\n <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)]\">\n <aside className=\"min-h-0 overflow-auto border-r border-border/80 pr-3 max-lg:border-b max-lg:border-r-0 max-lg:pr-0\">\n <div className=\"grid gap-1 py-3 pr-3 max-lg:pr-0\">\n {props.source === undefined ? <MutedRow text=\"No knowledge source selected\" /> : null}\n {props.state?.loading === true && tools.length === 0 ? (\n <MutedRow text=\"Loading dynamic tools\" />\n ) : null}\n {props.state?.error === undefined ? null : <MutedRow text={props.state.error} />}\n {props.state?.inspectable === false ? (\n <MutedRow\n text={props.state.message ?? \"This source does not expose browseable tools.\"}\n />\n ) : null}\n {props.state?.inspectable !== false &&\n props.state?.loading === false &&\n tools.length === 0 ? (\n <MutedRow text=\"No dynamic tools in this source\" />\n ) : null}\n {tools.map((item) => (\n <DynamicToolListItem\n active={selectedTool?.id === item.id}\n item={item}\n key={item.id}\n onSelect={() => setSelectedId(item.id)}\n />\n ))}\n </div>\n </aside>\n\n <div className=\"min-h-0 overflow-auto py-4 pl-5 max-lg:pl-0\">\n {selectedTool === undefined ? (\n <DynamicToolEmptyPanel />\n ) : (\n <DynamicToolInspector item={selectedTool} source={props.source} />\n )}\n </div>\n </div>\n\n <div className=\"flex min-h-12 items-center justify-between gap-3 border-t border-border/80 bg-background/30 py-2\">\n <span className=\"text-xs text-muted-foreground\">\n {props.state === undefined ? \"0 loaded\" : `${props.state.items.length} loaded`}\n </span>\n <Button\n className=\"h-8 min-h-8\"\n type=\"button\"\n variant=\"secondary\"\n disabled={props.state?.loading === true || props.state?.nextCursor === undefined}\n onClick={props.onLoadMore}\n >\n Load more\n </Button>\n </div>\n </section>\n );\n}\n\nfunction DynamicToolListItem(props: {\n item: StudioKnowledgeItem;\n active: boolean;\n onSelect: () => void;\n}) {\n const definition = dynamicToolDefinition(props.item);\n const parameters = dynamicToolParameters(props.item);\n const requiredCount = parameters.filter((parameter) => parameter.required).length;\n const toolName = definition.name ?? props.item.toolName ?? props.item.id;\n\n return (\n <button\n className={[\n \"grid min-w-0 gap-2 rounded-lg border border-transparent px-3 py-3 text-left transition duration-200 hover:border-border/80 hover:bg-muted/25 focus-visible:border-ring focus-visible:outline-none\",\n props.active ? \"border-border/80 bg-muted/35 text-foreground\" : \"text-muted-foreground\",\n ].join(\" \")}\n type=\"button\"\n onClick={props.onSelect}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate font-mono text-sm font-semibold text-foreground\">\n {toolName}\n </span>\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {parameters.length}\n </span>\n </div>\n <p className=\"m-0 line-clamp-2 text-xs leading-5 text-muted-foreground\">\n {definition.description ?? props.item.description ?? \"No description\"}\n </p>\n <div className=\"flex min-w-0 flex-wrap gap-2 text-[11px] font-medium text-muted-foreground\">\n <span>{requiredCount} required</span>\n <span>{parameters.length - requiredCount} optional</span>\n </div>\n </button>\n );\n}\n\nfunction DynamicToolInspector(props: {\n item: StudioKnowledgeItem;\n source: KnowledgeSourceRef | undefined;\n}) {\n const definition = dynamicToolDefinition(props.item);\n const parameters = dynamicToolParameters(props.item);\n const description = definition.description ?? props.item.description;\n const toolName = definition.name ?? props.item.toolName ?? props.item.id;\n\n return (\n <article className=\"grid min-w-0 gap-5\">\n <header className=\"grid gap-4 border-b border-border/80 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 Selected tool\n </div>\n <h2 className=\"m-0 truncate font-mono text-2xl font-semibold leading-none text-foreground\">\n {toolName}\n </h2>\n </div>\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start\">\n <Badge>{parameters.length} params</Badge>\n <Badge>{parameters.filter((parameter) => parameter.required).length} required</Badge>\n </div>\n </div>\n {description === undefined || description.length === 0 ? null : (\n <p className=\"m-0 max-w-[72ch] text-base leading-7 text-muted-foreground [overflow-wrap:anywhere]\">\n {description}\n </p>\n )}\n <div className=\"min-w-0 overflow-x-auto border-y border-border/80 bg-muted/15 px-3 py-2\">\n <code className=\"font-mono text-sm leading-6 text-foreground\">\n {dynamicToolSignature(toolName, parameters)}\n </code>\n </div>\n </header>\n\n <DynamicToolParameterList parameters={parameters} />\n <DynamicToolSourceDetails item={props.item} source={props.source} />\n\n {props.item.document === undefined ? null : (\n <JsonDetails title=\"Raw definition\" value={props.item.document} />\n )}\n\n {props.item.metadata === undefined ? null : (\n <JsonDetails title=\"Metadata\" value={props.item.metadata} />\n )}\n </article>\n );\n}\n\nfunction DynamicToolParameterList(props: { parameters: DynamicToolParameter[] }) {\n return (\n <section className=\"grid gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <h3 className=\"m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Parameters\n </h3>\n <span className=\"text-xs font-medium text-muted-foreground\">\n {props.parameters.length === 0 ? \"No parameters\" : `${props.parameters.length} defined`}\n </span>\n </div>\n {props.parameters.length === 0 ? (\n <div className=\"border-y border-dashed border-border/80 px-3 py-4 text-sm text-muted-foreground\">\n This tool does not declare input parameters.\n </div>\n ) : (\n <div className=\"min-w-0 overflow-hidden border-y border-border/80\">\n {props.parameters.map((parameter) => (\n <div\n 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-border/70 py-3 last:border-b-0 max-md:grid-cols-1 max-md:gap-1\"\n key={parameter.name}\n >\n <div className=\"min-w-0 font-mono text-sm font-semibold text-foreground [overflow-wrap:anywhere]\">\n {parameter.name}\n </div>\n <div className=\"text-sm text-muted-foreground [overflow-wrap:anywhere]\">\n {parameter.type}\n </div>\n <div className=\"text-sm text-muted-foreground\">\n {parameter.required ? \"Required\" : \"Optional\"}\n </div>\n <div className=\"text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]\">\n {parameter.description ?? \"No description\"}\n </div>\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction DynamicToolSourceDetails(props: {\n item: StudioKnowledgeItem;\n source: KnowledgeSourceRef | undefined;\n}) {\n const details = [\n { label: \"Agent\", value: props.source?.agentName ?? props.source?.agentId },\n {\n label: \"Source\",\n value:\n props.source === undefined\n ? undefined\n : `${props.source.source.label ?? sourceLabel(props.source.source.kind)} / ${sourceId(\n props.source.source,\n )}`,\n },\n { label: \"Item ID\", value: props.item.id },\n ].filter((item): item is { label: string; value: string } => item.value !== undefined);\n\n if (details.length === 0) {\n return null;\n }\n\n return (\n <section className=\"grid gap-3 border-t border-border/80 pt-4\">\n <h3 className=\"m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Source\n </h3>\n <dl className=\"grid border-y border-border/80 sm:grid-cols-3 sm:divide-x sm:divide-border/80\">\n {details.map((detail) => (\n <div className=\"min-w-0 px-3 py-3 first:pl-0 last:pr-0\" key={detail.label}>\n <dt className=\"text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {detail.label}\n </dt>\n <dd className=\"m-0 mt-1 truncate text-sm font-medium text-foreground\">\n {detail.value}\n </dd>\n </div>\n ))}\n </dl>\n </section>\n );\n}\n\nfunction DynamicToolEmptyPanel() {\n return (\n <section className=\"grid h-full min-h-80 place-items-center border-y border-dashed border-border/80 px-6 text-center\">\n <div className=\"grid max-w-sm gap-2\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">No dynamic tool selected</h2>\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">\n Select a tool from the index to inspect its definition and parameters.\n </p>\n </div>\n </section>\n );\n}\n\nfunction dynamicToolDefinition(item: StudioKnowledgeItem): {\n name: string | undefined;\n description: string | undefined;\n parameters: unknown;\n} {\n const document = isRecord(item.document) ? item.document : undefined;\n const definition = isRecord(document?.definition) ? document.definition : undefined;\n const name =\n typeof definition?.name === \"string\"\n ? definition.name\n : typeof document?.toolName === \"string\"\n ? document.toolName\n : item.toolName;\n const description =\n typeof definition?.description === \"string\" ? definition.description : item.description;\n\n return {\n name,\n description,\n parameters: definition?.parameters,\n };\n}\n\nfunction dynamicToolParameters(item: StudioKnowledgeItem): DynamicToolParameter[] {\n const definition = dynamicToolDefinition(item);\n const schema = isRecord(definition.parameters) ? definition.parameters : undefined;\n const properties = isRecord(schema?.properties) ? schema.properties : undefined;\n const required = new Set(\n Array.isArray(schema?.required)\n ? schema.required.filter((value): value is string => typeof value === \"string\")\n : [],\n );\n\n if (properties === undefined) {\n return (item.parameterKeys ?? []).map((name) => ({\n name,\n type: \"unknown\",\n required: false,\n description: undefined,\n }));\n }\n\n return Object.entries(properties).map(([name, value]) => {\n const property = isRecord(value) ? value : {};\n return {\n name,\n type: schemaTypeLabel(property.type),\n required: required.has(name),\n description: typeof property.description === \"string\" ? property.description : undefined,\n };\n });\n}\n\nfunction isDynamicToolItem(item: StudioKnowledgeItem): item is StudioKnowledgeItem & {\n kind: \"dynamic_tool\";\n} {\n return item.kind === \"dynamic_tool\";\n}\n\nfunction dynamicToolStats(items: StudioKnowledgeItem[]): {\n parameterCount: number;\n requiredCount: number;\n} {\n return items.reduce(\n (totals, item) => {\n const parameters = dynamicToolParameters(item);\n totals.parameterCount += parameters.length;\n totals.requiredCount += parameters.filter((parameter) => parameter.required).length;\n return totals;\n },\n { parameterCount: 0, requiredCount: 0 },\n );\n}\n\nfunction dynamicToolSignature(toolName: string, parameters: DynamicToolParameter[]): string {\n if (parameters.length === 0) {\n return `${toolName}()`;\n }\n return `${toolName}({ ${parameters\n .map((parameter) => `${parameter.name}${parameter.required ? \"\" : \"?\"}: ${parameter.type}`)\n .join(\", \")} })`;\n}\n\nfunction KnowledgeMetric(props: { label: string; value: number }) {\n return (\n <span className=\"inline-flex h-8 items-center gap-2 border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground\">\n <span className=\"font-semibold tabular-nums text-foreground\">{props.value}</span>\n {props.label}\n </span>\n );\n}\n\nfunction schemaTypeLabel(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value)) {\n const labels = value.filter((item): item is string => typeof item === \"string\");\n return labels.length === 0 ? \"unknown\" : labels.join(\" / \");\n }\n return \"unknown\";\n}\n\nfunction JsonDetails(props: { title: string; value: unknown }) {\n const display = jsonDisplay(props.value);\n\n return (\n <details className=\"group rounded-xl border border-border/80 bg-card/30\">\n <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\">\n <span>{props.title}</span>\n <span className=\"text-xs normal-case tracking-normal text-muted-foreground group-open:hidden\">\n Show\n </span>\n <span className=\"hidden text-xs normal-case tracking-normal text-muted-foreground group-open:inline\">\n Hide\n </span>\n </summary>\n <div className=\"border-t border-border/70\">\n <pre className=\"m-0 max-h-96 overflow-auto p-4 font-mono text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={display} />\n </code>\n </pre>\n </div>\n </details>\n );\n}\n\nfunction jsonDisplay(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return JSON.stringify(String(value), null, 2);\n }\n}\n\nexport function RetrievalLogPanel(props: {\n evidence: NonNullable<StudioKnowledgeSummary[\"evidence\"]>;\n onOpenTrace: (traceId: string) => void;\n}) {\n return (\n <section className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden rounded-xl border border-border/80 bg-card/55\">\n <div className=\"border-b border-border/80 px-4 py-3\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h2 className=\"m-0 truncate text-sm font-semibold text-foreground\">Retrieval log</h2>\n <p className=\"m-0 mt-1 truncate text-xs text-muted-foreground\">\n traces / retrieval-evidence\n </p>\n </div>\n <Badge>{props.evidence.length} entries</Badge>\n </div>\n </div>\n <div className=\"min-h-0 overflow-auto p-4\">\n {props.evidence.length === 0 ? (\n <MutedRow text=\"No retrieval evidence captured yet\" />\n ) : null}\n <div className=\"grid gap-3\">\n {props.evidence.map((item) => (\n <article\n className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-3\"\n key={`${item.traceId}:${item.observationId}`}\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 text-foreground\">\n {item.observationName}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">Turn {item.turn}</div>\n </div>\n <Button\n className=\"h-auto min-h-0 rounded-lg border border-border bg-muted px-2 py-1 text-xs text-muted-foreground\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onOpenTrace(item.traceId)}\n >\n Trace\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Badge>{item.documentCount} docs</Badge>\n <Badge>{item.toolCount} tools</Badge>\n </div>\n {item.query === undefined ? null : (\n <p className=\"m-0 text-sm leading-6 text-muted-foreground [overflow-wrap:anywhere]\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.14em] text-foreground\">\n Query\n </span>{\" \"}\n {item.query}\n </p>\n )}\n {item.documents.slice(0, 2).map((document) => (\n <p\n className=\"m-0 text-xs leading-5 text-muted-foreground [overflow-wrap:anywhere]\"\n key={`${document.id ?? \"doc\"}:${document.text ?? \"\"}`}\n >\n <span className=\" text-foreground\">{document.id ?? \"document\"}</span>{\" \"}\n {document.text ?? \"\"}\n </p>\n ))}\n {item.tools.length === 0 ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">\n Tools: {item.tools.join(\", \")}\n </p>\n )}\n </article>\n ))}\n </div>\n </div>\n </section>\n );\n}\n\nfunction JsonBlock(props: { title: string; value: unknown }) {\n return (\n <div className=\"grid gap-2 border-t border-border/70 pt-3\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {props.title}\n </div>\n <JsonValueView value={props.value} />\n </div>\n );\n}\n\nexport function EmptyState(props: { title: string; text: string }) {\n return (\n <section className=\"grid h-full place-items-center p-8\">\n <div className=\"grid max-w-sm gap-2 text-center\">\n <h1 className=\"m-0 text-base font-semibold text-foreground\">{props.title}</h1>\n <p className=\"m-0 text-sm font-medium leading-6 text-muted-foreground\">{props.text}</p>\n </div>\n </section>\n );\n}\n\nfunction MutedRow(props: { text: string }) {\n return (\n <div className=\"rounded-lg border border-dashed border-border px-4 py-3 text-sm font-medium text-muted-foreground\">\n {props.text}\n </div>\n );\n}\n","import { RefreshIcon } from \"@hugeicons/core-free-icons\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { StudioKnowledgeItemsPage, StudioKnowledgeSummary } from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport type { KnowledgeTab } from \"../shared/types\";\nimport {\n flattenSources,\n type ItemState,\n itemLimit,\n type KnowledgeSourceRef,\n sourceId,\n sourceKindForTab,\n sourceLabel,\n tabLabel,\n} from \"./knowledge-model\";\nimport { ItemBrowser, RetrievalLogPanel } from \"./knowledge-panels\";\n\nexport function KnowledgePage(props: {\n activeTab: KnowledgeTab;\n enabled: boolean;\n summary: StudioKnowledgeSummary | undefined;\n loading: boolean;\n onOpenTrace: (traceId: string) => void;\n onRefresh: () => void;\n}) {\n const [selectedKey, setSelectedKey] = useState(\"\");\n const [itemState, setItemState] = useState<ItemState | undefined>();\n\n const agents = props.summary?.agents ?? [];\n const evidence = props.summary?.evidence ?? [];\n const sources = useMemo(() => flattenSources(agents), [agents]);\n const activeSourceKind = sourceKindForTab(props.activeTab);\n const visibleSources = useMemo(\n () =>\n activeSourceKind === undefined\n ? []\n : sources.filter((source) => source.source.kind === activeSourceKind),\n [activeSourceKind, sources],\n );\n const selectedSource =\n visibleSources.find((source) => source.key === selectedKey) ?? visibleSources[0];\n\n useEffect(() => {\n if (visibleSources.length === 0) {\n setSelectedKey(\"\");\n return;\n }\n if (visibleSources.some((source) => source.key === selectedKey)) {\n return;\n }\n const next =\n visibleSources.find(\n (source) => source.source.inspectable === true && (source.source.itemCount ?? 0) > 0,\n ) ??\n visibleSources.find((source) => source.source.inspectable === true) ??\n visibleSources[0];\n setSelectedKey(next?.key ?? \"\");\n }, [selectedKey, visibleSources]);\n\n const loadItems = useCallback(\n async (source: KnowledgeSourceRef, options: { append: boolean; cursor?: string }) => {\n const sourceKey = source.key;\n setItemState((current) => ({\n key: sourceKey,\n loading: true,\n inspectable:\n current?.key === sourceKey ? current.inspectable : source.source.inspectable === true,\n items: options.append && current?.key === sourceKey ? current.items : [],\n ...(options.append && current?.key === sourceKey && current.nextCursor !== undefined\n ? { nextCursor: current.nextCursor }\n : {}),\n ...(current?.key === sourceKey && current.totalCount !== undefined\n ? { totalCount: current.totalCount }\n : {}),\n }));\n\n try {\n const params = new URLSearchParams({\n agentId: source.agentId,\n sourceId: sourceId(source.source),\n limit: String(itemLimit),\n });\n if (options.cursor !== undefined) {\n params.set(\"cursor\", options.cursor);\n }\n const response = await fetch(`/knowledge/items?${params.toString()}`);\n if (!response.ok) {\n throw new Error(`Knowledge items failed with HTTP ${response.status}`);\n }\n const page = (await response.json()) as StudioKnowledgeItemsPage;\n setItemState((current) => {\n if (current?.key !== sourceKey) {\n return current;\n }\n return {\n key: sourceKey,\n loading: false,\n inspectable: page.inspectable,\n items: options.append ? [...current.items, ...page.items] : page.items,\n ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }),\n ...(page.totalCount === undefined ? {} : { totalCount: page.totalCount }),\n ...(page.message === undefined ? {} : { message: page.message }),\n };\n });\n } catch (error) {\n setItemState((current) => {\n if (current?.key !== sourceKey) {\n return current;\n }\n return {\n key: sourceKey,\n loading: false,\n inspectable: current.inspectable,\n items: current.items,\n error: error instanceof Error ? error.message : String(error),\n };\n });\n }\n },\n [],\n );\n\n useEffect(() => {\n if (!props.enabled || selectedSource === undefined) {\n setItemState(undefined);\n return;\n }\n void loadItems(selectedSource, { append: false });\n }, [loadItems, props.enabled, selectedSource]);\n\n return (\n <section className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55\">\n <header className=\"bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur\">\n <div className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1\">\n <div className=\"grid min-w-0 gap-2\">\n <h1 className=\"m-0 text-2xl font-semibold leading-none tracking-tight text-foreground\">\n {tabLabel(props.activeTab)}\n </h1>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n {knowledgePageDescription(props.activeTab)}\n </p>\n </div>\n <Button\n className=\"h-8 min-h-8 gap-2\"\n type=\"button\"\n variant=\"secondary\"\n disabled={!props.enabled}\n onClick={props.onRefresh}\n >\n <StudioIcon icon={RefreshIcon} aria-hidden=\"true\" />\n Refresh\n </Button>\n </div>\n </header>\n <div className=\"grid min-h-0 grid-rows-[minmax(0,1fr)] overflow-hidden pb-6 pl-4 pr-6 pt-0\">\n {props.activeTab === \"retrieval-log\" ? (\n <RetrievalLogPanel evidence={evidence} onOpenTrace={props.onOpenTrace} />\n ) : (\n <SourceWorkspace\n sources={visibleSources}\n selectedKey={selectedSource?.key ?? \"\"}\n loading={props.loading}\n activeTab={props.activeTab}\n onSelect={setSelectedKey}\n >\n <ItemBrowser\n source={selectedSource}\n state={itemState}\n onLoadMore={() => {\n if (selectedSource === undefined) {\n return;\n }\n void loadItems(\n selectedSource,\n itemState?.nextCursor === undefined\n ? { append: true }\n : { append: true, cursor: itemState.nextCursor },\n );\n }}\n />\n </SourceWorkspace>\n )}\n </div>\n </section>\n );\n}\n\nfunction SourceWorkspace(props: {\n sources: KnowledgeSourceRef[];\n selectedKey: string;\n loading: boolean;\n activeTab: KnowledgeTab;\n onSelect: (key: string) => void;\n children: ReactNode;\n}) {\n const showSources = props.sources.length !== 1 || props.loading;\n return (\n <div\n className={[\n \"grid min-h-0 gap-3 overflow-hidden\",\n showSources ? \"grid-rows-[auto_minmax(0,1fr)]\" : \"grid-rows-[minmax(0,1fr)]\",\n ].join(\" \")}\n >\n {showSources ? (\n <div className=\"min-w-0 overflow-x-auto border-b border-border/80\">\n <div className=\"flex min-h-11 min-w-max items-center gap-2\">\n <span className=\"mr-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n {tabLabel(props.activeTab)}\n </span>\n {props.loading && props.sources.length === 0 ? (\n <span className=\" text-xs text-muted-foreground\">Loading sources</span>\n ) : null}\n {!props.loading && props.sources.length === 0 ? (\n <span className=\" text-xs text-muted-foreground\">No knowledge sources</span>\n ) : null}\n {props.sources.map((source) => (\n <button\n className={[\n \"flex h-7 items-center gap-2 rounded-lg border border-border/80 bg-background/45 px-2.5 text-xs font-semibold text-muted-foreground transition duration-200 hover:border-border/80 hover:bg-muted/45 hover:text-foreground focus-visible:border-ring focus-visible:outline-none\",\n props.selectedKey === source.key\n ? \"border-border/80 bg-muted/45 text-foreground\"\n : \"\",\n ].join(\" \")}\n key={source.key}\n type=\"button\"\n onClick={() => props.onSelect(source.key)}\n >\n <span>{source.source.label ?? sourceLabel(source.source.kind)}</span>\n {source.source.itemCount === undefined ? null : (\n <span className=\"text-muted-foreground\">{source.source.itemCount}</span>\n )}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n {props.children}\n </div>\n );\n}\n\nfunction knowledgePageDescription(tab: KnowledgeTab): string {\n switch (tab) {\n case \"static-context\":\n return \"Browse configured static context exposed to agents.\";\n case \"dynamic-context\":\n return \"Inspect dynamic context chunks resolved at runtime.\";\n case \"dynamic-tools\":\n return \"Review dynamic tool definitions and parameters.\";\n case \"retrieval-log\":\n return \"Inspect retrieval evidence and jump into related traces.\";\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i as e,r as t,s as n}from"./utils-BN2yP0LH.js";import{I as r,c as i,d as a,f as o,l as s,u as c}from"./index-DxSIQUax.js";import{t as l}from"./badge-BH7gz3tB.js";import{a as u,c as d,r as f,s as p,t as m,u as h}from"./tool-runner-5JJHI3LO.js";var g=n(e(),1),_=t();function v(e){let t=e.agents.find(t=>t.id===e.selectedAgentId)??e.agents[0],n=e.summary?.servers??[],r=n.reduce((e,t)=>e+t.toolCount,0),d=(0,g.useMemo)(()=>S(n),[n]),[m,h]=(0,g.useState)(``),[v,b]=(0,g.useState)(`{}`),[C,w]=(0,g.useState)(`idle`),[T,E]=(0,g.useState)(),[D,O]=(0,g.useState)(``),k=(0,g.useMemo)(()=>d.find(e=>e.key===m)??d[0],[d,m]),A=(0,g.useRef)(``),j=(0,g.useRef)(0);(0,g.useEffect)(()=>{if(d.length===0){h(``);return}d.some(e=>e.key===m)||h(d[0]?.key??``)},[d,m]),(0,g.useEffect)(()=>{let e=k?.key??``;A.current!==e&&(A.current=e,j.current+=1,b(`{}`),w(`idle`),O(``),E(void 0))},[k]);async function M(){if(k===void 0)return;let e;try{e=JSON.parse(v)}catch(e){O(e instanceof Error?e.message:String(e)),E(void 0);return}w(`running`),O(``),E(void 0);let t=k.key,n=j.current+1;j.current=n;let r=()=>j.current===n&&A.current===t;try{let t=await fetch(`/agents/${encodeURIComponent(k.agentId)}/tools/${encodeURIComponent(k.name)}/runs`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({args:e})}),n=await t.json();if(!r())return;let i=p(n);if(i===void 0){O(`Unexpected Studio tool run response: ${u(n)}`);return}E(i),(!t.ok||i.status===`error`)&&O(u(i.error??i))}catch(e){r()&&O(e instanceof Error?e.message:String(e))}finally{r()&&w(`idle`)}}return(0,_.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55`,"aria-label":`MCPs`,children:[(0,_.jsx)(`header`,{className:`bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur`,children:(0,_.jsxs)(`div`,{className:`grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1`,children:[(0,_.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,_.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.24em] text-foreground`,children:`External context`}),(0,_.jsx)(`h1`,{className:`m-0 text-2xl font-semibold leading-none tracking-tight text-foreground`,children:`MCPs`}),(0,_.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:`MCP servers and remote tools registered on Studio agents, grouped by server.`})]}),(0,_.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3 max-md:grid max-md:grid-cols-1`,children:[(0,_.jsxs)(l,{className:`h-9 justify-center border-border/80 bg-card/70 text-muted-foreground`,children:[n.length,` servers / `,r,` tools`]}),e.agents.length>1?(0,_.jsxs)(i,{value:t?.id??``,onValueChange:e.onSelectAgent,children:[(0,_.jsx)(a,{className:`h-9 min-h-9 w-64 rounded-lg border-border bg-card/80 text-xs max-md:w-full`,children:(0,_.jsx)(o,{placeholder:`Agent`})}),(0,_.jsx)(s,{align:`end`,children:e.agents.map(e=>(0,_.jsx)(c,{value:e.id,children:e.name??e.id},e.id))})]}):null]})]})}),(0,_.jsx)(`div`,{className:`min-h-0 overflow-auto pb-6 pl-4 pr-6`,children:(0,_.jsxs)(`div`,{className:`grid w-full gap-5`,children:[e.enabled?e.loading?(0,_.jsx)(x,{title:`Loading MCPs`,message:`Reading registered MCP metadata.`}):n.length===0?(0,_.jsx)(x,{title:`No MCPs`,message:`The selected agent has no registered MCP tools.`}):n.map(e=>(0,_.jsx)(y,{selectedToolKey:k?.key??``,server:e,onSelectTool:h},e.name)):(0,_.jsx)(x,{title:`MCPs unavailable`,message:`No registered Studio agent exposes MCP tools.`}),d.length===0?null:(0,_.jsx)(f,{argsText:v,runError:D,runResponse:T,runState:C,selectedTool:k,onArgsTextChange:b,onRun:()=>void M()})]})})]})}function y(e){return(0,_.jsxs)(`section`,{className:`overflow-hidden rounded-xl border border-border/80 bg-card/55 p-2 shadow-sm`,children:[(0,_.jsxs)(`header`,{className:`grid min-h-14 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 rounded-lg border border-border/60 bg-muted/20 px-4`,children:[(0,_.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,_.jsx)(`h2`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:e.server.name}),(0,_.jsx)(`span`,{className:`truncate text-xs font-medium text-muted-foreground`,children:e.server.agentId})]}),(0,_.jsxs)(l,{className:`border-border/80 bg-background/50 text-muted-foreground`,children:[e.server.toolCount,` tools`]})]}),(0,_.jsx)(`div`,{className:`mt-1 grid gap-1`,children:e.server.tools.map(t=>(0,_.jsx)(b,{serverName:e.server.name,active:e.selectedToolKey===C(e.server.name,t),tool:t,onSelectTool:e.onSelectTool},`${t.source}:${t.name}`))})]})}function b(e){let t=C(e.serverName,e.tool);return(0,_.jsxs)(`article`,{className:`grid grid-cols-[minmax(300px,0.75fr)_minmax(0,1fr)] gap-2 rounded-lg border border-transparent bg-background/25 p-2 transition duration-200 hover:border-border/70 hover:bg-background/35 max-lg:grid-cols-1`,children:[(0,_.jsxs)(`div`,{className:`grid content-start gap-4 rounded-lg bg-card/25 p-3`,children:[(0,_.jsxs)(`div`,{className:`grid gap-1`,children:[(0,_.jsx)(`h3`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:e.tool.name}),(0,_.jsx)(`span`,{className:` text-xs font-medium text-muted-foreground`,children:e.tool.source})]}),(0,_.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:e.tool.description}),(0,_.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,_.jsx)(l,{className:h(e.tool.source),children:e.tool.source}),(0,_.jsxs)(l,{className:`border-border/80 bg-transparent text-muted-foreground`,children:[d(e.tool.parameters),` fields`]})]}),(0,_.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,_.jsx)(m,{value:e.tool.parameters,title:`Parameter schema`})]})}function x(e){return(0,_.jsx)(`div`,{className:`grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center`,children:(0,_.jsxs)(`div`,{className:`grid max-w-md gap-2`,children:[(0,_.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:e.title}),(0,_.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:e.message})]})})}function S(e){return e.flatMap(e=>e.tools.map(t=>({key:C(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 C(e,t){return`${e}:${t.source}:${t.name}`}export{v as McpsPage};
2
- //# sourceMappingURL=mcps-page-DwZAv13N.js.map
1
+ import{i as e,r as t,s as n}from"./utils-BN2yP0LH.js";import{I as r,c as i,d as a,f as o,l as s,u as c}from"./index-CDwzNuFN.js";import{t as l}from"./badge-BH7gz3tB.js";import{a as u,c as d,r as f,s as p,t as m,u as h}from"./tool-runner-D09nhpss.js";var g=n(e(),1),_=t();function v(e){let t=e.agents.find(t=>t.id===e.selectedAgentId)??e.agents[0],n=e.summary?.servers??[],r=n.reduce((e,t)=>e+t.toolCount,0),d=(0,g.useMemo)(()=>S(n),[n]),[m,h]=(0,g.useState)(``),[v,b]=(0,g.useState)(`{}`),[C,w]=(0,g.useState)(`idle`),[T,E]=(0,g.useState)(),[D,O]=(0,g.useState)(``),k=(0,g.useMemo)(()=>d.find(e=>e.key===m)??d[0],[d,m]),A=(0,g.useRef)(``),j=(0,g.useRef)(0);(0,g.useEffect)(()=>{if(d.length===0){h(``);return}d.some(e=>e.key===m)||h(d[0]?.key??``)},[d,m]),(0,g.useEffect)(()=>{let e=k?.key??``;A.current!==e&&(A.current=e,j.current+=1,b(`{}`),w(`idle`),O(``),E(void 0))},[k]);async function M(){if(k===void 0)return;let e;try{e=JSON.parse(v)}catch(e){O(e instanceof Error?e.message:String(e)),E(void 0);return}w(`running`),O(``),E(void 0);let t=k.key,n=j.current+1;j.current=n;let r=()=>j.current===n&&A.current===t;try{let t=await fetch(`/agents/${encodeURIComponent(k.agentId)}/tools/${encodeURIComponent(k.name)}/runs`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({args:e})}),n=await t.json();if(!r())return;let i=p(n);if(i===void 0){O(`Unexpected Studio tool run response: ${u(n)}`);return}E(i),(!t.ok||i.status===`error`)&&O(u(i.error??i))}catch(e){r()&&O(e instanceof Error?e.message:String(e))}finally{r()&&w(`idle`)}}return(0,_.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55`,"aria-label":`MCPs`,children:[(0,_.jsx)(`header`,{className:`bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur`,children:(0,_.jsxs)(`div`,{className:`grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1`,children:[(0,_.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,_.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.24em] text-foreground`,children:`External context`}),(0,_.jsx)(`h1`,{className:`m-0 text-2xl font-semibold leading-none tracking-tight text-foreground`,children:`MCPs`}),(0,_.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:`MCP servers and remote tools registered on Studio agents, grouped by server.`})]}),(0,_.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3 max-md:grid max-md:grid-cols-1`,children:[(0,_.jsxs)(l,{className:`h-9 justify-center border-border/80 bg-card/70 text-muted-foreground`,children:[n.length,` servers / `,r,` tools`]}),e.agents.length>1?(0,_.jsxs)(i,{value:t?.id??``,onValueChange:e.onSelectAgent,children:[(0,_.jsx)(a,{className:`h-9 min-h-9 w-64 rounded-lg border-border bg-card/80 text-xs max-md:w-full`,children:(0,_.jsx)(o,{placeholder:`Agent`})}),(0,_.jsx)(s,{align:`end`,children:e.agents.map(e=>(0,_.jsx)(c,{value:e.id,children:e.name??e.id},e.id))})]}):null]})]})}),(0,_.jsx)(`div`,{className:`min-h-0 overflow-auto pb-6 pl-4 pr-6`,children:(0,_.jsxs)(`div`,{className:`grid w-full gap-5`,children:[e.enabled?e.loading?(0,_.jsx)(x,{title:`Loading MCPs`,message:`Reading registered MCP metadata.`}):n.length===0?(0,_.jsx)(x,{title:`No MCPs`,message:`The selected agent has no registered MCP tools.`}):n.map(e=>(0,_.jsx)(y,{selectedToolKey:k?.key??``,server:e,onSelectTool:h},e.name)):(0,_.jsx)(x,{title:`MCPs unavailable`,message:`No registered Studio agent exposes MCP tools.`}),d.length===0?null:(0,_.jsx)(f,{argsText:v,runError:D,runResponse:T,runState:C,selectedTool:k,onArgsTextChange:b,onRun:()=>void M()})]})})]})}function y(e){return(0,_.jsxs)(`section`,{className:`overflow-hidden rounded-xl border border-border/80 bg-card/55 p-2 shadow-sm`,children:[(0,_.jsxs)(`header`,{className:`grid min-h-14 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 rounded-lg border border-border/60 bg-muted/20 px-4`,children:[(0,_.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,_.jsx)(`h2`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:e.server.name}),(0,_.jsx)(`span`,{className:`truncate text-xs font-medium text-muted-foreground`,children:e.server.agentId})]}),(0,_.jsxs)(l,{className:`border-border/80 bg-background/50 text-muted-foreground`,children:[e.server.toolCount,` tools`]})]}),(0,_.jsx)(`div`,{className:`mt-1 grid gap-1`,children:e.server.tools.map(t=>(0,_.jsx)(b,{serverName:e.server.name,active:e.selectedToolKey===C(e.server.name,t),tool:t,onSelectTool:e.onSelectTool},`${t.source}:${t.name}`))})]})}function b(e){let t=C(e.serverName,e.tool);return(0,_.jsxs)(`article`,{className:`grid grid-cols-[minmax(300px,0.75fr)_minmax(0,1fr)] gap-2 rounded-lg border border-transparent bg-background/25 p-2 transition duration-200 hover:border-border/70 hover:bg-background/35 max-lg:grid-cols-1`,children:[(0,_.jsxs)(`div`,{className:`grid content-start gap-4 rounded-lg bg-card/25 p-3`,children:[(0,_.jsxs)(`div`,{className:`grid gap-1`,children:[(0,_.jsx)(`h3`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:e.tool.name}),(0,_.jsx)(`span`,{className:` text-xs font-medium text-muted-foreground`,children:e.tool.source})]}),(0,_.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:e.tool.description}),(0,_.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,_.jsx)(l,{className:h(e.tool.source),children:e.tool.source}),(0,_.jsxs)(l,{className:`border-border/80 bg-transparent text-muted-foreground`,children:[d(e.tool.parameters),` fields`]})]}),(0,_.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,_.jsx)(m,{value:e.tool.parameters,title:`Parameter schema`})]})}function x(e){return(0,_.jsx)(`div`,{className:`grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center`,children:(0,_.jsxs)(`div`,{className:`grid max-w-md gap-2`,children:[(0,_.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:e.title}),(0,_.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:e.message})]})})}function S(e){return e.flatMap(e=>e.tools.map(t=>({key:C(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 C(e,t){return`${e}:${t.source}:${t.name}`}export{v as McpsPage};
2
+ //# sourceMappingURL=mcps-page-gSjG8fUN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcps-page-DwZAv13N.js","names":[],"sources":["../../../src/ui/app/modules/mcps/mcps-page.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n StudioAgentMcpServerMetadata,\n StudioAgentMcpsSummary,\n StudioAgentMcpToolMetadata,\n StudioAgentToolMetadata,\n StudioConfig,\n StudioToolRunResponse,\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 formatJson,\n parseStudioToolRunResponse,\n SchemaBlock,\n schemaPropertyCount,\n sourceBadgeClass,\n ToolRunner,\n} from \"../tools/tool-runner\";\n\nexport function McpsPage(props: {\n agents: StudioConfig[\"agents\"];\n selectedAgentId: string;\n summary: StudioAgentMcpsSummary | undefined;\n enabled: boolean;\n loading: boolean;\n onSelectAgent: (agentId: string) => void;\n}) {\n const selectedAgent =\n props.agents.find((agent) => agent.id === props.selectedAgentId) ?? props.agents[0];\n const servers = props.summary?.servers ?? [];\n const toolCount = servers.reduce((total, server) => total + server.toolCount, 0);\n const runnableTools = useMemo(() => mcpRunnableTools(servers), [servers]);\n const [selectedToolKey, setSelectedToolKey] = useState(\"\");\n const [argsText, setArgsText] = useState(\"{}\");\n const [runState, setRunState] = useState<\"idle\" | \"running\">(\"idle\");\n const [runResponse, setRunResponse] = useState<StudioToolRunResponse | undefined>();\n const [runError, setRunError] = useState(\"\");\n const selectedTool = useMemo(\n () => runnableTools.find((tool) => tool.key === selectedToolKey) ?? runnableTools[0],\n [runnableTools, selectedToolKey],\n );\n const lastSelectedToolKeyRef = useRef(\"\");\n const runRequestIdRef = useRef(0);\n\n useEffect(() => {\n if (runnableTools.length === 0) {\n setSelectedToolKey(\"\");\n return;\n }\n if (!runnableTools.some((tool) => tool.key === selectedToolKey)) {\n setSelectedToolKey(runnableTools[0]?.key ?? \"\");\n }\n }, [runnableTools, selectedToolKey]);\n\n useEffect(() => {\n const nextSelectedToolKey = selectedTool?.key ?? \"\";\n if (lastSelectedToolKeyRef.current === nextSelectedToolKey) {\n return;\n }\n lastSelectedToolKeyRef.current = nextSelectedToolKey;\n runRequestIdRef.current += 1;\n setArgsText(\"{}\");\n setRunState(\"idle\");\n setRunError(\"\");\n setRunResponse(undefined);\n }, [selectedTool]);\n\n async function runSelectedTool() {\n if (selectedTool === undefined) {\n return;\n }\n let args: unknown;\n try {\n args = JSON.parse(argsText);\n } catch (parseError) {\n setRunError(parseError instanceof Error ? parseError.message : String(parseError));\n setRunResponse(undefined);\n return;\n }\n\n setRunState(\"running\");\n setRunError(\"\");\n setRunResponse(undefined);\n const runToolKey = selectedTool.key;\n const requestId = runRequestIdRef.current + 1;\n runRequestIdRef.current = requestId;\n const isCurrentRun = () =>\n runRequestIdRef.current === requestId && lastSelectedToolKeyRef.current === runToolKey;\n try {\n const response = await fetch(\n `/agents/${encodeURIComponent(selectedTool.agentId)}/tools/${encodeURIComponent(\n selectedTool.name,\n )}/runs`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ args }),\n },\n );\n const rawBody = await response.json();\n if (!isCurrentRun()) {\n return;\n }\n const body = parseStudioToolRunResponse(rawBody);\n if (body === undefined) {\n setRunError(`Unexpected Studio tool run response: ${formatJson(rawBody)}`);\n return;\n }\n setRunResponse(body);\n if (!response.ok || body.status === \"error\") {\n setRunError(formatJson(body.error ?? body));\n }\n } catch (error) {\n if (isCurrentRun()) {\n setRunError(error instanceof Error ? error.message : String(error));\n }\n } finally {\n if (isCurrentRun()) {\n setRunState(\"idle\");\n }\n }\n }\n\n return (\n <section\n className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55\"\n aria-label=\"MCPs\"\n >\n <header className=\"bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur\">\n <div className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1\">\n <div className=\"grid min-w-0 gap-2\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.24em] text-foreground\">\n External context\n </div>\n <h1 className=\"m-0 text-2xl font-semibold leading-none tracking-tight text-foreground\">\n MCPs\n </h1>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n MCP servers and remote tools registered on Studio agents, grouped by server.\n </p>\n </div>\n <div className=\"flex min-w-0 items-center gap-3 max-md:grid max-md:grid-cols-1\">\n <Badge className=\"h-9 justify-center border-border/80 bg-card/70 text-muted-foreground\">\n {servers.length} servers / {toolCount} tools\n </Badge>\n {props.agents.length > 1 ? (\n <Select value={selectedAgent?.id ?? \"\"} onValueChange={props.onSelectAgent}>\n <SelectTrigger className=\"h-9 min-h-9 w-64 rounded-lg border-border bg-card/80 text-xs max-md:w-full\">\n <SelectValue placeholder=\"Agent\" />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {props.agents.map((agent) => (\n <SelectItem value={agent.id} key={agent.id}>\n {agent.name ?? agent.id}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n </div>\n </div>\n </header>\n\n <div className=\"min-h-0 overflow-auto pb-6 pl-4 pr-6\">\n <div className=\"grid w-full gap-5\">\n {!props.enabled ? (\n <EmptyState\n title=\"MCPs unavailable\"\n message=\"No registered Studio agent exposes MCP tools.\"\n />\n ) : props.loading ? (\n <EmptyState title=\"Loading MCPs\" message=\"Reading registered MCP metadata.\" />\n ) : servers.length === 0 ? (\n <EmptyState title=\"No MCPs\" message=\"The selected agent has no registered MCP tools.\" />\n ) : (\n servers.map((server) => (\n <McpServerSection\n selectedToolKey={selectedTool?.key ?? \"\"}\n server={server}\n key={server.name}\n onSelectTool={setSelectedToolKey}\n />\n ))\n )}\n {runnableTools.length === 0 ? null : (\n <ToolRunner\n argsText={argsText}\n runError={runError}\n runResponse={runResponse}\n runState={runState}\n selectedTool={selectedTool}\n onArgsTextChange={setArgsText}\n onRun={() => void runSelectedTool()}\n />\n )}\n </div>\n </div>\n </section>\n );\n}\n\nfunction McpServerSection(props: {\n server: StudioAgentMcpServerMetadata;\n selectedToolKey: string;\n onSelectTool: (toolKey: string) => void;\n}) {\n return (\n <section className=\"overflow-hidden rounded-xl border border-border/80 bg-card/55 p-2 shadow-sm\">\n <header className=\"grid min-h-14 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 rounded-lg border border-border/60 bg-muted/20 px-4\">\n <div className=\"grid min-w-0 gap-1\">\n <h2 className=\"m-0 truncate text-sm font-semibold text-foreground\">\n {props.server.name}\n </h2>\n <span className=\"truncate text-xs font-medium text-muted-foreground\">\n {props.server.agentId}\n </span>\n </div>\n <Badge className=\"border-border/80 bg-background/50 text-muted-foreground\">\n {props.server.toolCount} tools\n </Badge>\n </header>\n <div className=\"mt-1 grid gap-1\">\n {props.server.tools.map((tool) => (\n <McpToolRow\n serverName={props.server.name}\n active={props.selectedToolKey === mcpToolKey(props.server.name, tool)}\n tool={tool}\n key={`${tool.source}:${tool.name}`}\n onSelectTool={props.onSelectTool}\n />\n ))}\n </div>\n </section>\n );\n}\n\nfunction McpToolRow(props: {\n serverName: string;\n active: boolean;\n tool: StudioAgentMcpToolMetadata;\n onSelectTool: (toolKey: string) => void;\n}) {\n const toolKey = mcpToolKey(props.serverName, props.tool);\n return (\n <article className=\"grid grid-cols-[minmax(300px,0.75fr)_minmax(0,1fr)] gap-2 rounded-lg border border-transparent bg-background/25 p-2 transition duration-200 hover:border-border/70 hover:bg-background/35 max-lg:grid-cols-1\">\n <div className=\"grid content-start gap-4 rounded-lg bg-card/25 p-3\">\n <div className=\"grid gap-1\">\n <h3 className=\"m-0 truncate text-sm font-semibold text-foreground\">{props.tool.name}</h3>\n <span className=\" text-xs font-medium text-muted-foreground\">{props.tool.source}</span>\n </div>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n {props.tool.description}\n </p>\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <Badge className={sourceBadgeClass(props.tool.source)}>{props.tool.source}</Badge>\n <Badge className=\"border-border/80 bg-transparent text-muted-foreground\">\n {schemaPropertyCount(props.tool.parameters)} fields\n </Badge>\n </div>\n <Button\n className=\"h-8 min-h-8 w-fit rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n onClick={() => props.onSelectTool(toolKey)}\n >\n {props.active ? \"Selected\" : \"Use\"}\n </Button>\n </div>\n <SchemaBlock value={props.tool.parameters} title=\"Parameter schema\" />\n </article>\n );\n}\n\nfunction EmptyState(props: { title: string; message: string }) {\n return (\n <div className=\"grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center\">\n <div className=\"grid max-w-md gap-2\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">{props.title}</h2>\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">{props.message}</p>\n </div>\n </div>\n );\n}\n\ntype McpRunnableTool = StudioAgentToolMetadata & {\n key: string;\n mcpServerName: string;\n};\n\nfunction mcpRunnableTools(servers: StudioAgentMcpServerMetadata[]): McpRunnableTool[] {\n return servers.flatMap((server) =>\n server.tools.map((tool) => ({\n key: mcpToolKey(server.name, tool),\n agentId: server.agentId,\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n source: tool.source,\n mcpServerName: server.name,\n approval: tool.approval,\n })),\n );\n}\n\nfunction mcpToolKey(serverName: string, tool: StudioAgentMcpToolMetadata): string {\n return `${serverName}:${tool.source}:${tool.name}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mcps-page-gSjG8fUN.js","names":[],"sources":["../../../src/ui/app/modules/mcps/mcps-page.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n StudioAgentMcpServerMetadata,\n StudioAgentMcpsSummary,\n StudioAgentMcpToolMetadata,\n StudioAgentToolMetadata,\n StudioConfig,\n StudioToolRunResponse,\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 formatJson,\n parseStudioToolRunResponse,\n SchemaBlock,\n schemaPropertyCount,\n sourceBadgeClass,\n ToolRunner,\n} from \"../tools/tool-runner\";\n\nexport function McpsPage(props: {\n agents: StudioConfig[\"agents\"];\n selectedAgentId: string;\n summary: StudioAgentMcpsSummary | undefined;\n enabled: boolean;\n loading: boolean;\n onSelectAgent: (agentId: string) => void;\n}) {\n const selectedAgent =\n props.agents.find((agent) => agent.id === props.selectedAgentId) ?? props.agents[0];\n const servers = props.summary?.servers ?? [];\n const toolCount = servers.reduce((total, server) => total + server.toolCount, 0);\n const runnableTools = useMemo(() => mcpRunnableTools(servers), [servers]);\n const [selectedToolKey, setSelectedToolKey] = useState(\"\");\n const [argsText, setArgsText] = useState(\"{}\");\n const [runState, setRunState] = useState<\"idle\" | \"running\">(\"idle\");\n const [runResponse, setRunResponse] = useState<StudioToolRunResponse | undefined>();\n const [runError, setRunError] = useState(\"\");\n const selectedTool = useMemo(\n () => runnableTools.find((tool) => tool.key === selectedToolKey) ?? runnableTools[0],\n [runnableTools, selectedToolKey],\n );\n const lastSelectedToolKeyRef = useRef(\"\");\n const runRequestIdRef = useRef(0);\n\n useEffect(() => {\n if (runnableTools.length === 0) {\n setSelectedToolKey(\"\");\n return;\n }\n if (!runnableTools.some((tool) => tool.key === selectedToolKey)) {\n setSelectedToolKey(runnableTools[0]?.key ?? \"\");\n }\n }, [runnableTools, selectedToolKey]);\n\n useEffect(() => {\n const nextSelectedToolKey = selectedTool?.key ?? \"\";\n if (lastSelectedToolKeyRef.current === nextSelectedToolKey) {\n return;\n }\n lastSelectedToolKeyRef.current = nextSelectedToolKey;\n runRequestIdRef.current += 1;\n setArgsText(\"{}\");\n setRunState(\"idle\");\n setRunError(\"\");\n setRunResponse(undefined);\n }, [selectedTool]);\n\n async function runSelectedTool() {\n if (selectedTool === undefined) {\n return;\n }\n let args: unknown;\n try {\n args = JSON.parse(argsText);\n } catch (parseError) {\n setRunError(parseError instanceof Error ? parseError.message : String(parseError));\n setRunResponse(undefined);\n return;\n }\n\n setRunState(\"running\");\n setRunError(\"\");\n setRunResponse(undefined);\n const runToolKey = selectedTool.key;\n const requestId = runRequestIdRef.current + 1;\n runRequestIdRef.current = requestId;\n const isCurrentRun = () =>\n runRequestIdRef.current === requestId && lastSelectedToolKeyRef.current === runToolKey;\n try {\n const response = await fetch(\n `/agents/${encodeURIComponent(selectedTool.agentId)}/tools/${encodeURIComponent(\n selectedTool.name,\n )}/runs`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ args }),\n },\n );\n const rawBody = await response.json();\n if (!isCurrentRun()) {\n return;\n }\n const body = parseStudioToolRunResponse(rawBody);\n if (body === undefined) {\n setRunError(`Unexpected Studio tool run response: ${formatJson(rawBody)}`);\n return;\n }\n setRunResponse(body);\n if (!response.ok || body.status === \"error\") {\n setRunError(formatJson(body.error ?? body));\n }\n } catch (error) {\n if (isCurrentRun()) {\n setRunError(error instanceof Error ? error.message : String(error));\n }\n } finally {\n if (isCurrentRun()) {\n setRunState(\"idle\");\n }\n }\n }\n\n return (\n <section\n className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55\"\n aria-label=\"MCPs\"\n >\n <header className=\"bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur\">\n <div className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1\">\n <div className=\"grid min-w-0 gap-2\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.24em] text-foreground\">\n External context\n </div>\n <h1 className=\"m-0 text-2xl font-semibold leading-none tracking-tight text-foreground\">\n MCPs\n </h1>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n MCP servers and remote tools registered on Studio agents, grouped by server.\n </p>\n </div>\n <div className=\"flex min-w-0 items-center gap-3 max-md:grid max-md:grid-cols-1\">\n <Badge className=\"h-9 justify-center border-border/80 bg-card/70 text-muted-foreground\">\n {servers.length} servers / {toolCount} tools\n </Badge>\n {props.agents.length > 1 ? (\n <Select value={selectedAgent?.id ?? \"\"} onValueChange={props.onSelectAgent}>\n <SelectTrigger className=\"h-9 min-h-9 w-64 rounded-lg border-border bg-card/80 text-xs max-md:w-full\">\n <SelectValue placeholder=\"Agent\" />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {props.agents.map((agent) => (\n <SelectItem value={agent.id} key={agent.id}>\n {agent.name ?? agent.id}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n </div>\n </div>\n </header>\n\n <div className=\"min-h-0 overflow-auto pb-6 pl-4 pr-6\">\n <div className=\"grid w-full gap-5\">\n {!props.enabled ? (\n <EmptyState\n title=\"MCPs unavailable\"\n message=\"No registered Studio agent exposes MCP tools.\"\n />\n ) : props.loading ? (\n <EmptyState title=\"Loading MCPs\" message=\"Reading registered MCP metadata.\" />\n ) : servers.length === 0 ? (\n <EmptyState title=\"No MCPs\" message=\"The selected agent has no registered MCP tools.\" />\n ) : (\n servers.map((server) => (\n <McpServerSection\n selectedToolKey={selectedTool?.key ?? \"\"}\n server={server}\n key={server.name}\n onSelectTool={setSelectedToolKey}\n />\n ))\n )}\n {runnableTools.length === 0 ? null : (\n <ToolRunner\n argsText={argsText}\n runError={runError}\n runResponse={runResponse}\n runState={runState}\n selectedTool={selectedTool}\n onArgsTextChange={setArgsText}\n onRun={() => void runSelectedTool()}\n />\n )}\n </div>\n </div>\n </section>\n );\n}\n\nfunction McpServerSection(props: {\n server: StudioAgentMcpServerMetadata;\n selectedToolKey: string;\n onSelectTool: (toolKey: string) => void;\n}) {\n return (\n <section className=\"overflow-hidden rounded-xl border border-border/80 bg-card/55 p-2 shadow-sm\">\n <header className=\"grid min-h-14 grid-cols-[minmax(0,1fr)_auto] items-center gap-4 rounded-lg border border-border/60 bg-muted/20 px-4\">\n <div className=\"grid min-w-0 gap-1\">\n <h2 className=\"m-0 truncate text-sm font-semibold text-foreground\">\n {props.server.name}\n </h2>\n <span className=\"truncate text-xs font-medium text-muted-foreground\">\n {props.server.agentId}\n </span>\n </div>\n <Badge className=\"border-border/80 bg-background/50 text-muted-foreground\">\n {props.server.toolCount} tools\n </Badge>\n </header>\n <div className=\"mt-1 grid gap-1\">\n {props.server.tools.map((tool) => (\n <McpToolRow\n serverName={props.server.name}\n active={props.selectedToolKey === mcpToolKey(props.server.name, tool)}\n tool={tool}\n key={`${tool.source}:${tool.name}`}\n onSelectTool={props.onSelectTool}\n />\n ))}\n </div>\n </section>\n );\n}\n\nfunction McpToolRow(props: {\n serverName: string;\n active: boolean;\n tool: StudioAgentMcpToolMetadata;\n onSelectTool: (toolKey: string) => void;\n}) {\n const toolKey = mcpToolKey(props.serverName, props.tool);\n return (\n <article className=\"grid grid-cols-[minmax(300px,0.75fr)_minmax(0,1fr)] gap-2 rounded-lg border border-transparent bg-background/25 p-2 transition duration-200 hover:border-border/70 hover:bg-background/35 max-lg:grid-cols-1\">\n <div className=\"grid content-start gap-4 rounded-lg bg-card/25 p-3\">\n <div className=\"grid gap-1\">\n <h3 className=\"m-0 truncate text-sm font-semibold text-foreground\">{props.tool.name}</h3>\n <span className=\" text-xs font-medium text-muted-foreground\">{props.tool.source}</span>\n </div>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n {props.tool.description}\n </p>\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <Badge className={sourceBadgeClass(props.tool.source)}>{props.tool.source}</Badge>\n <Badge className=\"border-border/80 bg-transparent text-muted-foreground\">\n {schemaPropertyCount(props.tool.parameters)} fields\n </Badge>\n </div>\n <Button\n className=\"h-8 min-h-8 w-fit rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n onClick={() => props.onSelectTool(toolKey)}\n >\n {props.active ? \"Selected\" : \"Use\"}\n </Button>\n </div>\n <SchemaBlock value={props.tool.parameters} title=\"Parameter schema\" />\n </article>\n );\n}\n\nfunction EmptyState(props: { title: string; message: string }) {\n return (\n <div className=\"grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center\">\n <div className=\"grid max-w-md gap-2\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">{props.title}</h2>\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">{props.message}</p>\n </div>\n </div>\n );\n}\n\ntype McpRunnableTool = StudioAgentToolMetadata & {\n key: string;\n mcpServerName: string;\n};\n\nfunction mcpRunnableTools(servers: StudioAgentMcpServerMetadata[]): McpRunnableTool[] {\n return servers.flatMap((server) =>\n server.tools.map((tool) => ({\n key: mcpToolKey(server.name, tool),\n agentId: server.agentId,\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n source: tool.source,\n mcpServerName: server.name,\n approval: tool.approval,\n })),\n );\n}\n\nfunction mcpToolKey(serverName: string, tool: StudioAgentMcpToolMetadata): string {\n return `${serverName}:${tool.source}:${tool.name}`;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i as e,r as t,s as n}from"./utils-BN2yP0LH.js";import{o as r}from"./format-C9HPGfkW.js";import{I as i}from"./index-DxSIQUax.js";import{t as a}from"./badge-BH7gz3tB.js";import{t as o}from"./renderers-m-gqGocU.js";var s=n(e(),1),c=t();function l(e){let[t,n]=(0,s.useState)([]),[r,a]=(0,s.useState)([]),[o,l]=(0,s.useState)(``),[d,p]=(0,s.useState)(``),[h,g]=(0,s.useState)(),[_,C]=(0,s.useState)(),[w,T]=(0,s.useState)(!1),[E,D]=(0,s.useState)(!1),[O,k]=(0,s.useState)(``),A=(0,s.useCallback)(async()=>{if(!e.enabled){n([]),a([]),g(void 0),C(void 0);return}T(!0),k(``);try{let[e,t]=await Promise.all([fetch(`/memory/users?limit=50`),fetch(`/memory/conversations?limit=100`)]);if(!e.ok)throw Error(`Memory users failed with HTTP ${e.status}`);if(!t.ok)throw Error(`Memory conversations failed with HTTP ${t.status}`);let r=await e.json(),i=await t.json();n(r.users),a(i.conversations),p(e=>e||i.conversations[0]?.id||``)}catch(e){k(e instanceof Error?e.message:String(e))}finally{T(!1)}},[e.enabled]);(0,s.useEffect)(()=>{A()},[A]),(0,s.useEffect)(()=>{if(!e.enabled||d.length===0){g(void 0),C(void 0);return}let t=!1;async function n(){D(!0),k(``);try{let[e,n]=await Promise.all([fetch(`/memory/conversations/${encodeURIComponent(d)}/messages`),fetch(`/memory/conversations/${encodeURIComponent(d)}/steps`)]);if(!e.ok)throw Error(`Conversation messages failed with HTTP ${e.status}`);if(!n.ok)throw Error(`Conversation steps failed with HTTP ${n.status}`);t||(g(await e.json()),C(await n.json()))}catch(e){t||(k(e instanceof Error?e.message:String(e)),g(void 0),C(void 0))}finally{t||D(!1)}}return n(),()=>{t=!0}},[e.enabled,d]);let j=(0,s.useMemo)(()=>o.length===0?r:r.filter(e=>e.userId===o),[r,o]),M=(0,s.useMemo)(()=>S(t,r),[r,t]),N=j.find(e=>e.id===d)??j[0];return(0,s.useEffect)(()=>{if(j.length===0){p(``);return}j.some(e=>e.id===d)||p(j[0]?.id??``)},[d,j]),(0,c.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55`,"aria-label":`Memory`,children:[(0,c.jsx)(`header`,{className:`bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur`,children:(0,c.jsxs)(`div`,{className:`grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1`,children:[(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,c.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.24em] text-muted-foreground`,children:`Conversation store`}),(0,c.jsx)(`h1`,{className:`m-0 text-2xl font-semibold leading-none tracking-tight text-foreground`,children:`Memory`}),(0,c.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:`Stored users, conversations, raw messages, and transcript steps from the Studio store.`})]}),(0,c.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,c.jsx)(x,{label:`users`,value:M.userCount}),(0,c.jsx)(x,{label:`conversations`,value:M.conversationCount}),(0,c.jsx)(x,{label:`messages`,value:M.messageCount}),(0,c.jsx)(i,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,disabled:w,onClick:()=>void A(),children:`Refresh`})]})]})}),(0,c.jsx)(`div`,{className:`min-h-0 overflow-hidden pb-6 pl-4 pr-6`,children:e.enabled?w&&r.length===0?(0,c.jsx)(v,{title:`Loading memory`,text:`Reading users and conversations.`}):O.length>0&&r.length===0?(0,c.jsx)(v,{title:`Memory error`,text:O}):r.length===0?(0,c.jsx)(y,{agentCount:e.agents.length,userCount:t.length,onRefresh:()=>void A()}):(0,c.jsxs)(`div`,{className:[`grid h-full min-h-0 overflow-hidden`,O.length===0?`grid-rows-[minmax(0,1fr)]`:`grid-rows-[auto_minmax(0,1fr)]`].join(` `),children:[O.length===0?null:(0,c.jsx)(b,{message:O}),(0,c.jsxs)(`div`,{className:`grid min-h-0 grid-cols-[260px_minmax(320px,0.78fr)_minmax(0,1.22fr)] overflow-hidden border-t border-border/80 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)]`,children:[(0,c.jsx)(u,{users:t,selectedUserId:o,totalConversations:r.length,onSelect:l}),(0,c.jsx)(f,{agents:e.agents,conversations:j,selectedConversationId:N?.id??``,onSelect:p}),(0,c.jsx)(m,{agents:e.agents,conversation:N,detailLoading:E,messages:h,steps:_})]})]}):(0,c.jsx)(v,{title:`Memory unavailable`,text:`This Studio runtime has no session store.`})})]})}function u(e){return(0,c.jsx)(`aside`,{className:`min-h-0 overflow-auto border-r border-border/80 pr-3 max-md:border-b max-md:border-r-0 max-md:pr-0`,children:(0,c.jsxs)(`div`,{className:`grid gap-3 py-4 pr-3 max-md:pr-0`,children:[(0,c.jsx)(g,{label:`Users`,value:e.users.length}),(0,c.jsx)(d,{active:e.selectedUserId.length===0,title:`All users`,detail:`${e.totalConversations} conversations`,onClick:()=>e.onSelect(``)}),(0,c.jsx)(`div`,{className:`grid gap-1`,children:e.users.map(t=>(0,c.jsx)(d,{active:e.selectedUserId===t.userId,title:t.userId,detail:`${t.conversationCount} conversations / ${r(t.lastInteractionAt)}`,onClick:()=>e.onSelect(t.userId)},t.userId))})]})})}function d(e){return(0,c.jsxs)(`button`,{className:[`grid min-w-0 gap-1 rounded-lg border border-transparent px-3 py-2.5 text-left transition duration-200 hover:border-border/80 hover:bg-muted/25 focus-visible:border-ring focus-visible:outline-none`,e.active?`border-border/80 bg-muted/35`:``].join(` `),type:`button`,onClick:e.onClick,children:[(0,c.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.title}),(0,c.jsx)(`span`,{className:`min-w-0 truncate text-xs leading-5 text-muted-foreground`,children:e.detail})]})}function f(e){return(0,c.jsx)(`section`,{className:`min-h-0 overflow-auto border-r border-border/80 px-4 max-xl:border-r-0 max-xl:pr-0 max-md:border-b max-md:px-0`,children:(0,c.jsxs)(`div`,{className:`grid gap-3 py-4`,children:[(0,c.jsx)(g,{label:`Conversations`,value:e.conversations.length}),e.conversations.length===0?(0,c.jsx)(`div`,{className:`border-y border-dashed border-border/80 px-3 py-8 text-center text-sm text-muted-foreground`,children:`No conversations for this user.`}):(0,c.jsx)(`div`,{className:`grid border-y border-border/80`,children:e.conversations.map(t=>(0,c.jsx)(p,{active:t.id===e.selectedConversationId,agentName:w(e.agents,t.agentId),conversation:t,onSelect:()=>e.onSelect(t.id)},t.id))})]})})}function p(e){return(0,c.jsxs)(`button`,{className:[`grid min-w-0 gap-2 border-b border-border/70 px-3 py-3 text-left transition duration-200 last:border-b-0 hover:bg-muted/20 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,e.active?`bg-muted/35`:``].join(` `),type:`button`,onClick:e.onSelect,children:[(0,c.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,c.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.conversation.title??`Untitled conversation`}),(0,c.jsxs)(`span`,{className:`min-w-0 truncate text-xs text-muted-foreground`,children:[e.agentName,` / `,e.conversation.userId]})]}),(0,c.jsx)(`span`,{className:`shrink-0 text-xs tabular-nums text-muted-foreground`,children:e.conversation.messageCount})]}),(0,c.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground`,children:[(0,c.jsx)(`span`,{children:r(e.conversation.updatedAt)}),(0,c.jsx)(`span`,{className:`min-w-0 truncate`,children:e.conversation.id})]})]})}function m(e){return e.conversation===void 0?(0,c.jsx)(`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`,children:(0,c.jsx)(v,{title:`No conversation selected`,text:`Choose a conversation to inspect.`})}):(0,c.jsx)(`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`,children:(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-5`,children:[(0,c.jsxs)(`header`,{className:`grid gap-4 border-b border-border/80 pb-5`,children:[(0,c.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-4 max-md:grid`,children:[(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,c.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Selected conversation`}),(0,c.jsx)(`h2`,{className:`m-0 min-w-0 truncate text-2xl font-semibold leading-none text-foreground`,children:e.conversation.title??`Untitled conversation`}),(0,c.jsx)(`span`,{className:`min-w-0 break-all font-mono text-xs text-muted-foreground`,children:e.conversation.id})]}),(0,c.jsx)(a,{className:`border-border/80 bg-muted/45 text-foreground`,children:w(e.agents,e.conversation.agentId)})]}),(0,c.jsxs)(`div`,{className:`grid border-y border-border/80 sm:grid-cols-4 sm:divide-x sm:divide-border/80`,children:[(0,c.jsx)(_,{label:`user`,value:e.conversation.userId}),(0,c.jsx)(_,{label:`messages`,value:e.conversation.messageCount}),(0,c.jsx)(_,{label:`created`,value:r(e.conversation.createdAt)}),(0,c.jsx)(_,{label:`updated`,value:r(e.conversation.updatedAt)})]})]}),e.detailLoading?(0,c.jsx)(v,{title:`Loading detail`,text:`Reading message and transcript data.`}):(0,c.jsxs)(`div`,{className:`grid gap-4`,children:[e.conversation.metadata===void 0?null:(0,c.jsx)(h,{title:`metadata`,value:e.conversation.metadata}),(0,c.jsx)(h,{title:`messages`,value:e.messages?.messages??[]}),(0,c.jsx)(h,{title:`transcript steps`,value:e.steps?.steps??[]})]})]})})}function h(e){let t=Array.isArray(e.value)?e.value.length:void 0;return(0,c.jsxs)(`details`,{className:`group grid min-w-0 overflow-hidden border-y border-border/80`,open:!0,children:[(0,c.jsxs)(`summary`,{className:`flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 bg-muted/10 px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[(0,c.jsx)(`span`,{children:e.title}),(0,c.jsx)(`span`,{className:`font-medium normal-case tracking-normal`,children:t===void 0?`JSON`:`${t} items`})]}),(0,c.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-t border-border/70`,children:(0,c.jsx)(`pre`,{className:`m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground`,children:(0,c.jsx)(`code`,{children:(0,c.jsx)(o,{text:C(e.value)})})})})]})}function g(e){return(0,c.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,c.jsx)(`h2`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:e.label}),(0,c.jsx)(`span`,{className:`text-xs font-semibold tabular-nums text-muted-foreground`,children:e.value})]})}function _(e){return(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-1 px-3 py-3 first:pl-0 last:pr-0`,children:[(0,c.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.label}),(0,c.jsx)(`span`,{className:`min-w-0 truncate text-sm text-foreground`,title:String(e.value),children:e.value})]})}function v(e){return(0,c.jsx)(`div`,{className:`grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center`,children:(0,c.jsxs)(`div`,{className:`grid max-w-md gap-2`,children:[(0,c.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:e.title}),(0,c.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:e.text})]})})}function y(e){return(0,c.jsx)(`section`,{className:`grid h-full min-h-0 place-items-center border-t border-border/80 px-6`,children:(0,c.jsxs)(`div`,{className:`grid w-full max-w-3xl gap-6`,children:[(0,c.jsxs)(`div`,{className:`grid gap-3`,children:[(0,c.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:`Memory store`}),(0,c.jsx)(`h2`,{className:`m-0 text-2xl font-semibold leading-tight text-foreground`,children:`No saved conversations yet`}),(0,c.jsx)(`p`,{className:`m-0 max-w-[64ch] text-sm leading-6 text-muted-foreground`,children:`Conversations will appear here after agents run with memory enabled. The inspector keeps user filters, session payloads, and transcript steps in one place.`})]}),(0,c.jsxs)(`div`,{className:`grid border-y border-border/80 sm:grid-cols-3 sm:divide-x sm:divide-border/80`,children:[(0,c.jsx)(_,{label:`users`,value:e.userCount}),(0,c.jsx)(_,{label:`agents`,value:e.agentCount}),(0,c.jsx)(_,{label:`conversations`,value:0})]}),(0,c.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-3`,children:[(0,c.jsx)(i,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,onClick:e.onRefresh,children:`Refresh`}),(0,c.jsx)(`span`,{className:`text-xs leading-5 text-muted-foreground`,children:`Start a chat session to populate memory.`})]})]})})}function b(e){return(0,c.jsx)(`div`,{className:`mb-3 border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive`,children:e.message})}function x(e){return(0,c.jsxs)(`span`,{className:`inline-flex h-8 items-center gap-2 rounded-md border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground`,children:[(0,c.jsx)(`span`,{className:`font-semibold tabular-nums text-foreground`,children:e.value}),e.label]})}function S(e,t){return{userCount:e.length,conversationCount:t.length,messageCount:t.reduce((e,t)=>e+t.messageCount,0)}}function C(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function w(e,t){return e.find(e=>e.id===t)?.name??t}export{l as MemoryPage};
2
- //# sourceMappingURL=memory-page-Cn-wzJHp.js.map
1
+ import{i as e,r as t,s as n}from"./utils-BN2yP0LH.js";import{o as r}from"./format-C9HPGfkW.js";import{I as i}from"./index-CDwzNuFN.js";import{t as a}from"./badge-BH7gz3tB.js";import{t as o}from"./renderers-m-gqGocU.js";var s=n(e(),1),c=t();function l(e){let[t,n]=(0,s.useState)([]),[r,a]=(0,s.useState)([]),[o,l]=(0,s.useState)(``),[d,p]=(0,s.useState)(``),[h,g]=(0,s.useState)(),[_,C]=(0,s.useState)(),[w,T]=(0,s.useState)(!1),[E,D]=(0,s.useState)(!1),[O,k]=(0,s.useState)(``),A=(0,s.useCallback)(async()=>{if(!e.enabled){n([]),a([]),g(void 0),C(void 0);return}T(!0),k(``);try{let[e,t]=await Promise.all([fetch(`/memory/users?limit=50`),fetch(`/memory/conversations?limit=100`)]);if(!e.ok)throw Error(`Memory users failed with HTTP ${e.status}`);if(!t.ok)throw Error(`Memory conversations failed with HTTP ${t.status}`);let r=await e.json(),i=await t.json();n(r.users),a(i.conversations),p(e=>e||i.conversations[0]?.id||``)}catch(e){k(e instanceof Error?e.message:String(e))}finally{T(!1)}},[e.enabled]);(0,s.useEffect)(()=>{A()},[A]),(0,s.useEffect)(()=>{if(!e.enabled||d.length===0){g(void 0),C(void 0);return}let t=!1;async function n(){D(!0),k(``);try{let[e,n]=await Promise.all([fetch(`/memory/conversations/${encodeURIComponent(d)}/messages`),fetch(`/memory/conversations/${encodeURIComponent(d)}/steps`)]);if(!e.ok)throw Error(`Conversation messages failed with HTTP ${e.status}`);if(!n.ok)throw Error(`Conversation steps failed with HTTP ${n.status}`);t||(g(await e.json()),C(await n.json()))}catch(e){t||(k(e instanceof Error?e.message:String(e)),g(void 0),C(void 0))}finally{t||D(!1)}}return n(),()=>{t=!0}},[e.enabled,d]);let j=(0,s.useMemo)(()=>o.length===0?r:r.filter(e=>e.userId===o),[r,o]),M=(0,s.useMemo)(()=>S(t,r),[r,t]),N=j.find(e=>e.id===d)??j[0];return(0,s.useEffect)(()=>{if(j.length===0){p(``);return}j.some(e=>e.id===d)||p(j[0]?.id??``)},[d,j]),(0,c.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55`,"aria-label":`Memory`,children:[(0,c.jsx)(`header`,{className:`bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur`,children:(0,c.jsxs)(`div`,{className:`grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1`,children:[(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,c.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.24em] text-muted-foreground`,children:`Conversation store`}),(0,c.jsx)(`h1`,{className:`m-0 text-2xl font-semibold leading-none tracking-tight text-foreground`,children:`Memory`}),(0,c.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:`Stored users, conversations, raw messages, and transcript steps from the Studio store.`})]}),(0,c.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,c.jsx)(x,{label:`users`,value:M.userCount}),(0,c.jsx)(x,{label:`conversations`,value:M.conversationCount}),(0,c.jsx)(x,{label:`messages`,value:M.messageCount}),(0,c.jsx)(i,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,disabled:w,onClick:()=>void A(),children:`Refresh`})]})]})}),(0,c.jsx)(`div`,{className:`min-h-0 overflow-hidden pb-6 pl-4 pr-6`,children:e.enabled?w&&r.length===0?(0,c.jsx)(v,{title:`Loading memory`,text:`Reading users and conversations.`}):O.length>0&&r.length===0?(0,c.jsx)(v,{title:`Memory error`,text:O}):r.length===0?(0,c.jsx)(y,{agentCount:e.agents.length,userCount:t.length,onRefresh:()=>void A()}):(0,c.jsxs)(`div`,{className:[`grid h-full min-h-0 overflow-hidden`,O.length===0?`grid-rows-[minmax(0,1fr)]`:`grid-rows-[auto_minmax(0,1fr)]`].join(` `),children:[O.length===0?null:(0,c.jsx)(b,{message:O}),(0,c.jsxs)(`div`,{className:`grid min-h-0 grid-cols-[260px_minmax(320px,0.78fr)_minmax(0,1.22fr)] overflow-hidden border-t border-border/80 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)]`,children:[(0,c.jsx)(u,{users:t,selectedUserId:o,totalConversations:r.length,onSelect:l}),(0,c.jsx)(f,{agents:e.agents,conversations:j,selectedConversationId:N?.id??``,onSelect:p}),(0,c.jsx)(m,{agents:e.agents,conversation:N,detailLoading:E,messages:h,steps:_})]})]}):(0,c.jsx)(v,{title:`Memory unavailable`,text:`This Studio runtime has no session store.`})})]})}function u(e){return(0,c.jsx)(`aside`,{className:`min-h-0 overflow-auto border-r border-border/80 pr-3 max-md:border-b max-md:border-r-0 max-md:pr-0`,children:(0,c.jsxs)(`div`,{className:`grid gap-3 py-4 pr-3 max-md:pr-0`,children:[(0,c.jsx)(g,{label:`Users`,value:e.users.length}),(0,c.jsx)(d,{active:e.selectedUserId.length===0,title:`All users`,detail:`${e.totalConversations} conversations`,onClick:()=>e.onSelect(``)}),(0,c.jsx)(`div`,{className:`grid gap-1`,children:e.users.map(t=>(0,c.jsx)(d,{active:e.selectedUserId===t.userId,title:t.userId,detail:`${t.conversationCount} conversations / ${r(t.lastInteractionAt)}`,onClick:()=>e.onSelect(t.userId)},t.userId))})]})})}function d(e){return(0,c.jsxs)(`button`,{className:[`grid min-w-0 gap-1 rounded-lg border border-transparent px-3 py-2.5 text-left transition duration-200 hover:border-border/80 hover:bg-muted/25 focus-visible:border-ring focus-visible:outline-none`,e.active?`border-border/80 bg-muted/35`:``].join(` `),type:`button`,onClick:e.onClick,children:[(0,c.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.title}),(0,c.jsx)(`span`,{className:`min-w-0 truncate text-xs leading-5 text-muted-foreground`,children:e.detail})]})}function f(e){return(0,c.jsx)(`section`,{className:`min-h-0 overflow-auto border-r border-border/80 px-4 max-xl:border-r-0 max-xl:pr-0 max-md:border-b max-md:px-0`,children:(0,c.jsxs)(`div`,{className:`grid gap-3 py-4`,children:[(0,c.jsx)(g,{label:`Conversations`,value:e.conversations.length}),e.conversations.length===0?(0,c.jsx)(`div`,{className:`border-y border-dashed border-border/80 px-3 py-8 text-center text-sm text-muted-foreground`,children:`No conversations for this user.`}):(0,c.jsx)(`div`,{className:`grid border-y border-border/80`,children:e.conversations.map(t=>(0,c.jsx)(p,{active:t.id===e.selectedConversationId,agentName:w(e.agents,t.agentId),conversation:t,onSelect:()=>e.onSelect(t.id)},t.id))})]})})}function p(e){return(0,c.jsxs)(`button`,{className:[`grid min-w-0 gap-2 border-b border-border/70 px-3 py-3 text-left transition duration-200 last:border-b-0 hover:bg-muted/20 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,e.active?`bg-muted/35`:``].join(` `),type:`button`,onClick:e.onSelect,children:[(0,c.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,c.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.conversation.title??`Untitled conversation`}),(0,c.jsxs)(`span`,{className:`min-w-0 truncate text-xs text-muted-foreground`,children:[e.agentName,` / `,e.conversation.userId]})]}),(0,c.jsx)(`span`,{className:`shrink-0 text-xs tabular-nums text-muted-foreground`,children:e.conversation.messageCount})]}),(0,c.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground`,children:[(0,c.jsx)(`span`,{children:r(e.conversation.updatedAt)}),(0,c.jsx)(`span`,{className:`min-w-0 truncate`,children:e.conversation.id})]})]})}function m(e){return e.conversation===void 0?(0,c.jsx)(`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`,children:(0,c.jsx)(v,{title:`No conversation selected`,text:`Choose a conversation to inspect.`})}):(0,c.jsx)(`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`,children:(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-5`,children:[(0,c.jsxs)(`header`,{className:`grid gap-4 border-b border-border/80 pb-5`,children:[(0,c.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-4 max-md:grid`,children:[(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,c.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Selected conversation`}),(0,c.jsx)(`h2`,{className:`m-0 min-w-0 truncate text-2xl font-semibold leading-none text-foreground`,children:e.conversation.title??`Untitled conversation`}),(0,c.jsx)(`span`,{className:`min-w-0 break-all font-mono text-xs text-muted-foreground`,children:e.conversation.id})]}),(0,c.jsx)(a,{className:`border-border/80 bg-muted/45 text-foreground`,children:w(e.agents,e.conversation.agentId)})]}),(0,c.jsxs)(`div`,{className:`grid border-y border-border/80 sm:grid-cols-4 sm:divide-x sm:divide-border/80`,children:[(0,c.jsx)(_,{label:`user`,value:e.conversation.userId}),(0,c.jsx)(_,{label:`messages`,value:e.conversation.messageCount}),(0,c.jsx)(_,{label:`created`,value:r(e.conversation.createdAt)}),(0,c.jsx)(_,{label:`updated`,value:r(e.conversation.updatedAt)})]})]}),e.detailLoading?(0,c.jsx)(v,{title:`Loading detail`,text:`Reading message and transcript data.`}):(0,c.jsxs)(`div`,{className:`grid gap-4`,children:[e.conversation.metadata===void 0?null:(0,c.jsx)(h,{title:`metadata`,value:e.conversation.metadata}),(0,c.jsx)(h,{title:`messages`,value:e.messages?.messages??[]}),(0,c.jsx)(h,{title:`transcript steps`,value:e.steps?.steps??[]})]})]})})}function h(e){let t=Array.isArray(e.value)?e.value.length:void 0;return(0,c.jsxs)(`details`,{className:`group grid min-w-0 overflow-hidden border-y border-border/80`,open:!0,children:[(0,c.jsxs)(`summary`,{className:`flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 bg-muted/10 px-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[(0,c.jsx)(`span`,{children:e.title}),(0,c.jsx)(`span`,{className:`font-medium normal-case tracking-normal`,children:t===void 0?`JSON`:`${t} items`})]}),(0,c.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-t border-border/70`,children:(0,c.jsx)(`pre`,{className:`m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground`,children:(0,c.jsx)(`code`,{children:(0,c.jsx)(o,{text:C(e.value)})})})})]})}function g(e){return(0,c.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,c.jsx)(`h2`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:e.label}),(0,c.jsx)(`span`,{className:`text-xs font-semibold tabular-nums text-muted-foreground`,children:e.value})]})}function _(e){return(0,c.jsxs)(`div`,{className:`grid min-w-0 gap-1 px-3 py-3 first:pl-0 last:pr-0`,children:[(0,c.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.label}),(0,c.jsx)(`span`,{className:`min-w-0 truncate text-sm text-foreground`,title:String(e.value),children:e.value})]})}function v(e){return(0,c.jsx)(`div`,{className:`grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center`,children:(0,c.jsxs)(`div`,{className:`grid max-w-md gap-2`,children:[(0,c.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:e.title}),(0,c.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:e.text})]})})}function y(e){return(0,c.jsx)(`section`,{className:`grid h-full min-h-0 place-items-center border-t border-border/80 px-6`,children:(0,c.jsxs)(`div`,{className:`grid w-full max-w-3xl gap-6`,children:[(0,c.jsxs)(`div`,{className:`grid gap-3`,children:[(0,c.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:`Memory store`}),(0,c.jsx)(`h2`,{className:`m-0 text-2xl font-semibold leading-tight text-foreground`,children:`No saved conversations yet`}),(0,c.jsx)(`p`,{className:`m-0 max-w-[64ch] text-sm leading-6 text-muted-foreground`,children:`Conversations will appear here after agents run with memory enabled. The inspector keeps user filters, session payloads, and transcript steps in one place.`})]}),(0,c.jsxs)(`div`,{className:`grid border-y border-border/80 sm:grid-cols-3 sm:divide-x sm:divide-border/80`,children:[(0,c.jsx)(_,{label:`users`,value:e.userCount}),(0,c.jsx)(_,{label:`agents`,value:e.agentCount}),(0,c.jsx)(_,{label:`conversations`,value:0})]}),(0,c.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-3`,children:[(0,c.jsx)(i,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,onClick:e.onRefresh,children:`Refresh`}),(0,c.jsx)(`span`,{className:`text-xs leading-5 text-muted-foreground`,children:`Start a chat session to populate memory.`})]})]})})}function b(e){return(0,c.jsx)(`div`,{className:`mb-3 border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive`,children:e.message})}function x(e){return(0,c.jsxs)(`span`,{className:`inline-flex h-8 items-center gap-2 rounded-md border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground`,children:[(0,c.jsx)(`span`,{className:`font-semibold tabular-nums text-foreground`,children:e.value}),e.label]})}function S(e,t){return{userCount:e.length,conversationCount:t.length,messageCount:t.reduce((e,t)=>e+t.messageCount,0)}}function C(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function w(e,t){return e.find(e=>e.id===t)?.name??t}export{l as MemoryPage};
2
+ //# sourceMappingURL=memory-page-LbQjoiJi.js.map