@anvia/studio 1.0.12 → 1.0.14

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/graphs-page-D2jzO23K.js +2 -0
  2. package/dist/ui/assets/graphs-page-D2jzO23K.js.map +1 -0
  3. package/dist/ui/assets/index-C0DKDUvj.js +75 -0
  4. package/dist/ui/assets/index-C0DKDUvj.js.map +1 -0
  5. package/dist/ui/assets/{knowledge-page-1WgvGV4f.js → knowledge-page-BSI_VDOp.js} +2 -2
  6. package/dist/ui/assets/{knowledge-page-1WgvGV4f.js.map → knowledge-page-BSI_VDOp.js.map} +1 -1
  7. package/dist/ui/assets/{mcps-page-BV96jSfG.js → mcps-page-BL1FLksQ.js} +2 -2
  8. package/dist/ui/assets/{mcps-page-BV96jSfG.js.map → mcps-page-BL1FLksQ.js.map} +1 -1
  9. package/dist/ui/assets/{memory-page-DxClkjRl.js → memory-page-C20w55ut.js} +2 -2
  10. package/dist/ui/assets/{memory-page-DxClkjRl.js.map → memory-page-C20w55ut.js.map} +1 -1
  11. package/dist/ui/assets/{pipelines-page-ClO_uXn1.js → pipelines-page-BPCS5mwc.js} +2 -2
  12. package/dist/ui/assets/{pipelines-page-ClO_uXn1.js.map → pipelines-page-BPCS5mwc.js.map} +1 -1
  13. package/dist/ui/assets/{renderers-Cf55u6J4.js → renderers-CfrpUrJr.js} +2 -2
  14. package/dist/ui/assets/{renderers-Cf55u6J4.js.map → renderers-CfrpUrJr.js.map} +1 -1
  15. package/dist/ui/assets/{status-page-Ys5dQyMG.js → status-page-B-57_iOR.js} +2 -2
  16. package/dist/ui/assets/{status-page-Ys5dQyMG.js.map → status-page-B-57_iOR.js.map} +1 -1
  17. package/dist/ui/assets/{tool-runner-Cwfc3yY8.js → tool-runner-DcuNII62.js} +2 -2
  18. package/dist/ui/assets/{tool-runner-Cwfc3yY8.js.map → tool-runner-DcuNII62.js.map} +1 -1
  19. package/dist/ui/assets/{tools-page-BSgFqVi2.js → tools-page-D4wQGPOl.js} +2 -2
  20. package/dist/ui/assets/{tools-page-BSgFqVi2.js.map → tools-page-D4wQGPOl.js.map} +1 -1
  21. package/dist/ui/assets/{transcript-item-ChVGempt.js → transcript-item-B6OLwa1p.js} +2 -2
  22. package/dist/ui/assets/{transcript-item-ChVGempt.js.map → transcript-item-B6OLwa1p.js.map} +1 -1
  23. package/dist/ui/index.html +1 -1
  24. package/package.json +6 -6
  25. package/dist/ui/assets/graphs-page-ne3dJIrx.js +0 -2
  26. package/dist/ui/assets/graphs-page-ne3dJIrx.js.map +0 -1
  27. package/dist/ui/assets/index-CmHLK0R3.js +0 -75
  28. package/dist/ui/assets/index-CmHLK0R3.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{i as e,r as t,s as n}from"./utils-DzstcfqT.js";import{s as r,t as i}from"./button-B_AoswCu.js";import{t as a}from"./request-DbgMKweq.js";import{t as o}from"./ArrowClockwise.es-5vr4h4OH.js";import{t as s}from"./MagnifyingGlass.es-yzEp9c89.js";import{n as c}from"./icon-DyadsXLr.js";import{a as l,i as u,n as d,r as f,t as p}from"./select-BdCBnmXx.js";import{a as m,o as h,s as g,t as _}from"./studio-DzEdCFsX.js";import{a as v,i as y,n as b,o as x,r as S,s as C,t as w}from"./style-BstB0PNS.js";import{a as T,t as E}from"./renderers-CfrpUrJr.js";import{t as D}from"./input-DuERdYTl.js";var O=n(e(),1),k=new Map([[`bold`,O.createElement(O.Fragment,null,O.createElement(`path`,{d:`M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z`}))],[`duotone`,O.createElement(O.Fragment,null,O.createElement(`path`,{d:`M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z`,opacity:`0.2`}),O.createElement(`path`,{d:`M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z`}))],[`fill`,O.createElement(O.Fragment,null,O.createElement(`path`,{d:`M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z`}))],[`light`,O.createElement(O.Fragment,null,O.createElement(`path`,{d:`M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z`}))],[`regular`,O.createElement(O.Fragment,null,O.createElement(`path`,{d:`M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z`}))],[`thin`,O.createElement(O.Fragment,null,O.createElement(`path`,{d:`M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z`}))]]),A=O.forwardRef((e,t)=>O.createElement(c,{ref:t,...e,weights:k}));A.displayName=`PlusIcon`;var j=A,M={nodes:[],relationships:[],truncated:{nodes:!1,relationships:!1}};function N(e){let{explore:t,searchText:n}=e,[r,i]=(0,O.useState)(e.initialResult??M),[a,o]=(0,O.useState)(),[s,c]=(0,O.useState)(e.initialQuery??``),[l,u]=(0,O.useState)(e.initialResult===void 0?`idle`:`ready`),[d,f]=(0,O.useState)(),p=(0,O.useRef)(void 0),m=(0,O.useRef)(0),h=(0,O.useRef)({mode:`overview`}),g=(0,O.useRef)({});(0,O.useEffect)(()=>()=>p.current?.abort(),[]);let _=(0,O.useCallback)(async e=>{p.current?.abort();let n=new AbortController;p.current=n;let r=++m.current,a=e.abortSignal,s=()=>{n.abort(),r===m.current&&(p.current=void 0,u(`ready`))};if(a?.aborted===!0){s(),f(void 0);return}a?.addEventListener(`abort`,s,{once:!0});let c={...e,abortSignal:n.signal};e.mode===`overview`&&(h.current=L(e)),u(`loading`),f(void 0);try{let a=await t(c);return n.signal.aborted||r!==m.current?void 0:(i(t=>e.mode===`expand`?P(t,a):a),e.mode===`overview`&&(g.current=R(e),o(e=>a.nodes.some(t=>t.id===e)?e:void 0)),u(`ready`),a)}catch(e){if(n.signal.aborted||r!==m.current)return;throw f(e),u(`error`),e}finally{a?.removeEventListener(`abort`,s),p.current===n&&(p.current=void 0)}},[t]),v=(0,O.useCallback)((e,t={})=>{if(e.length===0)throw TypeError(`Graph explorer node id must be non-empty.`);return _({...g.current,...t,mode:`expand`,nodeIds:[e]})},[_]),y=(0,O.useCallback)(()=>_(h.current),[_]),b=(0,O.useCallback)(()=>{m.current+=1,p.current?.abort(),p.current=void 0,f(void 0),u(`ready`)},[]),x=(0,O.useCallback)(()=>{m.current+=1,p.current?.abort(),p.current=void 0,h.current={mode:`overview`},g.current={},i(M),o(void 0),c(``),f(void 0),u(`idle`)},[]),S=(0,O.useMemo)(()=>new Map(r.nodes.map(e=>[e.id,e])),[r.nodes]),C=a===void 0?void 0:S.get(a),w=(0,O.useMemo)(()=>new Set(r.nodes.filter(e=>F(e,s,n)).map(e=>e.id)),[s,r.nodes,n]);return(0,O.useMemo)(()=>({nodes:r.nodes,nodeById:S,relationships:r.relationships,truncated:r.truncated,selectedNodeId:a,selectedNode:C,query:s,matchedNodeIds:w,status:l,error:d,explore:_,expandNode:v,refresh:y,selectNode:o,setQuery:c,stop:b,reset:x}),[d,v,_,w,S,s,y,x,r,C,a,l,b])}function P(e,t){let n=new Map(e.nodes.map(e=>[e.id,e])),r=new Map(e.relationships.map(e=>[e.id,e]));for(let e of t.nodes)n.set(e.id,e);for(let e of t.relationships)r.set(e.id,e);return{nodes:[...n.values()],relationships:[...r.values()],truncated:{nodes:e.truncated.nodes||t.truncated.nodes,relationships:e.truncated.relationships||t.truncated.relationships}}}function F(e,t,n){let r=t.trim().toLocaleLowerCase();return r.length===0?!0:n===void 0?I(e).some(e=>String(e??``).toLocaleLowerCase().includes(r)):n(e).toLocaleLowerCase().includes(r)}function I(e){let t=Object.entries(e.properties).flatMap(([e,t])=>[e,Array.isArray(t)?t.join(` `):String(t)]);return[e.type,e.key,...Object.values(e.identity),...t]}function L(e){let{abortSignal:t,...n}=e;return n}function R(e){return{nodeTypes:e.nodeTypes,relationships:e.relationships,includeProvenance:e.includeProvenance,maxNodes:e.maxNodes,maxRelationships:e.maxRelationships}}(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0);var z=(0,O.createContext)(void 0),B=(0,O.createContext)(void 0);function V({controller:e,children:t}){return(0,O.createElement)(z.Provider,{value:e},t)}function H({value:e,children:t}){return(0,O.createElement)(B.Provider,{value:e},t)}function U(){let e=(0,O.useContext)(z);if(e===void 0)throw Error(`Graph explorer primitives must be used inside GraphExplorerProvider.`);return e}function W(){let e=(0,O.useContext)(B);if(e===void 0)throw Error(`Graph explorer node primitives must be used inside GraphExplorerNodePrimitive.Root or GraphExplorerPrimitive.Nodes.`);return e}function G(){return(0,O.useContext)(B)}(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0),(0,O.createContext)(void 0);var K=t();function q(e){for(let t of[`name`,`title`,`label`]){let n=e.properties[t];if(typeof n==`string`&&n.trim().length>0)return n}return e.key===void 0?`${e.type} ${e.id}`:e.key}(0,O.forwardRef)(function(e,t){let n=U(),r=n.truncated.nodes||n.truncated.relationships;return T(`div`,{...e,"aria-busy":n.status===`loading`,"data-role":`graph-explorer`,"data-state":n.status,"data-truncated":r?`true`:`false`},t)}),(0,O.forwardRef)(function({onChange:e,...t},n){let r=U(),i=(0,O.useCallback)(t=>{e?.(t),t.defaultPrevented||r.setQuery(t.currentTarget.value)},[r,e]);return T(`input`,{...t,"aria-label":t[`aria-label`]??`Search graph`,"data-state":r.query.length===0?`empty`:`populated`,onChange:i,type:t.type??`search`,value:r.query},n)}),(0,O.forwardRef)(function(e,t){return T(`div`,{...e,"data-role":`graph-explorer-viewport`},t)}),(0,O.forwardRef)(function({children:e,keepMounted:t=!1,...n},r){let i=U(),a=i.nodes.length===0;return a&&!t?null:T(`div`,{...n,children:i.nodes.map(t=>{let n={node:t,selected:t.id===i.selectedNodeId,matched:i.matchedNodeIds.has(t.id)};return(0,K.jsx)(H,{value:n,children:typeof e==`function`?e(t,n):e??(0,K.jsx)(J,{children:(0,K.jsx)(Y,{})})},t.id)}),"data-state":a?`empty`:`populated`,role:n.role??`list`},r)}),(0,O.forwardRef)(function(e,t){let n=U();return n.nodes.length>0||n.status===`loading`?null:T(`div`,{...e,children:e.children??`No graph nodes.`},t)}),(0,O.forwardRef)(function({children:e,...t},n){let r=U(),i=typeof e==`function`?e(r):e??ee(r);return T(`div`,{...t,children:i,"data-state":r.status,role:t.role??`status`},n)}),(0,O.forwardRef)(function({onClick:e,...t},n){let r=U(),i=t.disabled??r.status===`loading`,a=Z(e,i,r.refresh);return T(`button`,{...t,children:t.children??`Refresh graph`,disabled:i,onClick:a,type:t.type??`button`},n)});var J=(0,O.forwardRef)(function({nodeId:e,...t},n){let r=U(),i=G(),a=e===void 0?i?.node:r.nodeById.get(e);if(a===void 0)throw Error(e===void 0?`GraphExplorerNodePrimitive.Root requires a nodeId outside GraphExplorerPrimitive.Nodes.`:`Graph explorer node ${e} is not loaded.`);let o={node:a,selected:a.id===r.selectedNodeId,matched:r.matchedNodeIds.has(a.id)};return(0,K.jsx)(H,{value:o,children:T(`div`,{...t,"data-match":o.matched?`matched`:`unmatched`,"data-node-id":o.node.id,"data-node-type":o.node.type,"data-state":o.selected?`selected`:`unselected`,role:t.role??(i===void 0?void 0:`listitem`)},n)})}),Y=(0,O.forwardRef)(function({onClick:e,...t},n){let r=U(),i=W(),a=(0,O.useCallback)(n=>{e?.(n),!n.defaultPrevented&&!t.disabled&&r.selectNode(i.node.id)},[r,e,t.disabled,i.node.id]);return T(`button`,{...t,children:t.children??q(i.node),onClick:a,type:t.type??`button`,"aria-pressed":i.selected},n)}),X=(0,O.forwardRef)(function({onClick:e,options:t,...n},r){let i=U(),a=W(),o=n.disabled??i.status===`loading`,s=Z(e,o,(0,O.useCallback)(()=>i.expandNode(a.node.id,t),[i,t,a.node.id]));return T(`button`,{...n,children:n.children??`Expand`,disabled:o,onClick:s,type:n.type??`button`},r)});function Z(e,t,n){return(0,O.useCallback)(r=>{e?.(r),!(r.defaultPrevented||t)&&n().catch(()=>void 0)},[n,t,e])}function ee(e){return e.status===`loading`?`Loading graph.`:e.status===`error`?`Graph exploration failed.`:`${e.nodes.length} nodes, ${e.relationships.length} relationships.`}var te={Root:J,Trigger:Y,Expand:X},ne={graphEntity:ie};function re(e,t){let n=e.nodes.filter(e=>t.has(e.id)),r=new Set(n.map(e=>e.id));return{nodes:ae(n),edges:e.relationships.filter(e=>r.has(e.from)&&r.has(e.to)).map(e=>oe(e))}}function ie(e){return(0,K.jsx)(te.Root,{nodeId:e.id,asChild:!0,children:(0,K.jsxs)(`article`,{className:[`relative w-[180px] rounded-xl border bg-card px-3 py-2.5 text-left shadow-sm transition`,e.selected?`border-foreground shadow-md`:`border-border/80`].join(` `),children:[(0,K.jsx)(y,{type:`target`,position:C.Top,className:`!size-1.5 !border-0 !bg-muted-foreground/50`}),(0,K.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2.5`,children:[(0,K.jsx)(`span`,{className:[`size-2.5 shrink-0 rounded-full`,e.data.color].join(` `)}),(0,K.jsxs)(`div`,{className:`min-w-0`,children:[(0,K.jsx)(`div`,{className:`truncate text-sm font-semibold text-foreground`,children:e.data.label}),(0,K.jsx)(`div`,{className:`mt-0.5 truncate text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.data.type})]})]}),(0,K.jsx)(y,{type:`source`,position:C.Bottom,className:`!size-1.5 !border-0 !bg-muted-foreground/50`})]})})}function ae(e){return e.map((e,t)=>{let n=t*2.399963,r=180*Math.sqrt(t);return{id:e.id,type:`graphEntity`,position:{x:Math.cos(n)*r,y:Math.sin(n)*r},data:{label:q(e),type:e.type,color:se(e.type)}}})}function oe(e){return{id:e.id,source:e.from,target:e.to,label:e.type,type:`smoothstep`,markerEnd:{type:x.ArrowClosed,width:14,height:14},labelStyle:{fontSize:10,fontWeight:600},style:{strokeWidth:1.5}}}function se(e){let t=[`bg-emerald-500`,`bg-sky-500`,`bg-violet-500`,`bg-amber-500`,`bg-rose-500`,`bg-cyan-500`,`bg-fuchsia-500`],n=0;for(let t of e)n=n*31+t.charCodeAt(0)>>>0;return t[n%t.length]??`bg-muted-foreground`}function ce(e){let{onError:t,onStatus:n}=e,[i,o]=(0,O.useState)(e.graphs[0]?.id??``),[c,l]=(0,O.useState)([]),[u,d]=(0,O.useState)([]),f=e.graphs.find(e=>e.id===i)??e.graphs[0],p=N({explore:(0,O.useCallback)(async e=>{if(f===void 0)throw Error(`Graph explorer unavailable`);let{abortSignal:i,...o}=e;n(`Loading graph`);try{let e=await a(`/graphs/${encodeURIComponent(f.id)}/explore`,`Graph explorer`,i,`no-store`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(o)});return i?.aborted!==!0&&n(`Connected`),e}catch(e){throw i?.aborted!==!0&&(t(r(e)),n(`Graph error`)),e}},[f,t,n])}),y=(0,O.useMemo)(()=>({nodes:p.nodes,relationships:p.relationships,truncated:p.truncated}),[p.nodes,p.relationships,p.truncated]),x=(0,O.useMemo)(()=>re(y,p.matchedNodeIds),[p.matchedNodeIds,y]),C=p.status===`loading`,T=p.selectedNode,E=p.explore,k=p.reset,A=p.selectNode;if((0,O.useEffect)(()=>{if(f===void 0)return;let e=f.nodeTypes.map(e=>e.name),t=f.relationshipTypes.map(e=>e.name);o(f.id),l(e),d(t),k(),E({mode:`overview`,nodeTypes:e,relationships:t}).then(e=>{e!==void 0&&A(e.nodes[0]?.id)}).catch(()=>void 0)},[E,f,k,A]),!e.enabled||e.graphs.length===0)return(0,K.jsx)(m,{"aria-label":`Graphs`,children:(0,K.jsx)(_,{title:e.enabled?`No graphs`:`Graph explorer unavailable`,text:e.enabled?`Register a graph in Studio to inspect its nodes and relationships.`:`This Studio runtime does not expose a graph explorer.`})});function j(){E({mode:`overview`,nodeTypes:c,relationships:u}).then(e=>{e!==void 0&&A(e.nodes[0]?.id)}).catch(()=>void 0)}function M(){T!==void 0&&p.expandNode(T.id,{nodeTypes:c,relationships:u,direction:`both`,maxDepth:1}).catch(()=>void 0)}return(0,K.jsx)(V,{controller:p,children:(0,K.jsx)(m,{"aria-label":`Graphs`,children:(0,K.jsx)(`div`,{className:`grid min-h-0 min-w-0 pb-6 pr-6`,children:(0,K.jsxs)(g,{className:`grid grid-cols-[minmax(0,2fr)_340px] max-lg:grid-cols-1`,children:[(0,K.jsxs)(`div`,{className:`relative min-h-0 min-w-0 overflow-hidden border-r border-border/80 bg-card/25 max-lg:min-h-96 max-lg:border-b max-lg:border-r-0`,children:[(0,K.jsxs)(`div`,{className:`absolute left-4 top-4 z-10 flex max-w-[calc(100%-2rem)] items-center gap-2 rounded-xl border border-border/80 bg-background/90 p-2 shadow-sm backdrop-blur`,children:[(0,K.jsxs)(`div`,{className:`relative min-w-0 flex-1`,children:[(0,K.jsx)(s,{className:`pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground`}),(0,K.jsx)(D,{"aria-label":`Search loaded nodes`,className:`w-64 pl-8`,placeholder:`Search loaded nodes`,value:p.query,onChange:e=>p.setQuery(e.currentTarget.value)})]}),(0,K.jsxs)(h,{children:[x.nodes.length,` nodes`]}),(0,K.jsxs)(h,{children:[x.edges.length,` relations`]})]}),C&&y.nodes.length===0?(0,K.jsx)(`div`,{className:`grid h-full min-h-96 place-items-center text-sm text-muted-foreground`,children:`Loading graph…`}):null,!C&&y.nodes.length===0?(0,K.jsx)(_,{className:`h-full border-0`,title:`No nodes found`,text:`Try another graph or broaden the selected node and relationship types.`}):null,y.nodes.length>0?(0,K.jsxs)(v,{nodes:x.nodes,edges:x.edges,className:`graph-explorer-flow`,colorMode:e.theme,nodeTypes:ne,fitView:!0,fitViewOptions:{padding:.2,maxZoom:1},minZoom:.2,maxZoom:1.7,proOptions:{hideAttribution:!0},defaultEdgeOptions:{focusable:!0},style:{"--xy-edge-stroke":`var(--muted-foreground)`,"--xy-edge-stroke-width":`1.4`,"--xy-edge-stroke-selected":`var(--foreground)`},onNodeClick:(e,t)=>p.selectNode(t.id),children:[(0,K.jsx)(w,{variant:b.Dots,gap:16,size:1.5,color:`var(--muted-foreground)`,className:`opacity-30`}),(0,K.jsx)(S,{showInteractive:!1})]},`${f?.id}:${y.nodes.length}:${y.relationships.length}`):null]}),(0,K.jsx)(le,{graph:f,graphs:e.graphs,loading:C,result:y,selectedGraphId:i,selectedNode:T,selectedNodeTypes:c,selectedRelationships:u,onExpand:M,onReload:j,onSelectGraph:o,onToggleNodeType:e=>l(t=>$(t,e)),onToggleRelationship:e=>d(t=>$(t,e))})]})})})})}function le(e){let t=e.result.truncated.nodes||e.result.truncated.relationships;return(0,K.jsxs)(`aside`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/70`,children:[(0,K.jsxs)(`header`,{className:`grid gap-3 border-b border-border/80 bg-card/35 p-4`,children:[(0,K.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,K.jsxs)(`div`,{className:`min-w-0`,children:[(0,K.jsx)(`h1`,{className:`truncate text-base font-semibold`,children:e.graph?.name??`Graph explorer`}),(0,K.jsx)(`p`,{className:`mt-1 line-clamp-2 text-xs leading-5 text-muted-foreground`,children:e.graph?.description??`Explore a bounded view of nodes and relationships.`})]}),t?(0,K.jsx)(h,{title:`The configured result limit was reached`,children:`Limited`}):null]}),(0,K.jsxs)(p,{value:e.selectedGraphId,onValueChange:e.onSelectGraph,children:[(0,K.jsx)(u,{className:`h-8 w-full text-xs`,children:(0,K.jsx)(l,{placeholder:`Select graph`})}),(0,K.jsx)(d,{children:e.graphs.map(e=>(0,K.jsx)(f,{value:e.id,children:e.name??e.id},e.id))})]}),(0,K.jsxs)(`div`,{className:`flex gap-2`,children:[(0,K.jsxs)(i,{className:`flex-1`,variant:`secondary`,disabled:e.loading||e.selectedNodeTypes.length===0,onClick:e.onReload,children:[(0,K.jsx)(o,{}),` Refresh`]}),(0,K.jsxs)(i,{className:`flex-1`,disabled:e.loading||e.selectedNode===void 0,onClick:e.onExpand,children:[(0,K.jsx)(j,{}),` Expand`]})]})]}),(0,K.jsxs)(`div`,{className:`min-h-0 overflow-y-auto p-4`,children:[(0,K.jsx)(Q,{label:`Node types`,items:e.graph?.nodeTypes.map(e=>e.name)??[],selected:e.selectedNodeTypes,onToggle:e.onToggleNodeType}),(0,K.jsx)(Q,{label:`Relationships`,items:e.graph?.relationshipTypes.map(e=>e.name)??[],selected:e.selectedRelationships,onToggle:e.onToggleRelationship}),(0,K.jsx)(`div`,{className:`mt-5 border-t border-border/80 pt-4`,children:e.selectedNode===void 0?(0,K.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Select a node to inspect its properties.`}):(0,K.jsx)(ue,{node:e.selectedNode})})]})]})}function Q(e){return(0,K.jsxs)(`section`,{className:`mb-4`,children:[(0,K.jsx)(`h2`,{className:`mb-2 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.label}),(0,K.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:e.items.map(t=>{let n=e.selected.includes(t);return(0,K.jsx)(`button`,{type:`button`,"aria-pressed":n,className:[`rounded-full border px-2 py-1 text-xs transition-colors`,n?`border-foreground/30 bg-foreground text-background`:`border-border bg-card text-muted-foreground hover:text-foreground`].join(` `),onClick:()=>e.onToggle(t),children:t},t)})})]})}function ue(e){let t=JSON.stringify({identity:e.node.identity,properties:e.node.properties},null,2);return(0,K.jsxs)(`section`,{children:[(0,K.jsx)(h,{children:e.node.type}),(0,K.jsx)(`h2`,{className:`mt-2 break-words text-base font-semibold`,children:q(e.node)}),(0,K.jsxs)(`p`,{className:`mt-1 break-all text-xs text-muted-foreground`,children:[`ID `,e.node.id]}),(0,K.jsx)(`pre`,{className:`mt-4 overflow-x-auto rounded-xl border border-border/80 bg-card p-3 text-xs leading-5`,children:(0,K.jsx)(`code`,{children:(0,K.jsx)(E,{text:t})})})]})}function $(e,t){return e.includes(t)?e.filter(e=>e!==t):[...e,t]}export{ce as GraphsPage};
2
+ //# sourceMappingURL=graphs-page-D2jzO23K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphs-page-D2jzO23K.js","names":["t"],"sources":["../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Plus.es.js","../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Plus.es.js","../../../../react/dist/graph-explorer/index.js","../../../../react-ui/dist/chunk-E73S3SOF.js","../../../../react-ui/dist/graph-explorer/index.js","../../../src/ui/app/modules/graphs/graph-flow.tsx","../../../src/ui/app/modules/graphs/graphs-page.tsx"],"sourcesContent":["import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n \"path\",\n {\n d: \"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z\" }))\n ]\n]);\nexport {\n a as default\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Plus.es.js\";\nconst e = o.forwardRef((r, s) => /* @__PURE__ */ o.createElement(t, { ref: s, ...r, weights: a }));\ne.displayName = \"PlusIcon\";\nconst n = e;\nexport {\n n as Plus,\n e as PlusIcon\n};\n","// src/graph-explorer/use-graph-explorer.ts\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nvar emptyResult = {\n nodes: [],\n relationships: [],\n truncated: { nodes: false, relationships: false }\n};\nfunction useGraphExplorer(options) {\n const { explore: load, searchText } = options;\n const [result, setResult] = useState(options.initialResult ?? emptyResult);\n const [selectedNodeId, setSelectedNodeId] = useState();\n const [query, setQuery] = useState(options.initialQuery ?? \"\");\n const [status, setStatus] = useState(\n options.initialResult === void 0 ? \"idle\" : \"ready\"\n );\n const [error, setError] = useState();\n const abortRef = useRef(void 0);\n const requestIdRef = useRef(0);\n const overviewRef = useRef({ mode: \"overview\" });\n const expansionDefaultsRef = useRef({});\n useEffect(() => () => abortRef.current?.abort(), []);\n const explore = useCallback(\n async (request) => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n const requestId = ++requestIdRef.current;\n const externalSignal = request.abortSignal;\n const abortFromExternal = () => {\n controller.abort();\n if (requestId === requestIdRef.current) {\n abortRef.current = void 0;\n setStatus(\"ready\");\n }\n };\n if (externalSignal?.aborted === true) {\n abortFromExternal();\n setError(void 0);\n return void 0;\n }\n externalSignal?.addEventListener(\"abort\", abortFromExternal, { once: true });\n const nextRequest = {\n ...request,\n abortSignal: controller.signal\n };\n if (request.mode === \"overview\") overviewRef.current = withoutAbortSignal(request);\n setStatus(\"loading\");\n setError(void 0);\n try {\n const next = await load(nextRequest);\n if (controller.signal.aborted || requestId !== requestIdRef.current) return void 0;\n setResult(\n (current) => request.mode === \"expand\" ? mergeGraphExploreResults(current, next) : next\n );\n if (request.mode === \"overview\") {\n expansionDefaultsRef.current = expansionDefaults(request);\n setSelectedNodeId(\n (current) => next.nodes.some((node) => node.id === current) ? current : void 0\n );\n }\n setStatus(\"ready\");\n return next;\n } catch (caught) {\n if (controller.signal.aborted || requestId !== requestIdRef.current) return void 0;\n setError(caught);\n setStatus(\"error\");\n throw caught;\n } finally {\n externalSignal?.removeEventListener(\"abort\", abortFromExternal);\n if (abortRef.current === controller) abortRef.current = void 0;\n }\n },\n [load]\n );\n const expandNode = useCallback(\n (nodeId, expandOptions = {}) => {\n if (nodeId.length === 0) throw new TypeError(\"Graph explorer node id must be non-empty.\");\n return explore({\n ...expansionDefaultsRef.current,\n ...expandOptions,\n mode: \"expand\",\n nodeIds: [nodeId]\n });\n },\n [explore]\n );\n const refresh = useCallback(() => explore(overviewRef.current), [explore]);\n const stop = useCallback(() => {\n requestIdRef.current += 1;\n abortRef.current?.abort();\n abortRef.current = void 0;\n setError(void 0);\n setStatus(\"ready\");\n }, []);\n const reset = useCallback(() => {\n requestIdRef.current += 1;\n abortRef.current?.abort();\n abortRef.current = void 0;\n overviewRef.current = { mode: \"overview\" };\n expansionDefaultsRef.current = {};\n setResult(emptyResult);\n setSelectedNodeId(void 0);\n setQuery(\"\");\n setError(void 0);\n setStatus(\"idle\");\n }, []);\n const nodeById = useMemo(\n () => new Map(result.nodes.map((node) => [node.id, node])),\n [result.nodes]\n );\n const selectedNode = selectedNodeId === void 0 ? void 0 : nodeById.get(selectedNodeId);\n const matchedNodeIds = useMemo(\n () => new Set(\n result.nodes.filter((node) => graphExplorerNodeMatches(node, query, searchText)).map((node) => node.id)\n ),\n [query, result.nodes, searchText]\n );\n return useMemo(\n () => ({\n nodes: result.nodes,\n nodeById,\n relationships: result.relationships,\n truncated: result.truncated,\n selectedNodeId,\n selectedNode,\n query,\n matchedNodeIds,\n status,\n error,\n explore,\n expandNode,\n refresh,\n selectNode: setSelectedNodeId,\n setQuery,\n stop,\n reset\n }),\n [\n error,\n expandNode,\n explore,\n matchedNodeIds,\n nodeById,\n query,\n refresh,\n reset,\n result,\n selectedNode,\n selectedNodeId,\n status,\n stop\n ]\n );\n}\nfunction mergeGraphExploreResults(current, next) {\n const nodes = new Map(current.nodes.map((node) => [node.id, node]));\n const relationships = new Map(\n current.relationships.map((relationship) => [relationship.id, relationship])\n );\n for (const node of next.nodes) nodes.set(node.id, node);\n for (const relationship of next.relationships) relationships.set(relationship.id, relationship);\n return {\n nodes: [...nodes.values()],\n relationships: [...relationships.values()],\n truncated: {\n nodes: current.truncated.nodes || next.truncated.nodes,\n relationships: current.truncated.relationships || next.truncated.relationships\n }\n };\n}\nfunction graphExplorerNodeMatches(node, query, searchText) {\n const normalizedQuery = query.trim().toLocaleLowerCase();\n if (normalizedQuery.length === 0) return true;\n if (searchText !== void 0) {\n return searchText(node).toLocaleLowerCase().includes(normalizedQuery);\n }\n return defaultGraphExplorerNodeSearchValues(node).some(\n (value) => String(value ?? \"\").toLocaleLowerCase().includes(normalizedQuery)\n );\n}\nfunction defaultGraphExplorerNodeSearchValues(node) {\n const properties = Object.entries(node.properties).flatMap(([key, value]) => [\n key,\n Array.isArray(value) ? value.join(\" \") : String(value)\n ]);\n return [node.type, node.key, ...Object.values(node.identity), ...properties];\n}\nfunction withoutAbortSignal(options) {\n const { abortSignal: _abortSignal, ...request } = options;\n return request;\n}\nfunction expansionDefaults(options) {\n return {\n nodeTypes: options.nodeTypes,\n relationships: options.relationships,\n includeProvenance: options.includeProvenance,\n maxNodes: options.maxNodes,\n maxRelationships: options.maxRelationships\n };\n}\nexport {\n graphExplorerNodeMatches,\n mergeGraphExploreResults,\n useGraphExplorer\n};\n//# sourceMappingURL=index.js.map","// src/contexts/attachment.tsx\nimport { createContext, createElement, useContext } from \"react\";\nvar AttachmentContext = createContext(void 0);\nfunction InternalAttachmentProvider({\n value,\n children\n}) {\n return createElement(AttachmentContext.Provider, { value }, children);\n}\nfunction useAttachment() {\n const value = useContext(AttachmentContext);\n if (value === void 0) {\n throw new Error(\"Attachment primitives must be used inside AttachmentPrimitive.Root.\");\n }\n return value;\n}\nfunction useOptionalAttachment() {\n return useContext(AttachmentContext);\n}\n\n// src/contexts/chat.tsx\nimport { createContext as createContext2, createElement as createElement2, useContext as useContext2 } from \"react\";\nvar ChatContext = createContext2(void 0);\nfunction ChatProvider({ controller, children }) {\n return createElement2(\n ChatContext.Provider,\n { value: controller },\n children\n );\n}\nfunction useChatContext() {\n const value = useContext2(ChatContext);\n if (value === void 0) {\n throw new Error(\"Anvia chat primitives must be used inside ChatProvider.\");\n }\n return value;\n}\nfunction useHumanInput() {\n const interactions = useChatContext().interactions;\n const approvals = interactions.all.filter(\n (item) => item.request.type === \"tool-approval\"\n );\n const questions = interactions.all.filter(\n (item) => item.request.type === \"tool-question\"\n );\n return {\n approvals: {\n all: approvals,\n pending: approvals.filter((item) => item.status === \"pending\")\n },\n questions: {\n all: questions,\n pending: questions.filter((item) => item.status === \"pending\")\n }\n };\n}\n\n// src/contexts/completion.tsx\nimport { createContext as createContext3, createElement as createElement3, useContext as useContext3 } from \"react\";\nvar CompletionContext = createContext3(void 0);\nfunction CompletionProvider({ controller, children }) {\n return createElement3(\n CompletionContext.Provider,\n { value: controller },\n children\n );\n}\nfunction useCompletionContext() {\n const value = useContext3(CompletionContext);\n if (value === void 0) {\n throw new Error(\"Anvia completion primitives must be used inside CompletionProvider.\");\n }\n return value;\n}\n\n// src/contexts/graph-explorer.tsx\nimport { createContext as createContext4, createElement as createElement4, useContext as useContext4 } from \"react\";\nvar GraphExplorerContext = createContext4(void 0);\nvar GraphExplorerNodeContext = createContext4(\n void 0\n);\nfunction GraphExplorerProvider({\n controller,\n children\n}) {\n return createElement4(\n GraphExplorerContext.Provider,\n { value: controller },\n children\n );\n}\nfunction InternalGraphExplorerNodeProvider({\n value,\n children\n}) {\n return createElement4(GraphExplorerNodeContext.Provider, { value }, children);\n}\nfunction useGraphExplorerContext() {\n const value = useContext4(GraphExplorerContext);\n if (value === void 0) {\n throw new Error(\"Graph explorer primitives must be used inside GraphExplorerProvider.\");\n }\n return value;\n}\nfunction useGraphExplorerNode() {\n const value = useContext4(GraphExplorerNodeContext);\n if (value === void 0) {\n throw new Error(\n \"Graph explorer node primitives must be used inside GraphExplorerNodePrimitive.Root or GraphExplorerPrimitive.Nodes.\"\n );\n }\n return value;\n}\nfunction useOptionalGraphExplorerNode() {\n return useContext4(GraphExplorerNodeContext);\n}\n\n// src/contexts/completion-input.tsx\nimport { createContext as createContext5, createElement as createElement5, useContext as useContext5 } from \"react\";\nvar CompletionInputContext = createContext5(void 0);\nfunction InternalCompletionInputProvider({\n value,\n children\n}) {\n return createElement5(CompletionInputContext.Provider, { value }, children);\n}\nfunction useCompletionInput() {\n const value = useContext5(CompletionInputContext);\n if (value === void 0) {\n throw new Error(\"Completion input primitives must be used inside CompletionPrimitive.Form.\");\n }\n return value;\n}\n\n// src/contexts/composer.tsx\nimport { createContext as createContext6, createElement as createElement6, useContext as useContext6 } from \"react\";\nvar ComposerContext = createContext6(void 0);\nfunction InternalComposerProvider({\n value,\n children\n}) {\n return createElement6(ComposerContext.Provider, { value }, children);\n}\nfunction useComposer() {\n const value = useContext6(ComposerContext);\n if (value === void 0) {\n throw new Error(\"Composer primitives must be used inside ComposerPrimitive.Root.\");\n }\n return value;\n}\n\n// src/contexts/human-input.tsx\nimport {\n createContext as createContext7,\n createElement as createElement7,\n useContext as useContext7,\n useMemo,\n useState\n} from \"react\";\nvar ApprovalContext = createContext7(void 0);\nvar QuestionContext = createContext7(void 0);\nvar QuestionPromptContext = createContext7(void 0);\nfunction InternalApprovalProvider({\n approval,\n children\n}) {\n const [reason, setReason] = useState(\"\");\n const value = useMemo(\n () => ({ approval, reason, setReason }),\n [approval, reason]\n );\n return createElement7(ApprovalContext.Provider, { value }, children);\n}\nfunction InternalQuestionProvider({\n value,\n children\n}) {\n return createElement7(QuestionContext.Provider, { value }, children);\n}\nfunction InternalQuestionPromptProvider({\n prompt,\n children\n}) {\n return createElement7(QuestionPromptContext.Provider, { value: { prompt } }, children);\n}\nfunction useApproval() {\n const value = useContext7(ApprovalContext);\n if (value === void 0) {\n throw new Error(\"Approval primitives must be used inside HumanInputPrimitive.Approval.\");\n }\n return value;\n}\nfunction useQuestion() {\n const value = useContext7(QuestionContext);\n if (value === void 0) {\n throw new Error(\"Question primitives must be used inside HumanInputPrimitive.Question.\");\n }\n return value;\n}\nfunction useQuestionPrompt() {\n const value = useContext7(QuestionPromptContext);\n if (value === void 0) {\n throw new Error(\n \"Question choice primitives must be used inside HumanInputPrimitive.QuestionPrompt.\"\n );\n }\n return value;\n}\n\n// src/contexts/image.tsx\nimport { createContext as createContext8, createElement as createElement8, useContext as useContext8 } from \"react\";\nvar ImageContext = createContext8(void 0);\nfunction InternalImageProvider({\n value,\n children\n}) {\n return createElement8(ImageContext.Provider, { value }, children);\n}\nfunction useImage() {\n const value = useContext8(ImageContext);\n if (value === void 0) {\n throw new Error(\"Image primitives must be used inside ImagePrimitive.Root.\");\n }\n return value;\n}\n\n// src/contexts/message.tsx\nimport { createContext as createContext9, createElement as createElement9, useContext as useContext9 } from \"react\";\nvar MessageContext = createContext9(void 0);\nvar MessagePartContext = createContext9(void 0);\nfunction InternalMessageProvider({\n message,\n children\n}) {\n return createElement9(MessageContext.Provider, { value: { message } }, children);\n}\nfunction InternalMessagePartProvider({\n part,\n isLive = false,\n streamControlled = false,\n children\n}) {\n return createElement9(\n MessagePartContext.Provider,\n { value: { isLive, part, streamControlled } },\n children\n );\n}\nfunction useMessage() {\n const value = useContext9(MessageContext);\n if (value === void 0) {\n throw new Error(\n \"Message primitives must be used inside MessagePrimitive.Root or ThreadPrimitive.Messages.\"\n );\n }\n return value;\n}\nfunction useMessagePart() {\n const value = useContext9(MessagePartContext);\n if (value === void 0) {\n throw new Error(\n \"Message part primitives must be used inside MessagePrimitive.Parts or MessagePrimitive.Part.\"\n );\n }\n return value;\n}\nfunction useOptionalMessagePart() {\n return useContext9(MessagePartContext);\n}\n\n// src/contexts/selection-toolbar.tsx\nimport { createContext as createContext10, createElement as createElement10, useContext as useContext10 } from \"react\";\nvar SelectionToolbarContext = createContext10(void 0);\nfunction InternalSelectionToolbarProvider({\n value,\n children\n}) {\n return createElement10(SelectionToolbarContext.Provider, { value }, children);\n}\nfunction useSelectionToolbar() {\n const value = useContext10(SelectionToolbarContext);\n if (value === void 0) {\n throw new Error(\n \"SelectionToolbar primitives must be used inside SelectionToolbarPrimitive.Root.\"\n );\n }\n return value;\n}\n\n// src/contexts/thread.tsx\nimport {\n createContext as createContext11,\n createElement as createElement11,\n useContext as useContext11\n} from \"react\";\nvar ThreadContext = createContext11(void 0);\nfunction InternalThreadProvider({\n value,\n children\n}) {\n return createElement11(ThreadContext.Provider, { value }, children);\n}\nfunction useThread() {\n const value = useContext11(ThreadContext);\n if (value === void 0) {\n throw new Error(\"Thread primitives must be used inside ThreadPrimitive.Root.\");\n }\n return value;\n}\n\n// src/contexts/thread-list.tsx\nimport {\n createContext as createContext12,\n createElement as createElement12,\n useContext as useContext12\n} from \"react\";\nvar ThreadListContext = createContext12(void 0);\nvar ThreadListItemContext = createContext12(void 0);\nvar ThreadListRootContext = createContext12(\n void 0\n);\nfunction ThreadListProvider({\n controller,\n children\n}) {\n return createElement12(ThreadListContext.Provider, { value: controller }, children);\n}\nfunction InternalThreadListItemProvider({\n value,\n children\n}) {\n return createElement12(ThreadListItemContext.Provider, { value }, children);\n}\nfunction InternalThreadListRootProvider({\n value,\n children\n}) {\n return createElement12(ThreadListRootContext.Provider, { value }, children);\n}\nfunction useThreadList() {\n const value = useContext12(ThreadListContext);\n if (value === void 0) {\n throw new Error(\"ThreadList primitives must be used inside ThreadListProvider.\");\n }\n return value;\n}\nfunction useThreadListItem() {\n const value = useContext12(ThreadListItemContext);\n if (value === void 0) {\n throw new Error(\"ThreadListItem primitives must be used inside ThreadListPrimitive.Items.\");\n }\n return value;\n}\nfunction useInternalThreadListRoot() {\n const value = useContext12(ThreadListRootContext);\n if (value === void 0) {\n throw new Error(\"Thread-list primitives must be used inside ThreadListPrimitive.Root.\");\n }\n return value;\n}\n\nexport {\n InternalAttachmentProvider,\n useAttachment,\n useOptionalAttachment,\n ChatProvider,\n useChatContext,\n useHumanInput,\n CompletionProvider,\n useCompletionContext,\n GraphExplorerProvider,\n InternalGraphExplorerNodeProvider,\n useGraphExplorerContext,\n useGraphExplorerNode,\n useOptionalGraphExplorerNode,\n InternalCompletionInputProvider,\n useCompletionInput,\n InternalComposerProvider,\n useComposer,\n InternalApprovalProvider,\n InternalQuestionProvider,\n InternalQuestionPromptProvider,\n useApproval,\n useQuestion,\n useQuestionPrompt,\n InternalImageProvider,\n useImage,\n InternalMessageProvider,\n InternalMessagePartProvider,\n useMessage,\n useMessagePart,\n useOptionalMessagePart,\n InternalSelectionToolbarProvider,\n useSelectionToolbar,\n InternalThreadProvider,\n useThread,\n ThreadListProvider,\n InternalThreadListItemProvider,\n InternalThreadListRootProvider,\n useThreadList,\n useThreadListItem,\n useInternalThreadListRoot\n};\n//# sourceMappingURL=chunk-E73S3SOF.js.map","import {\n renderPrimitive\n} from \"../chunk-T3ZFZ3NP.js\";\nimport {\n GraphExplorerProvider,\n InternalGraphExplorerNodeProvider,\n useGraphExplorerContext,\n useGraphExplorerNode,\n useOptionalGraphExplorerNode\n} from \"../chunk-E73S3SOF.js\";\n\n// src/graph-explorer/parts.tsx\nimport { forwardRef, useCallback } from \"react\";\n\n// src/graph-explorer/helpers.ts\nfunction graphExplorerNodeLabel(node) {\n for (const key of [\"name\", \"title\", \"label\"]) {\n const value = node.properties[key];\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n }\n if (node.key !== void 0) return node.key;\n return `${node.type} ${node.id}`;\n}\n\n// src/graph-explorer/parts.tsx\nimport { jsx } from \"react/jsx-runtime\";\nvar GraphExplorerRoot = forwardRef(\n function GraphExplorerRoot2(props, ref) {\n const explorer = useGraphExplorerContext();\n const truncated = explorer.truncated.nodes || explorer.truncated.relationships;\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"aria-busy\": explorer.status === \"loading\",\n \"data-role\": \"graph-explorer\",\n \"data-state\": explorer.status,\n \"data-truncated\": truncated ? \"true\" : \"false\"\n },\n ref\n );\n }\n);\nvar GraphExplorerSearch = forwardRef(\n function GraphExplorerSearch2({ onChange, ...props }, ref) {\n const explorer = useGraphExplorerContext();\n const handleChange = useCallback(\n (event) => {\n onChange?.(event);\n if (!event.defaultPrevented) explorer.setQuery(event.currentTarget.value);\n },\n [explorer, onChange]\n );\n return renderPrimitive(\n \"input\",\n {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? \"Search graph\",\n \"data-state\": explorer.query.length === 0 ? \"empty\" : \"populated\",\n onChange: handleChange,\n type: props.type ?? \"search\",\n value: explorer.query\n },\n ref\n );\n }\n);\nvar GraphExplorerViewport = forwardRef(\n function GraphExplorerViewport2(props, ref) {\n return renderPrimitive(\n \"div\",\n { ...props, \"data-role\": \"graph-explorer-viewport\" },\n ref\n );\n }\n);\nvar GraphExplorerNodes = forwardRef(\n function GraphExplorerNodes2({ children, keepMounted = false, ...props }, ref) {\n const explorer = useGraphExplorerContext();\n const empty = explorer.nodes.length === 0;\n if (empty && !keepMounted) return null;\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: explorer.nodes.map((node) => {\n const state = {\n node,\n selected: node.id === explorer.selectedNodeId,\n matched: explorer.matchedNodeIds.has(node.id)\n };\n return /* @__PURE__ */ jsx(InternalGraphExplorerNodeProvider, { value: state, children: typeof children === \"function\" ? children(node, state) : children ?? /* @__PURE__ */ jsx(GraphExplorerNodeRoot, { children: /* @__PURE__ */ jsx(GraphExplorerNodeTrigger, {}) }) }, node.id);\n }),\n \"data-state\": empty ? \"empty\" : \"populated\",\n role: props.role ?? \"list\"\n },\n ref\n );\n }\n);\nvar GraphExplorerEmpty = forwardRef(\n function GraphExplorerEmpty2(props, ref) {\n const explorer = useGraphExplorerContext();\n if (explorer.nodes.length > 0 || explorer.status === \"loading\") return null;\n return renderPrimitive(\n \"div\",\n { ...props, children: props.children ?? \"No graph nodes.\" },\n ref\n );\n }\n);\nvar GraphExplorerStatus = forwardRef(\n function GraphExplorerStatus2({ children, ...props }, ref) {\n const explorer = useGraphExplorerContext();\n const content = typeof children === \"function\" ? children(explorer) : children ?? statusText(explorer);\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: content,\n \"data-state\": explorer.status,\n role: props.role ?? \"status\"\n },\n ref\n );\n }\n);\nvar GraphExplorerRefresh = forwardRef(\n function GraphExplorerRefresh2({ onClick, ...props }, ref) {\n const explorer = useGraphExplorerContext();\n const disabled = props.disabled ?? explorer.status === \"loading\";\n const handleClick = useAsyncAction(onClick, disabled, explorer.refresh);\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Refresh graph\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\"\n },\n ref\n );\n }\n);\nvar GraphExplorerNodeRoot = forwardRef(\n function GraphExplorerNodeRoot2({ nodeId, ...props }, ref) {\n const explorer = useGraphExplorerContext();\n const inherited = useOptionalGraphExplorerNode();\n const node = nodeId === void 0 ? inherited?.node : explorer.nodeById.get(nodeId);\n if (node === void 0) {\n throw new Error(\n nodeId === void 0 ? \"GraphExplorerNodePrimitive.Root requires a nodeId outside GraphExplorerPrimitive.Nodes.\" : `Graph explorer node ${nodeId} is not loaded.`\n );\n }\n const state = {\n node,\n selected: node.id === explorer.selectedNodeId,\n matched: explorer.matchedNodeIds.has(node.id)\n };\n return /* @__PURE__ */ jsx(InternalGraphExplorerNodeProvider, { value: state, children: renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-match\": state.matched ? \"matched\" : \"unmatched\",\n \"data-node-id\": state.node.id,\n \"data-node-type\": state.node.type,\n \"data-state\": state.selected ? \"selected\" : \"unselected\",\n role: props.role ?? (inherited === void 0 ? void 0 : \"listitem\")\n },\n ref\n ) });\n }\n);\nvar GraphExplorerNodeTrigger = forwardRef(\n function GraphExplorerNodeTrigger2({ onClick, ...props }, ref) {\n const explorer = useGraphExplorerContext();\n const state = useGraphExplorerNode();\n const handleClick = useCallback(\n (event) => {\n onClick?.(event);\n if (!event.defaultPrevented && !props.disabled) explorer.selectNode(state.node.id);\n },\n [explorer, onClick, props.disabled, state.node.id]\n );\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? graphExplorerNodeLabel(state.node),\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"aria-pressed\": state.selected\n },\n ref\n );\n }\n);\nvar GraphExplorerNodeExpand = forwardRef(\n function GraphExplorerNodeExpand2({ onClick, options, ...props }, ref) {\n const explorer = useGraphExplorerContext();\n const state = useGraphExplorerNode();\n const disabled = props.disabled ?? explorer.status === \"loading\";\n const expand = useCallback(\n () => explorer.expandNode(state.node.id, options),\n [explorer, options, state.node.id]\n );\n const handleClick = useAsyncAction(onClick, disabled, expand);\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Expand\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\"\n },\n ref\n );\n }\n);\nfunction useAsyncAction(onClick, disabled, action) {\n return useCallback(\n (event) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) return;\n void action().catch(() => void 0);\n },\n [action, disabled, onClick]\n );\n}\nfunction statusText(explorer) {\n if (explorer.status === \"loading\") return \"Loading graph.\";\n if (explorer.status === \"error\") return \"Graph exploration failed.\";\n return `${explorer.nodes.length} nodes, ${explorer.relationships.length} relationships.`;\n}\n\n// src/graph-explorer/index.ts\nvar GraphExplorerPrimitive = {\n Root: GraphExplorerRoot,\n Viewport: GraphExplorerViewport,\n Search: GraphExplorerSearch,\n Nodes: GraphExplorerNodes,\n Empty: GraphExplorerEmpty,\n Status: GraphExplorerStatus,\n Refresh: GraphExplorerRefresh\n};\nvar GraphExplorerNodePrimitive = {\n Root: GraphExplorerNodeRoot,\n Trigger: GraphExplorerNodeTrigger,\n Expand: GraphExplorerNodeExpand\n};\nexport {\n GraphExplorerNodePrimitive,\n GraphExplorerPrimitive,\n GraphExplorerProvider,\n graphExplorerNodeLabel,\n useGraphExplorerContext,\n useGraphExplorerNode\n};\n//# sourceMappingURL=index.js.map","import { Handle, MarkerType, type Node, type NodeProps, Position } from \"@xyflow/react\";\nimport type { GraphExploreNode, GraphExploreRelationship, GraphExploreResult } from \"@anvia/graph\";\nimport { graphExplorerNodeLabel, GraphExplorerNodePrimitive } from \"@anvia/react-ui/graph-explorer\";\n\nexport type ExplorerNodeData = {\n label: string;\n type: string;\n color: string;\n};\n\nexport type ExplorerFlowNode = Node<ExplorerNodeData, \"graphEntity\">;\n\nexport const explorerNodeTypes = {\n graphEntity: GraphEntityNode,\n};\n\nexport function toExplorerFlow(result: GraphExploreResult, matchedNodeIds: ReadonlySet<string>) {\n const visibleNodes = result.nodes.filter((node) => matchedNodeIds.has(node.id));\n const visibleIds = new Set(visibleNodes.map((node) => node.id));\n const nodes = positionNodes(visibleNodes);\n const edges = result.relationships\n .filter((relationship) => visibleIds.has(relationship.from) && visibleIds.has(relationship.to))\n .map((relationship) => relationshipEdge(relationship));\n return { nodes, edges };\n}\n\nfunction GraphEntityNode(props: NodeProps<ExplorerFlowNode>) {\n return (\n <GraphExplorerNodePrimitive.Root nodeId={props.id} asChild>\n <article\n className={[\n \"relative w-[180px] rounded-xl border bg-card px-3 py-2.5 text-left shadow-sm transition\",\n props.selected ? \"border-foreground shadow-md\" : \"border-border/80\",\n ].join(\" \")}\n >\n <Handle\n type=\"target\"\n position={Position.Top}\n className=\"!size-1.5 !border-0 !bg-muted-foreground/50\"\n />\n <div className=\"flex min-w-0 items-center gap-2.5\">\n <span className={[\"size-2.5 shrink-0 rounded-full\", props.data.color].join(\" \")} />\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-foreground\">{props.data.label}</div>\n <div className=\"mt-0.5 truncate text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {props.data.type}\n </div>\n </div>\n </div>\n <Handle\n type=\"source\"\n position={Position.Bottom}\n className=\"!size-1.5 !border-0 !bg-muted-foreground/50\"\n />\n </article>\n </GraphExplorerNodePrimitive.Root>\n );\n}\n\nfunction positionNodes(nodes: readonly GraphExploreNode[]): ExplorerFlowNode[] {\n return nodes.map((node, index) => {\n const angle = index * 2.399963;\n const radius = 180 * Math.sqrt(index);\n return {\n id: node.id,\n type: \"graphEntity\",\n position: {\n x: Math.cos(angle) * radius,\n y: Math.sin(angle) * radius,\n },\n data: {\n label: graphExplorerNodeLabel(node),\n type: node.type,\n color: nodeTypeColor(node.type),\n },\n };\n });\n}\n\nfunction relationshipEdge(relationship: GraphExploreRelationship) {\n return {\n id: relationship.id,\n source: relationship.from,\n target: relationship.to,\n label: relationship.type,\n type: \"smoothstep\",\n markerEnd: { type: MarkerType.ArrowClosed, width: 14, height: 14 },\n labelStyle: { fontSize: 10, fontWeight: 600 },\n style: { strokeWidth: 1.5 },\n };\n}\n\nfunction nodeTypeColor(type: string): string {\n const colors = [\n \"bg-emerald-500\",\n \"bg-sky-500\",\n \"bg-violet-500\",\n \"bg-amber-500\",\n \"bg-rose-500\",\n \"bg-cyan-500\",\n \"bg-fuchsia-500\",\n ];\n let hash = 0;\n for (const character of type) hash = (hash * 31 + character.charCodeAt(0)) >>> 0;\n return colors[hash % colors.length] ?? \"bg-muted-foreground\";\n}\n","import { Background, BackgroundVariant, Controls, ReactFlow } from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { ArrowClockwise, MagnifyingGlass, Plus } from \"@phosphor-icons/react\";\nimport type {\n GraphExploreNode,\n GraphExploreOptions,\n GraphExploreResult,\n GraphSchemaLike,\n} from \"@anvia/graph\";\nimport { useGraphExplorer } from \"@anvia/react/graph-explorer\";\nimport { graphExplorerNodeLabel, GraphExplorerProvider } from \"@anvia/react-ui/graph-explorer\";\nimport { type CSSProperties, useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { StudioConfig } from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport { Input } from \"../../components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport {\n StudioEmptyState,\n StudioPageShell,\n StudioStatusBadge,\n StudioSurface,\n} from \"../../components/ui/studio\";\nimport { errorMessage } from \"../shared/format\";\nimport { JsonSyntax } from \"../shared/renderers\";\nimport { requestJson } from \"../shared/request\";\nimport { explorerNodeTypes, toExplorerFlow } from \"./graph-flow\";\n\nexport function GraphsPage(props: {\n graphs: StudioConfig[\"graphs\"];\n enabled: boolean;\n theme: \"light\" | \"dark\";\n onError: (message: string) => void;\n onStatus: (message: string) => void;\n}) {\n const { onError, onStatus } = props;\n const [selectedGraphId, setSelectedGraphId] = useState(props.graphs[0]?.id ?? \"\");\n const [selectedNodeTypes, setSelectedNodeTypes] = useState<string[]>([]);\n const [selectedRelationships, setSelectedRelationships] = useState<string[]>([]);\n const graph = props.graphs.find((item) => item.id === selectedGraphId) ?? props.graphs[0];\n const loadGraph = useCallback(\n async (request: GraphExploreOptions<GraphSchemaLike>) => {\n if (graph === undefined) throw new Error(\"Graph explorer unavailable\");\n const { abortSignal, ...body } = request;\n onStatus(\"Loading graph\");\n try {\n const next = await requestJson<GraphExploreResult>(\n `/graphs/${encodeURIComponent(graph.id)}/explore`,\n \"Graph explorer\",\n abortSignal,\n \"no-store\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n if (abortSignal?.aborted !== true) onStatus(\"Connected\");\n return next;\n } catch (loadError) {\n if (abortSignal?.aborted !== true) {\n onError(errorMessage(loadError));\n onStatus(\"Graph error\");\n }\n throw loadError;\n }\n },\n [graph, onError, onStatus],\n );\n const explorer = useGraphExplorer({ explore: loadGraph });\n const result = useMemo<GraphExploreResult>(\n () => ({\n nodes: explorer.nodes,\n relationships: explorer.relationships,\n truncated: explorer.truncated,\n }),\n [explorer.nodes, explorer.relationships, explorer.truncated],\n );\n const flow = useMemo(\n () => toExplorerFlow(result, explorer.matchedNodeIds),\n [explorer.matchedNodeIds, result],\n );\n const loading = explorer.status === \"loading\";\n const selectedNode = explorer.selectedNode;\n const explore = explorer.explore;\n const resetExplorer = explorer.reset;\n const selectNode = explorer.selectNode;\n\n useEffect(() => {\n if (graph === undefined) return;\n const nodeTypes = graph.nodeTypes.map((item) => item.name);\n const relationships = graph.relationshipTypes.map((item) => item.name);\n setSelectedGraphId(graph.id);\n setSelectedNodeTypes(nodeTypes);\n setSelectedRelationships(relationships);\n resetExplorer();\n void explore({ mode: \"overview\", nodeTypes, relationships })\n .then((next) => {\n if (next !== undefined) selectNode(next.nodes[0]?.id);\n })\n .catch(() => undefined);\n }, [explore, graph, resetExplorer, selectNode]);\n\n if (!props.enabled || props.graphs.length === 0) {\n return (\n <StudioPageShell aria-label=\"Graphs\">\n <StudioEmptyState\n title={props.enabled ? \"No graphs\" : \"Graph explorer unavailable\"}\n text={\n props.enabled\n ? \"Register a graph in Studio to inspect its nodes and relationships.\"\n : \"This Studio runtime does not expose a graph explorer.\"\n }\n />\n </StudioPageShell>\n );\n }\n\n function reloadOverview() {\n void explore({\n mode: \"overview\",\n nodeTypes: selectedNodeTypes,\n relationships: selectedRelationships,\n })\n .then((next) => {\n if (next !== undefined) selectNode(next.nodes[0]?.id);\n })\n .catch(() => undefined);\n }\n\n function expandSelected() {\n if (selectedNode === undefined) return;\n void explorer\n .expandNode(selectedNode.id, {\n nodeTypes: selectedNodeTypes,\n relationships: selectedRelationships,\n direction: \"both\",\n maxDepth: 1,\n })\n .catch(() => undefined);\n }\n\n return (\n <GraphExplorerProvider controller={explorer}>\n <StudioPageShell aria-label=\"Graphs\">\n <div className=\"grid min-h-0 min-w-0 pb-6 pr-6\">\n <StudioSurface className=\"grid grid-cols-[minmax(0,2fr)_340px] max-lg:grid-cols-1\">\n <div className=\"relative min-h-0 min-w-0 overflow-hidden border-r border-border/80 bg-card/25 max-lg:min-h-96 max-lg:border-b max-lg:border-r-0\">\n <div className=\"absolute left-4 top-4 z-10 flex max-w-[calc(100%-2rem)] items-center gap-2 rounded-xl border border-border/80 bg-background/90 p-2 shadow-sm backdrop-blur\">\n <div className=\"relative min-w-0 flex-1\">\n <MagnifyingGlass className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n aria-label=\"Search loaded nodes\"\n className=\"w-64 pl-8\"\n placeholder=\"Search loaded nodes\"\n value={explorer.query}\n onChange={(event) => explorer.setQuery(event.currentTarget.value)}\n />\n </div>\n <StudioStatusBadge>{flow.nodes.length} nodes</StudioStatusBadge>\n <StudioStatusBadge>{flow.edges.length} relations</StudioStatusBadge>\n </div>\n {loading && result.nodes.length === 0 ? (\n <div className=\"grid h-full min-h-96 place-items-center text-sm text-muted-foreground\">\n Loading graph…\n </div>\n ) : null}\n {!loading && result.nodes.length === 0 ? (\n <StudioEmptyState\n className=\"h-full border-0\"\n title=\"No nodes found\"\n text=\"Try another graph or broaden the selected node and relationship types.\"\n />\n ) : null}\n {result.nodes.length > 0 ? (\n <ReactFlow\n key={`${graph?.id}:${result.nodes.length}:${result.relationships.length}`}\n nodes={flow.nodes}\n edges={flow.edges}\n className=\"graph-explorer-flow\"\n colorMode={props.theme}\n nodeTypes={explorerNodeTypes}\n fitView\n fitViewOptions={{ padding: 0.2, maxZoom: 1 }}\n minZoom={0.2}\n maxZoom={1.7}\n proOptions={{ hideAttribution: true }}\n defaultEdgeOptions={{ focusable: true }}\n style={\n {\n \"--xy-edge-stroke\": \"var(--muted-foreground)\",\n \"--xy-edge-stroke-width\": \"1.4\",\n \"--xy-edge-stroke-selected\": \"var(--foreground)\",\n } as CSSProperties\n }\n onNodeClick={(_, node) => explorer.selectNode(node.id)}\n >\n <Background\n variant={BackgroundVariant.Dots}\n gap={16}\n size={1.5}\n color=\"var(--muted-foreground)\"\n className=\"opacity-30\"\n />\n <Controls showInteractive={false} />\n </ReactFlow>\n ) : null}\n </div>\n <GraphInspector\n graph={graph}\n graphs={props.graphs}\n loading={loading}\n result={result}\n selectedGraphId={selectedGraphId}\n selectedNode={selectedNode}\n selectedNodeTypes={selectedNodeTypes}\n selectedRelationships={selectedRelationships}\n onExpand={expandSelected}\n onReload={reloadOverview}\n onSelectGraph={setSelectedGraphId}\n onToggleNodeType={(type) => setSelectedNodeTypes((types) => toggled(types, type))}\n onToggleRelationship={(type) =>\n setSelectedRelationships((types) => toggled(types, type))\n }\n />\n </StudioSurface>\n </div>\n </StudioPageShell>\n </GraphExplorerProvider>\n );\n}\n\nfunction GraphInspector(props: {\n graph: StudioConfig[\"graphs\"][number] | undefined;\n graphs: StudioConfig[\"graphs\"];\n loading: boolean;\n result: GraphExploreResult;\n selectedGraphId: string;\n selectedNode: GraphExploreNode | undefined;\n selectedNodeTypes: string[];\n selectedRelationships: string[];\n onExpand: () => void;\n onReload: () => void;\n onSelectGraph: (id: string) => void;\n onToggleNodeType: (type: string) => void;\n onToggleRelationship: (type: string) => void;\n}) {\n const truncated = props.result.truncated.nodes || props.result.truncated.relationships;\n return (\n <aside className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/70\">\n <header className=\"grid gap-3 border-b border-border/80 bg-card/35 p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-base font-semibold\">\n {props.graph?.name ?? \"Graph explorer\"}\n </h1>\n <p className=\"mt-1 line-clamp-2 text-xs leading-5 text-muted-foreground\">\n {props.graph?.description ?? \"Explore a bounded view of nodes and relationships.\"}\n </p>\n </div>\n {truncated ? (\n <StudioStatusBadge title=\"The configured result limit was reached\">\n Limited\n </StudioStatusBadge>\n ) : null}\n </div>\n <Select value={props.selectedGraphId} onValueChange={props.onSelectGraph}>\n <SelectTrigger className=\"h-8 w-full text-xs\">\n <SelectValue placeholder=\"Select graph\" />\n </SelectTrigger>\n <SelectContent>\n {props.graphs.map((graph) => (\n <SelectItem key={graph.id} value={graph.id}>\n {graph.name ?? graph.id}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <div className=\"flex gap-2\">\n <Button\n className=\"flex-1\"\n variant=\"secondary\"\n disabled={props.loading || props.selectedNodeTypes.length === 0}\n onClick={props.onReload}\n >\n <ArrowClockwise /> Refresh\n </Button>\n <Button\n className=\"flex-1\"\n disabled={props.loading || props.selectedNode === undefined}\n onClick={props.onExpand}\n >\n <Plus /> Expand\n </Button>\n </div>\n </header>\n <div className=\"min-h-0 overflow-y-auto p-4\">\n <FilterGroup\n label=\"Node types\"\n items={props.graph?.nodeTypes.map((item) => item.name) ?? []}\n selected={props.selectedNodeTypes}\n onToggle={props.onToggleNodeType}\n />\n <FilterGroup\n label=\"Relationships\"\n items={props.graph?.relationshipTypes.map((item) => item.name) ?? []}\n selected={props.selectedRelationships}\n onToggle={props.onToggleRelationship}\n />\n <div className=\"mt-5 border-t border-border/80 pt-4\">\n {props.selectedNode === undefined ? (\n <p className=\"text-sm text-muted-foreground\">\n Select a node to inspect its properties.\n </p>\n ) : (\n <NodeInspector node={props.selectedNode} />\n )}\n </div>\n </div>\n </aside>\n );\n}\n\nfunction FilterGroup(props: {\n label: string;\n items: string[];\n selected: string[];\n onToggle: (value: string) => void;\n}) {\n return (\n <section className=\"mb-4\">\n <h2 className=\"mb-2 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.label}\n </h2>\n <div className=\"flex flex-wrap gap-1.5\">\n {props.items.map((item) => {\n const active = props.selected.includes(item);\n return (\n <button\n key={item}\n type=\"button\"\n aria-pressed={active}\n className={[\n \"rounded-full border px-2 py-1 text-xs transition-colors\",\n active\n ? \"border-foreground/30 bg-foreground text-background\"\n : \"border-border bg-card text-muted-foreground hover:text-foreground\",\n ].join(\" \")}\n onClick={() => props.onToggle(item)}\n >\n {item}\n </button>\n );\n })}\n </div>\n </section>\n );\n}\n\nfunction NodeInspector(props: { node: GraphExploreNode }) {\n const json = JSON.stringify(\n { identity: props.node.identity, properties: props.node.properties },\n null,\n 2,\n );\n return (\n <section>\n <StudioStatusBadge>{props.node.type}</StudioStatusBadge>\n <h2 className=\"mt-2 break-words text-base font-semibold\">\n {graphExplorerNodeLabel(props.node)}\n </h2>\n <p className=\"mt-1 break-all text-xs text-muted-foreground\">ID {props.node.id}</p>\n <pre className=\"mt-4 overflow-x-auto rounded-xl border border-border/80 bg-card p-3 text-xs leading-5\">\n <code>\n <JsonSyntax text={json} />\n </code>\n </pre>\n </section>\n );\n}\n\nfunction toggled(values: string[], value: string): string[] {\n if (values.includes(value)) return values.filter((item) => item !== value);\n return [...values, value];\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}