@anvia/studio 0.7.54 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/ArrowClockwise.es-CSN-gjxO.js +2 -0
- package/dist/ui/assets/ArrowClockwise.es-CSN-gjxO.js.map +1 -0
- package/dist/ui/assets/agents-page-CkNSbqAj.js +2 -0
- package/dist/ui/assets/agents-page-CkNSbqAj.js.map +1 -0
- package/dist/ui/assets/badge-RJJoRC4P.js +2 -0
- package/dist/ui/assets/badge-RJJoRC4P.js.map +1 -0
- package/dist/ui/assets/{chunk-ADH7NNCS-B-yOk_VP.js → chunk-ADH7NNCS-DM6fsnDI.js} +1 -1
- package/dist/ui/assets/{chunk-ADH7NNCS-B-yOk_VP.js.map → chunk-ADH7NNCS-DM6fsnDI.js.map} +1 -1
- package/dist/ui/assets/favicon.svg +7 -0
- package/dist/ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/ui/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- package/dist/ui/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- package/dist/ui/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- package/dist/ui/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/ui/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- package/dist/ui/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- package/dist/ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/ui/assets/index-Bh7RLPBw.js +56 -0
- package/dist/ui/assets/index-Bh7RLPBw.js.map +1 -0
- package/dist/ui/assets/index-D-CbFx6c.css +1 -0
- package/dist/ui/assets/input-BOUv3rgO.js +2 -0
- package/dist/ui/assets/input-BOUv3rgO.js.map +1 -0
- package/dist/ui/assets/knowledge-page-Cot_uYcE.js +2 -0
- package/dist/ui/assets/knowledge-page-Cot_uYcE.js.map +1 -0
- package/dist/ui/assets/mcps-page-BSO6ork4.js +2 -0
- package/dist/ui/assets/mcps-page-BSO6ork4.js.map +1 -0
- package/dist/ui/assets/memory-page-CG84G--r.js +4 -0
- package/dist/ui/assets/memory-page-CG84G--r.js.map +1 -0
- package/dist/ui/assets/pipelines-page-Hbf5ffUH.js +8 -0
- package/dist/ui/assets/pipelines-page-Hbf5ffUH.js.map +1 -0
- package/dist/ui/assets/{renderers-B3IhuxP9.js → renderers-B8gvjR2u.js} +3 -3
- package/dist/ui/assets/{renderers-B3IhuxP9.js.map → renderers-B8gvjR2u.js.map} +1 -1
- package/dist/ui/assets/sandboxes-page-D910dyFO.js +2 -0
- package/dist/ui/assets/sandboxes-page-D910dyFO.js.map +1 -0
- package/dist/ui/assets/sessions-page-CSN2vSKZ.js +2 -0
- package/dist/ui/assets/sessions-page-CSN2vSKZ.js.map +1 -0
- package/dist/ui/assets/status-page-CgRNt0wi.js +2 -0
- package/dist/ui/assets/status-page-CgRNt0wi.js.map +1 -0
- package/dist/ui/assets/tool-runner-BZN-PZJU.js +2 -0
- package/dist/ui/assets/tool-runner-BZN-PZJU.js.map +1 -0
- package/dist/ui/assets/tools-page-DRv7aklU.js +2 -0
- package/dist/ui/assets/tools-page-DRv7aklU.js.map +1 -0
- package/dist/ui/assets/trace-browser-B07coNNE.js +10 -0
- package/dist/ui/assets/trace-browser-B07coNNE.js.map +1 -0
- package/dist/ui/assets/transcript-item-ZNkQEaCw.js +3 -0
- package/dist/ui/assets/transcript-item-ZNkQEaCw.js.map +1 -0
- package/dist/ui/index.html +17 -6
- package/package.json +6 -5
- package/dist/ui/assets/agents-page-Bbbg-x2R.js +0 -2
- package/dist/ui/assets/agents-page-Bbbg-x2R.js.map +0 -1
- package/dist/ui/assets/badge-D7D2A73-.js +0 -2
- package/dist/ui/assets/badge-D7D2A73-.js.map +0 -1
- package/dist/ui/assets/evals-page-qETOz5hz.js +0 -2
- package/dist/ui/assets/evals-page-qETOz5hz.js.map +0 -1
- package/dist/ui/assets/format-D43vTqrO.js +0 -2
- package/dist/ui/assets/format-D43vTqrO.js.map +0 -1
- package/dist/ui/assets/index-CQhv4Ee3.js +0 -56
- package/dist/ui/assets/index-CQhv4Ee3.js.map +0 -1
- package/dist/ui/assets/index-CzSafghW.css +0 -1
- package/dist/ui/assets/knowledge-page-Zl9WuYXr.js +0 -2
- package/dist/ui/assets/knowledge-page-Zl9WuYXr.js.map +0 -1
- package/dist/ui/assets/mcps-page-dx-N6xMI.js +0 -2
- package/dist/ui/assets/mcps-page-dx-N6xMI.js.map +0 -1
- package/dist/ui/assets/memory-page-De0f9jEy.js +0 -4
- package/dist/ui/assets/memory-page-De0f9jEy.js.map +0 -1
- package/dist/ui/assets/pipelines-page-DKwpA_KG.js +0 -8
- package/dist/ui/assets/pipelines-page-DKwpA_KG.js.map +0 -1
- package/dist/ui/assets/sandboxes-page-CRLiE4bv.js +0 -2
- package/dist/ui/assets/sandboxes-page-CRLiE4bv.js.map +0 -1
- package/dist/ui/assets/sessions-page-CgXxbgEX.js +0 -2
- package/dist/ui/assets/sessions-page-CgXxbgEX.js.map +0 -1
- package/dist/ui/assets/status-page-BPANk1WS.js +0 -2
- package/dist/ui/assets/status-page-BPANk1WS.js.map +0 -1
- package/dist/ui/assets/tool-runner-DdnPk1NY.js +0 -2
- package/dist/ui/assets/tool-runner-DdnPk1NY.js.map +0 -1
- package/dist/ui/assets/tools-page-DnCMxRrP.js +0 -2
- package/dist/ui/assets/tools-page-DnCMxRrP.js.map +0 -1
- package/dist/ui/assets/trace-browser-C4ZQweab.js +0 -10
- package/dist/ui/assets/trace-browser-C4ZQweab.js.map +0 -1
- package/dist/ui/assets/transcript-item-B7FFJ52t.js +0 -3
- package/dist/ui/assets/transcript-item-B7FFJ52t.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,r as t,s as n,t as r}from"./utils-C9GMruoG.js";import{t as i}from"./ArrowClockwise.es-CSN-gjxO.js";import{F as a,K as o,S as s,W as c,X as ee,a as l,c as u,i as d,n as f,o as p,s as m}from"./index-Bh7RLPBw.js";var h=n(e(),1),g=new Map([[`bold`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M228,144v64a12,12,0,0,1-12,12H40a12,12,0,0,1-12-12V144a12,12,0,0,1,24,0v52H204V144a12,12,0,0,1,24,0Zm-108.49,8.49a12,12,0,0,0,17,0l40-40a12,12,0,0,0-17-17L140,115V32a12,12,0,0,0-24,0v83L96.49,95.51a12,12,0,0,0-17,17Z`}))],[`duotone`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M216,48V208H40V48A16,16,0,0,1,56,32H200A16,16,0,0,1,216,48Z`,opacity:`0.2`}),h.createElement(`path`,{d:`M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z`}))],[`fill`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40A8,8,0,0,0,168,96H136V32a8,8,0,0,0-16,0V96H88a8,8,0,0,0-5.66,13.66Z`}))],[`light`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M222,144v64a6,6,0,0,1-6,6H40a6,6,0,0,1-6-6V144a6,6,0,0,1,12,0v58H210V144a6,6,0,0,1,12,0Zm-98.24,4.24a6,6,0,0,0,8.48,0l40-40a6,6,0,0,0-8.48-8.48L134,129.51V32a6,6,0,0,0-12,0v97.51L92.24,99.76a6,6,0,0,0-8.48,8.48Z`}))],[`regular`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z`}))],[`thin`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M220,144v64a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V144a4,4,0,0,1,8,0v60H212V144a4,4,0,0,1,8,0Zm-94.83,2.83a4,4,0,0,0,5.66,0l40-40a4,4,0,1,0-5.66-5.66L132,134.34V32a4,4,0,0,0-8,0V134.34L90.83,101.17a4,4,0,0,0-5.66,5.66Z`}))]]),_=new Map([[`bold`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Z`}))],[`duotone`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M208,88H152V32Z`,opacity:`0.2`}),h.createElement(`path`,{d:`M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z`}))],[`fill`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM152,88V44l44,44Z`}))],[`light`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Z`}))],[`regular`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z`}))],[`thin`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Z`}))]]),v=new Map([[`bold`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M248.23,112.31A20,20,0,0,0,232,104H220V88a20,20,0,0,0-20-20H132L105.34,48a20.12,20.12,0,0,0-12-4H40A20,20,0,0,0,20,64V208a12,12,0,0,0,12,12H211.1a12,12,0,0,0,11.33-8l28.49-81.47.06-.17A20,20,0,0,0,248.23,112.31ZM92,68l28.8,21.6A12,12,0,0,0,128,92h68v12H69.77a20,20,0,0,0-18.94,13.58L44,137.15V68ZM202.59,196H48.89l23.72-68H226.37Z`}))],[`duotone`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M208,88v24H69.77a8,8,0,0,0-7.59,5.47L32,208V64a8,8,0,0,1,8-8H93.33a8,8,0,0,1,4.8,1.6L128,80h72A8,8,0,0,1,208,88Z`,opacity:`0.2`}),h.createElement(`path`,{d:`M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Zm112,136H43.1l26.67-80H232Z`}))],[`fill`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208h0a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Z`}))],[`light`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M243.36,111.81A14,14,0,0,0,232,106H214V88a14,14,0,0,0-14-14H130L101.74,52.8a14.06,14.06,0,0,0-8.4-2.8H40A14,14,0,0,0,26,64V208a6,6,0,0,0,6,6H211.1a6,6,0,0,0,5.69-4.1l28.49-85.47A14,14,0,0,0,243.36,111.81ZM40,62H93.34a2,2,0,0,1,1.2.4L124.4,84.8A6,6,0,0,0,128,86h72a2,2,0,0,1,2,2v18H69.77a14,14,0,0,0-13.28,9.57L38,171V64A2,2,0,0,1,40,62Zm193.9,58.63L206.78,202H40.33l27.54-82.63a2,2,0,0,1,1.9-1.37H232a2,2,0,0,1,1.9,2.63Z`}))],[`regular`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208h0a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Zm112,136H43.1l26.67-80H232Z`}))],[`thin`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M241.72,113a11.88,11.88,0,0,0-9.73-5H212V88a12,12,0,0,0-12-12H129.33l-28.8-21.6a12.05,12.05,0,0,0-7.2-2.4H40A12,12,0,0,0,28,64V208a4,4,0,0,0,4,4H211.09a4,4,0,0,0,3.79-2.74l28.49-85.47A11.86,11.86,0,0,0,241.72,113ZM40,60H93.33a4,4,0,0,1,2.4.8L125.6,83.2a4,4,0,0,0,2.4.8h72a4,4,0,0,1,4,4v20H69.76a12,12,0,0,0-11.38,8.21L36,183.35V64A4,4,0,0,1,40,60Zm195.78,61.26L208.2,204H37.55L66,118.74A4,4,0,0,1,69.76,116H232a4,4,0,0,1,3.79,5.26Z`}))]]),y=new Map([[`bold`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M72.5,150.63,100.79,128,72.5,105.37a12,12,0,1,1,15-18.74l40,32a12,12,0,0,1,0,18.74l-40,32a12,12,0,0,1-15-18.74ZM144,172h32a12,12,0,0,0,0-24H144a12,12,0,0,0,0,24ZM236,56V200a20,20,0,0,1-20,20H40a20,20,0,0,1-20-20V56A20,20,0,0,1,40,36H216A20,20,0,0,1,236,56Zm-24,4H44V196H212Z`}))],[`duotone`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M224,56V200a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z`,opacity:`0.2`}),h.createElement(`path`,{d:`M128,128a8,8,0,0,1-3,6.25l-40,32a8,8,0,1,1-10-12.5L107.19,128,75,102.25a8,8,0,1,1,10-12.5l40,32A8,8,0,0,1,128,128Zm48,24H136a8,8,0,0,0,0,16h40a8,8,0,0,0,0-16Zm56-96V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56ZM216,200V56H40V200H216Z`}))],[`fill`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm-91,94.25-40,32a8,8,0,1,1-10-12.5L107.19,128,75,102.25a8,8,0,1,1,10-12.5l40,32a8,8,0,0,1,0,12.5ZM176,168H136a8,8,0,0,1,0-16h40a8,8,0,0,1,0,16Z`}))],[`light`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M126,128a6,6,0,0,1-2.25,4.69l-40,32a6,6,0,0,1-7.5-9.38L110.4,128,76.25,100.69a6,6,0,1,1,7.5-9.38l40,32A6,6,0,0,1,126,128Zm50,26H136a6,6,0,0,0,0,12h40a6,6,0,0,0,0-12Zm54-98V200a14,14,0,0,1-14,14H40a14,14,0,0,1-14-14V56A14,14,0,0,1,40,42H216A14,14,0,0,1,230,56Zm-12,0a2,2,0,0,0-2-2H40a2,2,0,0,0-2,2V200a2,2,0,0,0,2,2H216a2,2,0,0,0,2-2Z`}))],[`regular`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M128,128a8,8,0,0,1-3,6.25l-40,32a8,8,0,1,1-10-12.5L107.19,128,75,102.25a8,8,0,1,1,10-12.5l40,32A8,8,0,0,1,128,128Zm48,24H136a8,8,0,0,0,0,16h40a8,8,0,0,0,0-16Zm56-96V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56ZM216,200V56H40V200H216Z`}))],[`thin`,h.createElement(h.Fragment,null,h.createElement(`path`,{d:`M122.5,124.88a4,4,0,0,1,0,6.24l-40,32a4,4,0,0,1-5-6.24L113.6,128,77.5,99.12a4,4,0,0,1,5-6.24ZM176,156H136a4,4,0,0,0,0,8h40a4,4,0,0,0,0-8ZM228,56V200a12,12,0,0,1-12,12H40a12,12,0,0,1-12-12V56A12,12,0,0,1,40,44H216A12,12,0,0,1,228,56Zm-8,0a4,4,0,0,0-4-4H40a4,4,0,0,0-4,4V200a4,4,0,0,0,4,4H216a4,4,0,0,0,4-4Z`}))]]),b=h.forwardRef((e,t)=>h.createElement(c,{ref:t,...e,weights:g}));b.displayName=`DownloadSimpleIcon`;var x=b,S=h.forwardRef((e,t)=>h.createElement(c,{ref:t,...e,weights:_}));S.displayName=`FileIcon`;var C=S,w=h.forwardRef((e,t)=>h.createElement(c,{ref:t,...e,weights:v}));w.displayName=`FolderOpenIcon`;var T=w,E=h.forwardRef((e,t)=>h.createElement(c,{ref:t,...e,weights:y}));E.displayName=`TerminalWindowIcon`;var D=E,O=t(),k=1024*1024,A=new Set(`css.csv.env.gitignore.graphql.html.ini.java.js.json.jsx.log.md.mdx.mjs.py.rb.rs.sh.sql.svg.toml.ts.tsx.txt.xml.yaml.yml`.split(`.`)),j=new Map([[`gif`,`image/gif`],[`jpeg`,`image/jpeg`],[`jpg`,`image/jpeg`],[`png`,`image/png`],[`webp`,`image/webp`]]);function M(e){let[t,n]=(0,h.useState)([]),[r,c]=(0,h.useState)(`idle`),[u,m]=(0,h.useState)(0),[g,_]=(0,h.useState)(`.`),[v,y]=(0,h.useState)([]),[b,x]=(0,h.useState)(`idle`),[S,C]=(0,h.useState)(),[w,T]=(0,h.useState)([]),[E,D]=(0,h.useState)([]),[M,P]=(0,h.useState)(`idle`),[I,R]=(0,h.useState)(``),[z,B]=(0,h.useState)(),[H,G]=(0,h.useState)(``),K=(0,h.useRef)(void 0),q=e.initialSandboxRef??t[0]?.ref??``,J=t.find(e=>e.ref===q),Y=J?.ref,X=J?.capabilities.ports??!1,Z=J?.capabilities.processes??!1,Q=(0,h.useCallback)(t=>{let n=ee(t);G(n),e.onError(n)},[e.onError]);(0,h.useEffect)(()=>{if(!e.enabled){n([]);return}let t=new AbortController;return c(`loading`),G(``),V(`/sandboxes`,`Sandboxes`,t.signal,u===0?`default`:`reload`).then(e=>n(e.sandboxes)).catch(e=>{t.signal.aborted||Q(e)}).finally(()=>{t.signal.aborted||c(`idle`)}),()=>t.abort()},[e.enabled,u,Q]),(0,h.useEffect)(()=>{e.initialSandboxRef===void 0&&t[0]!==void 0&&e.onSelectSandbox(t[0].ref)},[e.initialSandboxRef,e.onSelectSandbox,t]),(0,h.useEffect)(()=>(_(`.`),y([]),C(void 0),T([]),D([]),R(``),B(void 0),()=>K.current?.abort()),[q]),(0,h.useEffect)(()=>{if(Y===void 0)return;let e=new AbortController;x(`loading`);let t=new URLSearchParams({path:g});return V(`/sandboxes/${encodeURIComponent(Y)}/files?${t}`,`Sandbox files`,e.signal,u===0?`default`:`reload`).then(e=>y(e.entries)).catch(t=>{e.signal.aborted||(y([]),Q(t))}).finally(()=>{e.signal.aborted||x(`idle`)}),()=>e.abort()},[g,u,Q,Y]),(0,h.useEffect)(()=>{if(Y===void 0)return;let e=new AbortController;P(`loading`);let t=`/sandboxes/${encodeURIComponent(Y)}`,n=[];return X?n.push(V(`${t}/ports`,`Sandbox ports`,e.signal,u===0?`default`:`reload`).then(e=>T(e.ports))):T([]),Z?n.push(V(`${t}/processes`,`Sandbox processes`,e.signal,u===0?`default`:`reload`).then(e=>{D(e.processes),R(t=>e.processes.some(e=>e.id===t)?t:``)})):(D([]),R(``)),Promise.all(n).catch(t=>{e.signal.aborted||Q(t)}).finally(()=>{e.signal.aborted||P(`idle`)}),()=>e.abort()},[u,Q,Y,X,Z]),(0,h.useEffect)(()=>{if(Y===void 0||I.length===0){B(void 0);return}let e=new AbortController;return V(`${`/sandboxes/${encodeURIComponent(Y)}/processes`}/${encodeURIComponent(I)}/logs`,`Process logs`,e.signal,u===0?`default`:`reload`).then(B).catch(t=>{e.signal.aborted||Q(t)}),()=>e.abort()},[u,Q,I,Y]),(0,h.useEffect)(()=>()=>{S?.kind===`image`&&URL.revokeObjectURL(S.url)},[S]);let $=(0,h.useCallback)(()=>{K.current?.abort(),K.current=void 0,C(void 0)},[]),re=(0,h.useCallback)(async e=>{if(K.current?.abort(),K.current=void 0,Y===void 0)return;if((e.size??0)>k){C({kind:`large`,file:e});return}let t=W(e.path),n=j.get(t);if(!A.has(t)&&n===void 0){C({kind:`binary`,file:e});return}C({kind:`loading`,file:e}),G(``);let r=new AbortController;K.current=r;try{let t=await fetch(U(Y,e.path),{signal:r.signal});if(!t.ok)throw Error(await o(t,`Sandbox file`));let i=await t.arrayBuffer();if(i.byteLength>k){C({kind:`large`,file:e});return}if(n!==void 0){C({kind:`image`,file:e,url:URL.createObjectURL(new Blob([i],{type:n}))});return}try{C({kind:`text`,file:e,text:new TextDecoder(`utf-8`,{fatal:!0}).decode(i)})}catch{C({kind:`binary`,file:e})}}catch(t){if(r.signal.aborted)return;Q(t),C({kind:`binary`,file:e})}finally{K.current===r&&(K.current=void 0)}},[Q,Y]);return e.enabled?(0,O.jsxs)(p,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":`Sandboxes`,children:[(0,O.jsx)(l,{title:`Sandboxes`,description:`Read-only files, published ports, and managed processes discovered from agent tools.`,action:(0,O.jsxs)(a,{disabled:r===`loading`,size:`sm`,type:`button`,variant:`secondary`,onClick:()=>m(e=>e+1),children:[(0,O.jsx)(s,{icon:i,"aria-hidden":`true`}),`Refresh`]})}),(0,O.jsx)(d,{className:`grid grid-rows-[minmax(0,1fr)] overflow-hidden`,children:t.length===0?(0,O.jsx)(f,{className:`h-full`,title:r===`loading`?`Loading sandboxes`:`No live sandboxes detected`,text:r===`loading`?`Reading live sandbox workspaces.`:`Studio discovers sessions automatically from tools returned by createSandboxTools(session).`}):(0,O.jsxs)(`div`,{className:`grid min-h-0 min-w-0 grid-cols-[250px_minmax(300px,0.8fr)_minmax(400px,1.2fr)] gap-3 overflow-hidden`,children:[(0,O.jsx)(N,{sandboxes:t,selectedRef:q,onSelect:e.onSelectSandbox}),(0,O.jsx)(te,{currentPath:g,files:v,loading:b===`loading`,onOpenDirectory:e=>{$(),_(e)},onOpenFile:e=>void re(e),onSelectPath:e=>{$(),_(e)}}),(0,O.jsx)(`div`,{className:`grid min-h-0 gap-3 overflow-y-auto pr-1`,children:J===void 0?(0,O.jsx)(f,{title:`Sandbox unavailable`,text:`The requested live sandbox is not registered by this Studio runtime.`}):(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(ne,{sandbox:J,error:H}),(0,O.jsx)(F,{preview:S,sandboxRef:J.ref}),(0,O.jsx)(L,{loading:M===`loading`,logs:z,ports:w,processes:E,selectedProcessId:I,supportsPorts:J.capabilities.ports,supportsProcesses:J.capabilities.processes,onSelectProcess:R})]})})]})})]}):(0,O.jsxs)(p,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":`Sandboxes`,children:[(0,O.jsx)(l,{title:`Sandboxes`,description:`Read-only files, published ports, and managed processes discovered from agent tools.`}),(0,O.jsx)(d,{className:`overflow-auto`,children:(0,O.jsx)(f,{title:`No sandbox workspaces`,text:`Add tools created by createSandboxTools(session) to an agent to inspect its live workspace here.`})})]})}function N(e){return(0,O.jsxs)(u,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)]`,children:[(0,O.jsxs)(`div`,{className:`border-b border-border/70 px-4 py-3`,children:[(0,O.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Workspaces`}),(0,O.jsxs)(`p`,{className:`m-0 mt-1 text-xs text-muted-foreground`,children:[e.sandboxes.length,` live `,e.sandboxes.length===1?`session`:`sessions`]})]}),(0,O.jsx)(`div`,{className:`min-h-0 overflow-y-auto p-2`,children:e.sandboxes.map(t=>(0,O.jsxs)(a,{className:r(`mb-1 grid h-auto min-h-16 w-full justify-stretch gap-1 rounded-lg px-3 py-2.5 text-left`,t.ref===e.selectedRef&&`border-border bg-accent text-foreground`),type:`button`,variant:`ghost`,onClick:()=>e.onSelect(t.ref),children:[(0,O.jsxs)(`span`,{className:`flex min-w-0 items-center justify-between gap-2`,children:[(0,O.jsx)(`strong`,{className:`truncate text-sm font-semibold text-foreground`,children:t.id}),(0,O.jsx)(m,{className:`shrink-0 px-1.5 py-0.5 text-[10px]`,children:t.provider})]}),(0,O.jsx)(`span`,{className:`truncate font-mono text-[11px] font-normal text-muted-foreground`,children:t.workdir})]},t.ref))})]})}function te(e){let t=(0,h.useMemo)(()=>H(e.currentPath),[e.currentPath]);return(0,O.jsxs)(u,{className:`grid min-h-0 grid-rows-[auto_auto_minmax(0,1fr)]`,children:[(0,O.jsxs)(`div`,{className:`border-b border-border/70 px-4 py-3`,children:[(0,O.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Files`}),(0,O.jsx)(`p`,{className:`m-0 mt-1 text-xs text-muted-foreground`,children:`One level at a time`})]}),(0,O.jsx)(`div`,{className:`flex min-h-10 items-center gap-1 overflow-x-auto border-b border-border/70 px-3 py-1.5`,children:t.map((t,n)=>(0,O.jsxs)(`span`,{className:`flex items-center gap-1`,children:[n>0?(0,O.jsx)(`span`,{className:`text-muted-foreground/60`,children:`/`}):null,(0,O.jsx)(a,{className:`h-7 min-h-7 px-2 font-mono text-xs`,size:`sm`,type:`button`,variant:`ghost`,onClick:()=>e.onSelectPath(t.path),children:t.label})]},t.path))}),(0,O.jsxs)(`div`,{className:`min-h-0 overflow-y-auto p-2`,children:[e.loading?(0,O.jsx)(f,{size:`compact`,title:`Loading workspace`,text:`Reading files from the selected sandbox.`}):null,!e.loading&&e.files.length===0?(0,O.jsx)(f,{size:`compact`,title:`Empty directory`,text:`This directory does not contain any files.`}):null,e.files.map(t=>(0,O.jsxs)(a,{className:`mb-0.5 grid h-10 min-h-10 w-full grid-cols-[18px_minmax(0,1fr)_auto] justify-stretch gap-2 rounded-md px-2.5 text-left text-xs font-medium`,type:`button`,variant:`ghost`,onClick:()=>t.type===`directory`?e.onOpenDirectory(t.path):e.onOpenFile(t),children:[(0,O.jsx)(s,{className:`text-muted-foreground`,icon:t.type===`directory`?T:C,"aria-hidden":`true`}),(0,O.jsx)(`span`,{className:`truncate text-foreground`,children:G(t.path)}),(0,O.jsx)(`span`,{className:`font-mono text-[10px] font-normal text-muted-foreground`,children:t.type===`file`?K(t.size):t.type})]},t.path))]})]})}function ne(e){return(0,O.jsxs)(u,{className:`p-4`,children:[(0,O.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,O.jsxs)(`div`,{className:`min-w-0`,children:[(0,O.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Active sandbox`}),(0,O.jsx)(`h2`,{className:`m-0 mt-1 truncate text-lg font-semibold text-foreground`,children:e.sandbox.id}),(0,O.jsx)(`p`,{className:`m-0 mt-1 truncate font-mono text-xs text-muted-foreground`,children:e.sandbox.workdir})]}),(0,O.jsx)(m,{children:e.sandbox.provider})]}),(0,O.jsxs)(`div`,{className:`mt-4 grid grid-cols-2 gap-3 text-xs`,children:[(0,O.jsx)(P,{label:`Agents`,values:e.sandbox.agentIds}),(0,O.jsx)(P,{label:`Sandbox tools`,values:e.sandbox.toolNames})]}),e.error.length>0?(0,O.jsx)(`p`,{className:`m-0 mt-3 rounded-lg border border-destructive/25 bg-destructive/5 px-3 py-2 text-xs leading-5 text-destructive`,children:e.error}):null]})}function P(e){return(0,O.jsxs)(`div`,{className:`rounded-lg border border-border/70 bg-background/45 p-3`,children:[(0,O.jsx)(`span`,{className:`font-semibold uppercase tracking-[0.12em] text-muted-foreground`,children:e.label}),(0,O.jsx)(`p`,{className:`m-0 mt-1 break-words font-mono leading-5 text-foreground`,children:e.values.join(`, `)||`-`})]})}function F(e){let t=e.preview?.file;return(0,O.jsxs)(u,{className:`grid min-h-64 grid-rows-[auto_minmax(0,1fr)]`,children:[(0,O.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 border-b border-border/70 px-4 py-2`,children:[(0,O.jsxs)(`div`,{className:`min-w-0`,children:[(0,O.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Preview`}),(0,O.jsx)(`p`,{className:`m-0 mt-0.5 truncate font-mono text-[11px] text-muted-foreground`,children:t?.path??`Select a file`})]}),t===void 0?null:(0,O.jsx)(a,{asChild:!0,size:`sm`,variant:`secondary`,children:(0,O.jsxs)(`a`,{href:U(e.sandboxRef,t.path,!0),children:[(0,O.jsx)(s,{icon:x,"aria-hidden":`true`}),`Download`]})})]}),(0,O.jsxs)(`div`,{className:`grid min-h-0 place-items-center overflow-auto`,children:[e.preview===void 0?(0,O.jsx)(f,{className:`h-full rounded-none`,size:`compact`,title:`No file selected`,text:`Choose a regular file to inspect its contents.`}):null,e.preview?.kind===`loading`?(0,O.jsx)(f,{className:`h-full rounded-none`,size:`compact`,title:`Loading preview`,text:`Reading the selected file.`}):null,e.preview?.kind===`text`?(0,O.jsx)(`pre`,{className:`m-0 h-full min-h-48 w-full overflow-auto whitespace-pre-wrap break-words rounded-lg border border-border/70 bg-card/60 p-4 font-mono text-xs leading-5 text-foreground`,children:e.preview.text}):null,e.preview?.kind===`image`?(0,O.jsx)(`img`,{className:`max-h-96 max-w-full rounded-lg border border-border/70 object-contain`,src:e.preview.url,alt:G(e.preview.file.path)}):null,e.preview?.kind===`binary`?(0,O.jsx)(I,{text:`This file type is download-only and will not be rendered in Studio.`}):null,e.preview?.kind===`large`?(0,O.jsx)(I,{text:`This file is larger than the 1 MiB inline preview limit.`}):null]})]})}function I(e){return(0,O.jsxs)(`div`,{className:`grid max-w-sm justify-items-center gap-2 text-center`,children:[(0,O.jsx)(s,{className:`h-6 w-6 text-muted-foreground`,icon:C,"aria-hidden":`true`}),(0,O.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:e.text})]})}function L(e){return(0,O.jsxs)(u,{className:`p-4`,children:[(0,O.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,O.jsxs)(`div`,{children:[(0,O.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Runtime`}),(0,O.jsx)(`p`,{className:`m-0 mt-1 text-xs text-muted-foreground`,children:`Published ports and managed processes`})]}),e.loading?(0,O.jsx)(m,{children:`Refreshing`}):null]}),(0,O.jsxs)(`div`,{className:`mt-4 grid gap-4`,children:[(0,O.jsx)(R,{title:`Ports`,children:e.supportsPorts?e.ports.length===0?(0,O.jsx)(z,{text:`No ports are published.`}):(0,O.jsx)(`div`,{className:`grid gap-1`,children:e.ports.map(e=>(0,O.jsxs)(`div`,{className:`grid grid-cols-[90px_minmax(0,1fr)] gap-3 rounded-md border border-border/60 px-3 py-2 font-mono text-xs`,children:[(0,O.jsxs)(`span`,{className:`text-foreground`,children:[e.containerPort,`/`,e.protocol]}),(0,O.jsxs)(`span`,{className:`truncate text-muted-foreground`,children:[e.host,`:`,e.hostPort]})]},`${e.containerPort}:${e.hostPort}`))}):(0,O.jsx)(z,{text:`Published ports are not supported by this sandbox.`})}),(0,O.jsx)(R,{title:`Processes`,children:e.supportsProcesses?e.processes.length===0?(0,O.jsx)(z,{text:`No managed processes are recorded.`}):(0,O.jsx)(`div`,{className:`grid gap-1`,children:e.processes.map(t=>(0,O.jsxs)(a,{className:r(`grid h-auto min-h-11 w-full grid-cols-[minmax(0,1fr)_auto] justify-stretch gap-3 rounded-md px-3 py-2 text-left`,t.id===e.selectedProcessId&&`border-border bg-accent text-foreground`),type:`button`,variant:`ghost`,onClick:()=>e.onSelectProcess(t.id),children:[(0,O.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,O.jsx)(s,{className:`text-muted-foreground`,icon:D,"aria-hidden":`true`}),(0,O.jsx)(`span`,{className:`truncate font-mono text-xs text-foreground`,children:[t.command,...t.args].join(` `)})]}),(0,O.jsx)(m,{className:`px-1.5 py-0.5 text-[10px]`,children:t.status})]},t.id))}):(0,O.jsx)(z,{text:`Managed processes are not supported by this sandbox.`})}),e.selectedProcessId.length>0?(0,O.jsx)(R,{title:`Process logs`,children:e.logs===void 0?(0,O.jsx)(z,{text:`Loading the latest bounded output.`}):(0,O.jsxs)(`div`,{className:`grid gap-2`,children:[(0,O.jsx)(B,{label:`stdout`,text:e.logs.stdout,truncated:e.logs.stdoutTruncated}),(0,O.jsx)(B,{label:`stderr`,text:e.logs.stderr,truncated:e.logs.stderrTruncated})]})}):null]})]})}function R(e){return(0,O.jsxs)(`section`,{className:`grid gap-2`,children:[(0,O.jsx)(`h3`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.title}),e.children]})}function z(e){return(0,O.jsx)(`p`,{className:`m-0 rounded-md border border-dashed border-border/70 px-3 py-2 text-xs leading-5 text-muted-foreground`,children:e.text})}function B(e){return(0,O.jsxs)(`div`,{className:`overflow-hidden rounded-md border border-border/70 bg-background/55`,children:[(0,O.jsxs)(`div`,{className:`flex items-center justify-between border-b border-border/60 px-3 py-1.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:[(0,O.jsx)(`span`,{children:e.label}),e.truncated?(0,O.jsx)(`span`,{children:`truncated`}):null]}),(0,O.jsx)(`pre`,{className:`m-0 max-h-48 overflow-auto whitespace-pre-wrap break-words p-3 font-mono text-[11px] leading-5 text-foreground`,children:e.text||`No output`})]})}async function V(e,t,n,r=`default`){let i=await fetch(e,{cache:r,signal:n});if(!i.ok)throw Error(await o(i,t));return await i.json()}function H(e){let t=e===`.`?[]:e.split(`/`).filter(Boolean),n=[{label:`/`,path:`.`}];for(let e=0;e<t.length;e+=1)n.push({label:t[e]??``,path:t.slice(0,e+1).join(`/`)});return n}function U(e,t,n=!1){let r=new URLSearchParams({path:t});return n&&r.set(`download`,`1`),`/sandboxes/${encodeURIComponent(e)}/files/content?${r}`}function W(e){let t=G(e).toLowerCase(),n=t.lastIndexOf(`.`);return n<0?t:t.slice(n+1)}function G(e){return e.split(`/`).at(-1)??e}function K(e){return e===void 0?`-`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}export{M as SandboxesPage};
|
|
2
|
+
//# sourceMappingURL=sandboxes-page-D910dyFO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxes-page-D910dyFO.js","names":["e","e","e","e","r","t","a","i","e","t","a","a","i"],"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/DownloadSimple.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/defs/File.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/defs/FolderOpen.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/defs/TerminalWindow.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/DownloadSimple.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/File.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/FolderOpen.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/TerminalWindow.es.js","../../../src/ui/app/modules/sandboxes/sandboxes-page.tsx"],"sourcesContent":["import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M228,144v64a12,12,0,0,1-12,12H40a12,12,0,0,1-12-12V144a12,12,0,0,1,24,0v52H204V144a12,12,0,0,1,24,0Zm-108.49,8.49a12,12,0,0,0,17,0l40-40a12,12,0,0,0-17-17L140,115V32a12,12,0,0,0-24,0v83L96.49,95.51a12,12,0,0,0-17,17Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n \"path\",\n {\n d: \"M216,48V208H40V48A16,16,0,0,1,56,32H200A16,16,0,0,1,216,48Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40A8,8,0,0,0,168,96H136V32a8,8,0,0,0-16,0V96H88a8,8,0,0,0-5.66,13.66Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M222,144v64a6,6,0,0,1-6,6H40a6,6,0,0,1-6-6V144a6,6,0,0,1,12,0v58H210V144a6,6,0,0,1,12,0Zm-98.24,4.24a6,6,0,0,0,8.48,0l40-40a6,6,0,0,0-8.48-8.48L134,129.51V32a6,6,0,0,0-12,0v97.51L92.24,99.76a6,6,0,0,0-8.48,8.48Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M220,144v64a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V144a4,4,0,0,1,8,0v60H212V144a4,4,0,0,1,8,0Zm-94.83,2.83a4,4,0,0,0,5.66,0l40-40a4,4,0,1,0-5.66-5.66L132,134.34V32a4,4,0,0,0-8,0V134.34L90.83,101.17a4,4,0,0,0-5.66,5.66Z\" }))\n ]\n]);\nexport {\n e as default\n};\n","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: \"M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,88H152V32Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM152,88V44l44,44Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Z\" }))\n ]\n]);\nexport {\n a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M248.23,112.31A20,20,0,0,0,232,104H220V88a20,20,0,0,0-20-20H132L105.34,48a20.12,20.12,0,0,0-12-4H40A20,20,0,0,0,20,64V208a12,12,0,0,0,12,12H211.1a12,12,0,0,0,11.33-8l28.49-81.47.06-.17A20,20,0,0,0,248.23,112.31ZM92,68l28.8,21.6A12,12,0,0,0,128,92h68v12H69.77a20,20,0,0,0-18.94,13.58L44,137.15V68ZM202.59,196H48.89l23.72-68H226.37Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n \"path\",\n {\n d: \"M208,88v24H69.77a8,8,0,0,0-7.59,5.47L32,208V64a8,8,0,0,1,8-8H93.33a8,8,0,0,1,4.8,1.6L128,80h72A8,8,0,0,1,208,88Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Zm112,136H43.1l26.67-80H232Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208h0a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M243.36,111.81A14,14,0,0,0,232,106H214V88a14,14,0,0,0-14-14H130L101.74,52.8a14.06,14.06,0,0,0-8.4-2.8H40A14,14,0,0,0,26,64V208a6,6,0,0,0,6,6H211.1a6,6,0,0,0,5.69-4.1l28.49-85.47A14,14,0,0,0,243.36,111.81ZM40,62H93.34a2,2,0,0,1,1.2.4L124.4,84.8A6,6,0,0,0,128,86h72a2,2,0,0,1,2,2v18H69.77a14,14,0,0,0-13.28,9.57L38,171V64A2,2,0,0,1,40,62Zm193.9,58.63L206.78,202H40.33l27.54-82.63a2,2,0,0,1,1.9-1.37H232a2,2,0,0,1,1.9,2.63Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208h0a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Zm112,136H43.1l26.67-80H232Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M241.72,113a11.88,11.88,0,0,0-9.73-5H212V88a12,12,0,0,0-12-12H129.33l-28.8-21.6a12.05,12.05,0,0,0-7.2-2.4H40A12,12,0,0,0,28,64V208a4,4,0,0,0,4,4H211.09a4,4,0,0,0,3.79-2.74l28.49-85.47A11.86,11.86,0,0,0,241.72,113ZM40,60H93.33a4,4,0,0,1,2.4.8L125.6,83.2a4,4,0,0,0,2.4.8h72a4,4,0,0,1,4,4v20H69.76a12,12,0,0,0-11.38,8.21L36,183.35V64A4,4,0,0,1,40,60Zm195.78,61.26L208.2,204H37.55L66,118.74A4,4,0,0,1,69.76,116H232a4,4,0,0,1,3.79,5.26Z\" }))\n ]\n]);\nexport {\n e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M72.5,150.63,100.79,128,72.5,105.37a12,12,0,1,1,15-18.74l40,32a12,12,0,0,1,0,18.74l-40,32a12,12,0,0,1-15-18.74ZM144,172h32a12,12,0,0,0,0-24H144a12,12,0,0,0,0,24ZM236,56V200a20,20,0,0,1-20,20H40a20,20,0,0,1-20-20V56A20,20,0,0,1,40,36H216A20,20,0,0,1,236,56Zm-24,4H44V196H212Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n \"path\",\n {\n d: \"M224,56V200a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,128a8,8,0,0,1-3,6.25l-40,32a8,8,0,1,1-10-12.5L107.19,128,75,102.25a8,8,0,1,1,10-12.5l40,32A8,8,0,0,1,128,128Zm48,24H136a8,8,0,0,0,0,16h40a8,8,0,0,0,0-16Zm56-96V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56ZM216,200V56H40V200H216Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm-91,94.25-40,32a8,8,0,1,1-10-12.5L107.19,128,75,102.25a8,8,0,1,1,10-12.5l40,32a8,8,0,0,1,0,12.5ZM176,168H136a8,8,0,0,1,0-16h40a8,8,0,0,1,0,16Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M126,128a6,6,0,0,1-2.25,4.69l-40,32a6,6,0,0,1-7.5-9.38L110.4,128,76.25,100.69a6,6,0,1,1,7.5-9.38l40,32A6,6,0,0,1,126,128Zm50,26H136a6,6,0,0,0,0,12h40a6,6,0,0,0,0-12Zm54-98V200a14,14,0,0,1-14,14H40a14,14,0,0,1-14-14V56A14,14,0,0,1,40,42H216A14,14,0,0,1,230,56Zm-12,0a2,2,0,0,0-2-2H40a2,2,0,0,0-2,2V200a2,2,0,0,0,2,2H216a2,2,0,0,0,2-2Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,128a8,8,0,0,1-3,6.25l-40,32a8,8,0,1,1-10-12.5L107.19,128,75,102.25a8,8,0,1,1,10-12.5l40,32A8,8,0,0,1,128,128Zm48,24H136a8,8,0,0,0,0,16h40a8,8,0,0,0,0-16Zm56-96V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56ZM216,200V56H40V200H216Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M122.5,124.88a4,4,0,0,1,0,6.24l-40,32a4,4,0,0,1-5-6.24L113.6,128,77.5,99.12a4,4,0,0,1,5-6.24ZM176,156H136a4,4,0,0,0,0,8h40a4,4,0,0,0,0-8ZM228,56V200a12,12,0,0,1-12,12H40a12,12,0,0,1-12-12V56A12,12,0,0,1,40,44H216A12,12,0,0,1,228,56Zm-8,0a4,4,0,0,0-4-4H40a4,4,0,0,0-4,4V200a4,4,0,0,0,4,4H216a4,4,0,0,0,4-4Z\" }))\n ]\n]);\nexport {\n e as default\n};\n","import * as o from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport t from \"../defs/DownloadSimple.es.js\";\nconst e = o.forwardRef((a, m) => /* @__PURE__ */ o.createElement(r, { ref: m, ...a, weights: t }));\ne.displayName = \"DownloadSimpleIcon\";\nconst l = e;\nexport {\n l as DownloadSimple,\n e as DownloadSimpleIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/File.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(a, { ref: t, ...r, weights: i }));\no.displayName = \"FileIcon\";\nconst s = o;\nexport {\n s as File,\n o as FileIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/FolderOpen.es.js\";\nconst e = o.forwardRef((r, n) => /* @__PURE__ */ o.createElement(t, { ref: n, ...r, weights: a }));\ne.displayName = \"FolderOpenIcon\";\nconst m = e;\nexport {\n e as FolderNotchOpenIcon,\n m as FolderOpen,\n e as FolderOpenIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/TerminalWindow.es.js\";\nconst e = o.forwardRef((r, n) => /* @__PURE__ */ o.createElement(a, { ref: n, ...r, weights: i }));\ne.displayName = \"TerminalWindowIcon\";\nconst c = e;\nexport {\n c as TerminalWindow,\n e as TerminalWindowIcon\n};\n","import {\n ArrowClockwise,\n DownloadSimple,\n File,\n FolderOpen,\n TerminalWindow,\n} from \"@phosphor-icons/react\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n StudioSandboxesSummary,\n StudioSandboxFileEntry,\n StudioSandboxFilesResponse,\n StudioSandboxPort,\n StudioSandboxPortsResponse,\n StudioSandboxProcess,\n StudioSandboxProcessesResponse,\n StudioSandboxProcessLogsResponse,\n StudioSandboxSummary,\n} from \"../../../../types\";\nimport { responseErrorMessage } from \"../../app-errors\";\nimport { Button } from \"../../components/ui/button\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport {\n StudioEmptyState,\n StudioPageContent,\n StudioPageHeader,\n StudioPageShell,\n StudioStatusBadge,\n StudioSurface,\n} from \"../../components/ui/studio\";\nimport { cn } from \"../../lib/utils\";\nimport { errorMessage } from \"../shared/format\";\n\nconst maxInlinePreviewBytes = 1024 * 1024;\nconst textExtensions = new Set([\n \"css\",\n \"csv\",\n \"env\",\n \"gitignore\",\n \"graphql\",\n \"html\",\n \"ini\",\n \"java\",\n \"js\",\n \"json\",\n \"jsx\",\n \"log\",\n \"md\",\n \"mdx\",\n \"mjs\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sh\",\n \"sql\",\n \"svg\",\n \"toml\",\n \"ts\",\n \"tsx\",\n \"txt\",\n \"xml\",\n \"yaml\",\n \"yml\",\n]);\nconst imageTypes = new Map([\n [\"gif\", \"image/gif\"],\n [\"jpeg\", \"image/jpeg\"],\n [\"jpg\", \"image/jpeg\"],\n [\"png\", \"image/png\"],\n [\"webp\", \"image/webp\"],\n]);\n\ntype LoadState = \"idle\" | \"loading\";\ntype FilePreview =\n | { kind: \"binary\" | \"large\"; file: StudioSandboxFileEntry }\n | { kind: \"image\"; file: StudioSandboxFileEntry; url: string }\n | { kind: \"loading\"; file: StudioSandboxFileEntry }\n | { kind: \"text\"; file: StudioSandboxFileEntry; text: string };\n\nexport function SandboxesPage(props: {\n enabled: boolean;\n initialSandboxRef?: string;\n onError: (message: string) => void;\n onSelectSandbox: (sandboxRef: string) => void;\n}) {\n const [sandboxes, setSandboxes] = useState<StudioSandboxSummary[]>([]);\n const [summaryLoadState, setSummaryLoadState] = useState<LoadState>(\"idle\");\n const [refreshSequence, setRefreshSequence] = useState(0);\n const [currentPath, setCurrentPath] = useState(\".\");\n const [files, setFiles] = useState<StudioSandboxFileEntry[]>([]);\n const [fileLoadState, setFileLoadState] = useState<LoadState>(\"idle\");\n const [preview, setPreview] = useState<FilePreview | undefined>();\n const [ports, setPorts] = useState<StudioSandboxPort[]>([]);\n const [processes, setProcesses] = useState<StudioSandboxProcess[]>([]);\n const [runtimeLoadState, setRuntimeLoadState] = useState<LoadState>(\"idle\");\n const [selectedProcessId, setSelectedProcessId] = useState(\"\");\n const [processLogs, setProcessLogs] = useState<StudioSandboxProcessLogsResponse | undefined>();\n const [localError, setLocalError] = useState(\"\");\n const previewRequest = useRef<AbortController | undefined>(undefined);\n\n const selectedRef = props.initialSandboxRef ?? sandboxes[0]?.ref ?? \"\";\n const selectedSandbox = sandboxes.find((sandbox) => sandbox.ref === selectedRef);\n const selectedSandboxRef = selectedSandbox?.ref;\n const supportsPorts = selectedSandbox?.capabilities.ports ?? false;\n const supportsProcesses = selectedSandbox?.capabilities.processes ?? false;\n\n const reportError = useCallback(\n (error: unknown) => {\n const message = errorMessage(error);\n setLocalError(message);\n props.onError(message);\n },\n [props.onError],\n );\n\n useEffect(() => {\n if (!props.enabled) {\n setSandboxes([]);\n return;\n }\n const controller = new AbortController();\n setSummaryLoadState(\"loading\");\n setLocalError(\"\");\n void requestJson<StudioSandboxesSummary>(\n \"/sandboxes\",\n \"Sandboxes\",\n controller.signal,\n refreshSequence === 0 ? \"default\" : \"reload\",\n )\n .then((summary) => setSandboxes(summary.sandboxes))\n .catch((error: unknown) => {\n if (!controller.signal.aborted) reportError(error);\n })\n .finally(() => {\n if (!controller.signal.aborted) setSummaryLoadState(\"idle\");\n });\n return () => controller.abort();\n }, [props.enabled, refreshSequence, reportError]);\n\n useEffect(() => {\n if (props.initialSandboxRef === undefined && sandboxes[0] !== undefined) {\n props.onSelectSandbox(sandboxes[0].ref);\n }\n }, [props.initialSandboxRef, props.onSelectSandbox, sandboxes]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: changing the route selection must reset sandbox-local view state.\n useEffect(() => {\n setCurrentPath(\".\");\n setFiles([]);\n setPreview(undefined);\n setPorts([]);\n setProcesses([]);\n setSelectedProcessId(\"\");\n setProcessLogs(undefined);\n return () => previewRequest.current?.abort();\n }, [selectedRef]);\n\n useEffect(() => {\n if (selectedSandboxRef === undefined) {\n return;\n }\n const controller = new AbortController();\n setFileLoadState(\"loading\");\n const params = new URLSearchParams({ path: currentPath });\n void requestJson<StudioSandboxFilesResponse>(\n `/sandboxes/${encodeURIComponent(selectedSandboxRef)}/files?${params}`,\n \"Sandbox files\",\n controller.signal,\n refreshSequence === 0 ? \"default\" : \"reload\",\n )\n .then((response) => setFiles(response.entries))\n .catch((error: unknown) => {\n if (!controller.signal.aborted) {\n setFiles([]);\n reportError(error);\n }\n })\n .finally(() => {\n if (!controller.signal.aborted) setFileLoadState(\"idle\");\n });\n return () => controller.abort();\n }, [currentPath, refreshSequence, reportError, selectedSandboxRef]);\n\n useEffect(() => {\n if (selectedSandboxRef === undefined) {\n return;\n }\n const controller = new AbortController();\n setRuntimeLoadState(\"loading\");\n const base = `/sandboxes/${encodeURIComponent(selectedSandboxRef)}`;\n const requests: Promise<void>[] = [];\n if (supportsPorts) {\n requests.push(\n requestJson<StudioSandboxPortsResponse>(\n `${base}/ports`,\n \"Sandbox ports\",\n controller.signal,\n refreshSequence === 0 ? \"default\" : \"reload\",\n ).then((response) => setPorts(response.ports)),\n );\n } else {\n setPorts([]);\n }\n if (supportsProcesses) {\n requests.push(\n requestJson<StudioSandboxProcessesResponse>(\n `${base}/processes`,\n \"Sandbox processes\",\n controller.signal,\n refreshSequence === 0 ? \"default\" : \"reload\",\n ).then((response) => {\n setProcesses(response.processes);\n setSelectedProcessId((current) =>\n response.processes.some((process) => process.id === current) ? current : \"\",\n );\n }),\n );\n } else {\n setProcesses([]);\n setSelectedProcessId(\"\");\n }\n void Promise.all(requests)\n .catch((error: unknown) => {\n if (!controller.signal.aborted) reportError(error);\n })\n .finally(() => {\n if (!controller.signal.aborted) setRuntimeLoadState(\"idle\");\n });\n return () => controller.abort();\n }, [refreshSequence, reportError, selectedSandboxRef, supportsPorts, supportsProcesses]);\n\n useEffect(() => {\n if (selectedSandboxRef === undefined || selectedProcessId.length === 0) {\n setProcessLogs(undefined);\n return;\n }\n const controller = new AbortController();\n const base = `/sandboxes/${encodeURIComponent(selectedSandboxRef)}/processes`;\n void requestJson<StudioSandboxProcessLogsResponse>(\n `${base}/${encodeURIComponent(selectedProcessId)}/logs`,\n \"Process logs\",\n controller.signal,\n refreshSequence === 0 ? \"default\" : \"reload\",\n )\n .then(setProcessLogs)\n .catch((error: unknown) => {\n if (!controller.signal.aborted) reportError(error);\n });\n return () => controller.abort();\n }, [refreshSequence, reportError, selectedProcessId, selectedSandboxRef]);\n\n useEffect(\n () => () => {\n if (preview?.kind === \"image\") URL.revokeObjectURL(preview.url);\n },\n [preview],\n );\n\n const clearPreview = useCallback(() => {\n previewRequest.current?.abort();\n previewRequest.current = undefined;\n setPreview(undefined);\n }, []);\n\n const openFile = useCallback(\n async (file: StudioSandboxFileEntry) => {\n previewRequest.current?.abort();\n previewRequest.current = undefined;\n if (selectedSandboxRef === undefined) {\n return;\n }\n if ((file.size ?? 0) > maxInlinePreviewBytes) {\n setPreview({ kind: \"large\", file });\n return;\n }\n const extension = fileExtension(file.path);\n const imageType = imageTypes.get(extension);\n if (!textExtensions.has(extension) && imageType === undefined) {\n setPreview({ kind: \"binary\", file });\n return;\n }\n\n setPreview({ kind: \"loading\", file });\n setLocalError(\"\");\n const controller = new AbortController();\n previewRequest.current = controller;\n try {\n const response = await fetch(fileContentUrl(selectedSandboxRef, file.path), {\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(await responseErrorMessage(response, \"Sandbox file\"));\n }\n const bytes = await response.arrayBuffer();\n if (bytes.byteLength > maxInlinePreviewBytes) {\n setPreview({ kind: \"large\", file });\n return;\n }\n if (imageType !== undefined) {\n const url = URL.createObjectURL(new Blob([bytes], { type: imageType }));\n setPreview({ kind: \"image\", file, url });\n return;\n }\n try {\n const text = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n setPreview({ kind: \"text\", file, text });\n } catch {\n setPreview({ kind: \"binary\", file });\n }\n } catch (error) {\n if (controller.signal.aborted) return;\n reportError(error);\n setPreview({ kind: \"binary\", file });\n } finally {\n if (previewRequest.current === controller) previewRequest.current = undefined;\n }\n },\n [reportError, selectedSandboxRef],\n );\n\n if (!props.enabled) {\n return (\n <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Sandboxes\">\n <StudioPageHeader\n title=\"Sandboxes\"\n description=\"Read-only files, published ports, and managed processes discovered from agent tools.\"\n />\n <StudioPageContent className=\"overflow-auto\">\n <StudioEmptyState\n title=\"No sandbox workspaces\"\n text=\"Add tools created by createSandboxTools(session) to an agent to inspect its live workspace here.\"\n />\n </StudioPageContent>\n </StudioPageShell>\n );\n }\n\n return (\n <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Sandboxes\">\n <StudioPageHeader\n title=\"Sandboxes\"\n description=\"Read-only files, published ports, and managed processes discovered from agent tools.\"\n action={\n <Button\n disabled={summaryLoadState === \"loading\"}\n size=\"sm\"\n type=\"button\"\n variant=\"secondary\"\n onClick={() => setRefreshSequence((current) => current + 1)}\n >\n <StudioIcon icon={ArrowClockwise} aria-hidden=\"true\" />\n Refresh\n </Button>\n }\n />\n\n <StudioPageContent className=\"grid grid-rows-[minmax(0,1fr)] overflow-hidden\">\n {sandboxes.length === 0 ? (\n <StudioEmptyState\n className=\"h-full\"\n title={\n summaryLoadState === \"loading\" ? \"Loading sandboxes\" : \"No live sandboxes detected\"\n }\n text={\n summaryLoadState === \"loading\"\n ? \"Reading live sandbox workspaces.\"\n : \"Studio discovers sessions automatically from tools returned by createSandboxTools(session).\"\n }\n />\n ) : (\n <div className=\"grid min-h-0 min-w-0 grid-cols-[250px_minmax(300px,0.8fr)_minmax(400px,1.2fr)] gap-3 overflow-hidden\">\n <SandboxRail\n sandboxes={sandboxes}\n selectedRef={selectedRef}\n onSelect={props.onSelectSandbox}\n />\n <FileBrowser\n currentPath={currentPath}\n files={files}\n loading={fileLoadState === \"loading\"}\n onOpenDirectory={(filePath) => {\n clearPreview();\n setCurrentPath(filePath);\n }}\n onOpenFile={(file) => void openFile(file)}\n onSelectPath={(filePath) => {\n clearPreview();\n setCurrentPath(filePath);\n }}\n />\n <div className=\"grid min-h-0 gap-3 overflow-y-auto pr-1\">\n {selectedSandbox === undefined ? (\n <StudioEmptyState\n title=\"Sandbox unavailable\"\n text=\"The requested live sandbox is not registered by this Studio runtime.\"\n />\n ) : (\n <>\n <SandboxOverview sandbox={selectedSandbox} error={localError} />\n <FilePreviewPanel preview={preview} sandboxRef={selectedSandbox.ref} />\n <RuntimePanel\n loading={runtimeLoadState === \"loading\"}\n logs={processLogs}\n ports={ports}\n processes={processes}\n selectedProcessId={selectedProcessId}\n supportsPorts={selectedSandbox.capabilities.ports}\n supportsProcesses={selectedSandbox.capabilities.processes}\n onSelectProcess={setSelectedProcessId}\n />\n </>\n )}\n </div>\n </div>\n )}\n </StudioPageContent>\n </StudioPageShell>\n );\n}\n\nfunction SandboxRail(props: {\n sandboxes: StudioSandboxSummary[];\n selectedRef: string;\n onSelect: (sandboxRef: string) => void;\n}) {\n return (\n <StudioSurface className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)]\">\n <div className=\"border-b border-border/70 px-4 py-3\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Workspaces\n </span>\n <p className=\"m-0 mt-1 text-xs text-muted-foreground\">\n {props.sandboxes.length} live {props.sandboxes.length === 1 ? \"session\" : \"sessions\"}\n </p>\n </div>\n <div className=\"min-h-0 overflow-y-auto p-2\">\n {props.sandboxes.map((sandbox) => (\n <Button\n className={cn(\n \"mb-1 grid h-auto min-h-16 w-full justify-stretch gap-1 rounded-lg px-3 py-2.5 text-left\",\n sandbox.ref === props.selectedRef && \"border-border bg-accent text-foreground\",\n )}\n key={sandbox.ref}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onSelect(sandbox.ref)}\n >\n <span className=\"flex min-w-0 items-center justify-between gap-2\">\n <strong className=\"truncate text-sm font-semibold text-foreground\">\n {sandbox.id}\n </strong>\n <StudioStatusBadge className=\"shrink-0 px-1.5 py-0.5 text-[10px]\">\n {sandbox.provider}\n </StudioStatusBadge>\n </span>\n <span className=\"truncate font-mono text-[11px] font-normal text-muted-foreground\">\n {sandbox.workdir}\n </span>\n </Button>\n ))}\n </div>\n </StudioSurface>\n );\n}\n\nfunction FileBrowser(props: {\n currentPath: string;\n files: StudioSandboxFileEntry[];\n loading: boolean;\n onOpenDirectory: (path: string) => void;\n onOpenFile: (file: StudioSandboxFileEntry) => void;\n onSelectPath: (path: string) => void;\n}) {\n const breadcrumbs = useMemo(() => sandboxBreadcrumbs(props.currentPath), [props.currentPath]);\n return (\n <StudioSurface className=\"grid min-h-0 grid-rows-[auto_auto_minmax(0,1fr)]\">\n <div className=\"border-b border-border/70 px-4 py-3\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Files\n </span>\n <p className=\"m-0 mt-1 text-xs text-muted-foreground\">One level at a time</p>\n </div>\n <div className=\"flex min-h-10 items-center gap-1 overflow-x-auto border-b border-border/70 px-3 py-1.5\">\n {breadcrumbs.map((breadcrumb, index) => (\n <span className=\"flex items-center gap-1\" key={breadcrumb.path}>\n {index > 0 ? <span className=\"text-muted-foreground/60\">/</span> : null}\n <Button\n className=\"h-7 min-h-7 px-2 font-mono text-xs\"\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onSelectPath(breadcrumb.path)}\n >\n {breadcrumb.label}\n </Button>\n </span>\n ))}\n </div>\n <div className=\"min-h-0 overflow-y-auto p-2\">\n {props.loading ? (\n <StudioEmptyState\n size=\"compact\"\n title=\"Loading workspace\"\n text=\"Reading files from the selected sandbox.\"\n />\n ) : null}\n {!props.loading && props.files.length === 0 ? (\n <StudioEmptyState\n size=\"compact\"\n title=\"Empty directory\"\n text=\"This directory does not contain any files.\"\n />\n ) : null}\n {props.files.map((file) => (\n <Button\n className=\"mb-0.5 grid h-10 min-h-10 w-full grid-cols-[18px_minmax(0,1fr)_auto] justify-stretch gap-2 rounded-md px-2.5 text-left text-xs font-medium\"\n key={file.path}\n type=\"button\"\n variant=\"ghost\"\n onClick={() =>\n file.type === \"directory\" ? props.onOpenDirectory(file.path) : props.onOpenFile(file)\n }\n >\n <StudioIcon\n className=\"text-muted-foreground\"\n icon={file.type === \"directory\" ? FolderOpen : File}\n aria-hidden=\"true\"\n />\n <span className=\"truncate text-foreground\">{basename(file.path)}</span>\n <span className=\"font-mono text-[10px] font-normal text-muted-foreground\">\n {file.type === \"file\" ? formatBytes(file.size) : file.type}\n </span>\n </Button>\n ))}\n </div>\n </StudioSurface>\n );\n}\n\nfunction SandboxOverview(props: { sandbox: StudioSandboxSummary; error: string }) {\n return (\n <StudioSurface className=\"p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Active sandbox\n </span>\n <h2 className=\"m-0 mt-1 truncate text-lg font-semibold text-foreground\">\n {props.sandbox.id}\n </h2>\n <p className=\"m-0 mt-1 truncate font-mono text-xs text-muted-foreground\">\n {props.sandbox.workdir}\n </p>\n </div>\n <StudioStatusBadge>{props.sandbox.provider}</StudioStatusBadge>\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-3 text-xs\">\n <MetadataList label=\"Agents\" values={props.sandbox.agentIds} />\n <MetadataList label=\"Sandbox tools\" values={props.sandbox.toolNames} />\n </div>\n {props.error.length > 0 ? (\n <p className=\"m-0 mt-3 rounded-lg border border-destructive/25 bg-destructive/5 px-3 py-2 text-xs leading-5 text-destructive\">\n {props.error}\n </p>\n ) : null}\n </StudioSurface>\n );\n}\n\nfunction MetadataList(props: { label: string; values: string[] }) {\n return (\n <div className=\"rounded-lg border border-border/70 bg-background/45 p-3\">\n <span className=\"font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {props.label}\n </span>\n <p className=\"m-0 mt-1 break-words font-mono leading-5 text-foreground\">\n {props.values.join(\", \") || \"-\"}\n </p>\n </div>\n );\n}\n\nfunction FilePreviewPanel(props: { preview: FilePreview | undefined; sandboxRef: string }) {\n const file = props.preview?.file;\n return (\n <StudioSurface className=\"grid min-h-64 grid-rows-[auto_minmax(0,1fr)]\">\n <div className=\"flex min-h-12 items-center justify-between gap-3 border-b border-border/70 px-4 py-2\">\n <div className=\"min-w-0\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Preview\n </span>\n <p className=\"m-0 mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">\n {file?.path ?? \"Select a file\"}\n </p>\n </div>\n {file !== undefined ? (\n <Button asChild size=\"sm\" variant=\"secondary\">\n <a href={fileContentUrl(props.sandboxRef, file.path, true)}>\n <StudioIcon icon={DownloadSimple} aria-hidden=\"true\" />\n Download\n </a>\n </Button>\n ) : null}\n </div>\n <div className=\"grid min-h-0 place-items-center overflow-auto\">\n {props.preview === undefined ? (\n <StudioEmptyState\n className=\"h-full rounded-none\"\n size=\"compact\"\n title=\"No file selected\"\n text=\"Choose a regular file to inspect its contents.\"\n />\n ) : null}\n {props.preview?.kind === \"loading\" ? (\n <StudioEmptyState\n className=\"h-full rounded-none\"\n size=\"compact\"\n title=\"Loading preview\"\n text=\"Reading the selected file.\"\n />\n ) : null}\n {props.preview?.kind === \"text\" ? (\n <pre className=\"m-0 h-full min-h-48 w-full overflow-auto whitespace-pre-wrap break-words rounded-lg border border-border/70 bg-card/60 p-4 font-mono text-xs leading-5 text-foreground\">\n {props.preview.text}\n </pre>\n ) : null}\n {props.preview?.kind === \"image\" ? (\n <img\n className=\"max-h-96 max-w-full rounded-lg border border-border/70 object-contain\"\n src={props.preview.url}\n alt={basename(props.preview.file.path)}\n />\n ) : null}\n {props.preview?.kind === \"binary\" ? (\n <PreviewNotice text=\"This file type is download-only and will not be rendered in Studio.\" />\n ) : null}\n {props.preview?.kind === \"large\" ? (\n <PreviewNotice text=\"This file is larger than the 1 MiB inline preview limit.\" />\n ) : null}\n </div>\n </StudioSurface>\n );\n}\n\nfunction PreviewNotice(props: { text: string }) {\n return (\n <div className=\"grid max-w-sm justify-items-center gap-2 text-center\">\n <StudioIcon className=\"h-6 w-6 text-muted-foreground\" icon={File} aria-hidden=\"true\" />\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{props.text}</p>\n </div>\n );\n}\n\nfunction RuntimePanel(props: {\n loading: boolean;\n logs: StudioSandboxProcessLogsResponse | undefined;\n ports: StudioSandboxPort[];\n processes: StudioSandboxProcess[];\n selectedProcessId: string;\n supportsPorts: boolean;\n supportsProcesses: boolean;\n onSelectProcess: (processId: string) => void;\n}) {\n return (\n <StudioSurface className=\"p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Runtime\n </span>\n <p className=\"m-0 mt-1 text-xs text-muted-foreground\">\n Published ports and managed processes\n </p>\n </div>\n {props.loading ? <StudioStatusBadge>Refreshing</StudioStatusBadge> : null}\n </div>\n\n <div className=\"mt-4 grid gap-4\">\n <RuntimeSection title=\"Ports\">\n {!props.supportsPorts ? (\n <RuntimeEmpty text=\"Published ports are not supported by this sandbox.\" />\n ) : props.ports.length === 0 ? (\n <RuntimeEmpty text=\"No ports are published.\" />\n ) : (\n <div className=\"grid gap-1\">\n {props.ports.map((port) => (\n <div\n className=\"grid grid-cols-[90px_minmax(0,1fr)] gap-3 rounded-md border border-border/60 px-3 py-2 font-mono text-xs\"\n key={`${port.containerPort}:${port.hostPort}`}\n >\n <span className=\"text-foreground\">\n {port.containerPort}/{port.protocol}\n </span>\n <span className=\"truncate text-muted-foreground\">\n {port.host}:{port.hostPort}\n </span>\n </div>\n ))}\n </div>\n )}\n </RuntimeSection>\n\n <RuntimeSection title=\"Processes\">\n {!props.supportsProcesses ? (\n <RuntimeEmpty text=\"Managed processes are not supported by this sandbox.\" />\n ) : props.processes.length === 0 ? (\n <RuntimeEmpty text=\"No managed processes are recorded.\" />\n ) : (\n <div className=\"grid gap-1\">\n {props.processes.map((process) => (\n <Button\n className={cn(\n \"grid h-auto min-h-11 w-full grid-cols-[minmax(0,1fr)_auto] justify-stretch gap-3 rounded-md px-3 py-2 text-left\",\n process.id === props.selectedProcessId &&\n \"border-border bg-accent text-foreground\",\n )}\n key={process.id}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onSelectProcess(process.id)}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <StudioIcon\n className=\"text-muted-foreground\"\n icon={TerminalWindow}\n aria-hidden=\"true\"\n />\n <span className=\"truncate font-mono text-xs text-foreground\">\n {[process.command, ...process.args].join(\" \")}\n </span>\n </span>\n <StudioStatusBadge className=\"px-1.5 py-0.5 text-[10px]\">\n {process.status}\n </StudioStatusBadge>\n </Button>\n ))}\n </div>\n )}\n </RuntimeSection>\n\n {props.selectedProcessId.length > 0 ? (\n <RuntimeSection title=\"Process logs\">\n {props.logs === undefined ? (\n <RuntimeEmpty text=\"Loading the latest bounded output.\" />\n ) : (\n <div className=\"grid gap-2\">\n <LogBlock\n label=\"stdout\"\n text={props.logs.stdout}\n truncated={props.logs.stdoutTruncated}\n />\n <LogBlock\n label=\"stderr\"\n text={props.logs.stderr}\n truncated={props.logs.stderrTruncated}\n />\n </div>\n )}\n </RuntimeSection>\n ) : null}\n </div>\n </StudioSurface>\n );\n}\n\nfunction RuntimeSection(props: { title: string; children: ReactNode }) {\n return (\n <section className=\"grid gap-2\">\n <h3 className=\"m-0 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {props.title}\n </h3>\n {props.children}\n </section>\n );\n}\n\nfunction RuntimeEmpty(props: { text: string }) {\n return (\n <p className=\"m-0 rounded-md border border-dashed border-border/70 px-3 py-2 text-xs leading-5 text-muted-foreground\">\n {props.text}\n </p>\n );\n}\n\nfunction LogBlock(props: { label: string; text: string; truncated: boolean }) {\n return (\n <div className=\"overflow-hidden rounded-md border border-border/70 bg-background/55\">\n <div className=\"flex items-center justify-between border-b border-border/60 px-3 py-1.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n <span>{props.label}</span>\n {props.truncated ? <span>truncated</span> : null}\n </div>\n <pre className=\"m-0 max-h-48 overflow-auto whitespace-pre-wrap break-words p-3 font-mono text-[11px] leading-5 text-foreground\">\n {props.text || \"No output\"}\n </pre>\n </div>\n );\n}\n\nasync function requestJson<T>(\n url: string,\n label: string,\n signal: AbortSignal,\n cache: RequestCache = \"default\",\n): Promise<T> {\n const response = await fetch(url, { cache, signal });\n if (!response.ok) {\n throw new Error(await responseErrorMessage(response, label));\n }\n return (await response.json()) as T;\n}\n\nfunction sandboxBreadcrumbs(filePath: string): Array<{ label: string; path: string }> {\n const segments = filePath === \".\" ? [] : filePath.split(\"/\").filter(Boolean);\n const breadcrumbs = [{ label: \"/\", path: \".\" }];\n for (let index = 0; index < segments.length; index += 1) {\n breadcrumbs.push({\n label: segments[index] ?? \"\",\n path: segments.slice(0, index + 1).join(\"/\"),\n });\n }\n return breadcrumbs;\n}\n\nfunction fileContentUrl(sandboxRef: string, filePath: string, download = false): string {\n const params = new URLSearchParams({ path: filePath });\n if (download) params.set(\"download\", \"1\");\n return `/sandboxes/${encodeURIComponent(sandboxRef)}/files/content?${params}`;\n}\n\nfunction fileExtension(filePath: string): string {\n const name = basename(filePath).toLowerCase();\n const dot = name.lastIndexOf(\".\");\n return dot < 0 ? name : name.slice(dot + 1);\n}\n\nfunction basename(filePath: string): string {\n return filePath.split(\"/\").at(-1) ?? filePath;\n}\n\nfunction formatBytes(size: number | undefined): string {\n if (size === undefined) return \"-\";\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KiB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MiB`;\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7],"mappings":"+OACMA,EAAoB,IAAI,IAAI,CAChC,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,2NAA4N,CAAC,CAAC,CAC9T,CACD,CACE,UACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAClE,OACA,CACE,EAAG,8DACH,QAAS,MACV,CACF,CAAkB,EAAE,cAAc,OAAQ,CAAE,EAAG,4NAA6N,CAAC,CAAC,CAChR,CACD,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,mMAAoM,CAAC,CAAC,CACtS,CACD,CACE,QACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,sNAAuN,CAAC,CAAC,CACzT,CACD,CACE,UACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,4NAA6N,CAAC,CAAC,CAC/T,CACD,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,qNAAsN,CAAC,CAAC,CACxT,CACF,CAAC,CC/BI,EAAoB,IAAI,IAAI,CAChC,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,oMAAqM,CAAC,CAAC,CACvS,CACD,CACE,UACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,kBAAmB,QAAS,MAAO,CAAC,CAAkB,EAAE,cAAc,OAAQ,CAAE,EAAG,uMAAwM,CAAC,CAAC,CAC7X,CACD,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,qJAAsJ,CAAC,CAAC,CACxP,CACD,CACE,QACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,qPAAsP,CAAC,CAAC,CACxV,CACD,CACE,UACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,uMAAwM,CAAC,CAAC,CAC1S,CACD,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,qPAAsP,CAAC,CAAC,CACxV,CACF,CAAC,CCzBIC,EAAoB,IAAI,IAAI,CAChC,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,6UAA8U,CAAC,CAAC,CAChb,CACD,CACE,UACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAClE,OACA,CACE,EAAG,mHACH,QAAS,MACV,CACF,CAAkB,EAAE,cAAc,OAAQ,CAAE,EAAG,oUAAqU,CAAC,CAAC,CACxX,CACD,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,2SAA4S,CAAC,CAAC,CAC9Y,CACD,CACE,QACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,uaAAwa,CAAC,CAAC,CAC1gB,CACD,CACE,UACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,sUAAuU,CAAC,CAAC,CACza,CACD,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,kbAAmb,CAAC,CAAC,CACrhB,CACF,CAAC,CC/BIC,EAAoB,IAAI,IAAI,CAChC,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,qRAAsR,CAAC,CAAC,CACxX,CACD,CACE,UACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAClE,OACA,CACE,EAAG,oFACH,QAAS,MACV,CACF,CAAkB,EAAE,cAAc,OAAQ,CAAE,EAAG,sRAAuR,CAAC,CAAC,CAC1U,CACD,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,iPAAkP,CAAC,CAAC,CACpV,CACD,CACE,QACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,gVAAiV,CAAC,CAAC,CACnb,CACD,CACE,UACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,sRAAuR,CAAC,CAAC,CACzX,CACD,CACE,OACgB,EAAE,cAAA,EAAgB,SAAU,KAAsB,EAAE,cAAc,OAAQ,CAAE,EAAG,oTAAqT,CAAC,CAAC,CACvZ,CACF,CAAC,CC7BIC,EAAAA,EAAM,YAAY,EAAG,IAAsB,EAAE,cAAcC,EAAG,CAAE,IAAK,EAAG,GAAG,EAAG,QAASC,EAAG,CAAC,CAAC,CAClG,EAAE,YAAc,qBAChB,IAAM,EAAIF,ECFJ,EAAA,EAAM,YAAY,EAAG,IAAsB,EAAE,cAAcG,EAAG,CAAE,IAAK,EAAG,GAAG,EAAG,QAASC,EAAG,CAAC,CAAC,CAClG,EAAE,YAAc,WAChB,IAAM,EAAI,ECFJC,EAAAA,EAAM,YAAY,EAAG,IAAsB,EAAE,cAAcC,EAAG,CAAE,IAAK,EAAG,GAAG,EAAG,QAASC,EAAG,CAAC,CAAC,CAClG,EAAE,YAAc,iBAChB,IAAM,EAAIF,ECFJ,EAAA,EAAM,YAAY,EAAG,IAAsB,EAAE,cAAcG,EAAG,CAAE,IAAK,EAAG,GAAG,EAAG,QAASC,EAAG,CAAC,CAAC,CAClG,EAAE,YAAc,qBAChB,IAAM,EAAI,QC4BJ,EAAwB,KAAO,KAC/B,EAAiB,IAAI,IAAI,oIA6B9B,CAAC,CACI,EAAa,IAAI,IAAI,CACzB,CAAC,MAAO,YAAY,CACpB,CAAC,OAAQ,aAAa,CACtB,CAAC,MAAO,aAAa,CACrB,CAAC,MAAO,YAAY,CACpB,CAAC,OAAQ,aAAa,CACvB,CAAC,CASF,SAAgB,EAAc,EAK3B,CACD,GAAM,CAAC,EAAW,IAAA,EAAA,EAAA,UAAiD,EAAE,CAAC,CAChE,CAAC,EAAkB,IAAA,EAAA,EAAA,UAA2C,OAAO,CACrE,CAAC,EAAiB,IAAA,EAAA,EAAA,UAA+B,EAAE,CACnD,CAAC,EAAa,IAAA,EAAA,EAAA,UAA2B,IAAI,CAC7C,CAAC,EAAO,IAAA,EAAA,EAAA,UAA+C,EAAE,CAAC,CAC1D,CAAC,EAAe,IAAA,EAAA,EAAA,UAAwC,OAAO,CAC/D,CAAC,EAAS,IAAA,EAAA,EAAA,WAAiD,CAC3D,CAAC,EAAO,IAAA,EAAA,EAAA,UAA0C,EAAE,CAAC,CACrD,CAAC,EAAW,IAAA,EAAA,EAAA,UAAiD,EAAE,CAAC,CAChE,CAAC,EAAkB,IAAA,EAAA,EAAA,UAA2C,OAAO,CACrE,CAAC,EAAmB,IAAA,EAAA,EAAA,UAAiC,GAAG,CACxD,CAAC,EAAa,IAAA,EAAA,EAAA,WAA0E,CACxF,CAAC,EAAY,IAAA,EAAA,EAAA,UAA0B,GAAG,CAC1C,GAAA,EAAA,EAAA,QAAqD,IAAA,GAAU,CAE/D,EAAc,EAAM,mBAAqB,EAAU,IAAI,KAAO,GAC9D,EAAkB,EAAU,KAAM,GAAY,EAAQ,MAAQ,EAAY,CAC1E,EAAqB,GAAiB,IACtC,EAAgB,GAAiB,aAAa,OAAS,GACvD,EAAoB,GAAiB,aAAa,WAAa,GAE/D,GAAA,EAAA,EAAA,aACH,GAAmB,CAClB,IAAM,EAAU,GAAa,EAAM,CACnC,EAAc,EAAQ,CACtB,EAAM,QAAQ,EAAQ,EAExB,CAAC,EAAM,QAAQ,CAChB,EAED,EAAA,EAAA,eAAgB,CACd,GAAI,CAAC,EAAM,QAAS,CAClB,EAAa,EAAE,CAAC,CAChB,OAEF,IAAM,EAAa,IAAI,gBAgBvB,OAfA,EAAoB,UAAU,CAC9B,EAAc,GAAG,CACZ,EACH,aACA,YACA,EAAW,OACX,IAAoB,EAAI,UAAY,SACrC,CACE,KAAM,GAAY,EAAa,EAAQ,UAAU,CAAC,CAClD,MAAO,GAAmB,CACpB,EAAW,OAAO,SAAS,EAAY,EAAM,EAClD,CACD,YAAc,CACR,EAAW,OAAO,SAAS,EAAoB,OAAO,EAC3D,KACS,EAAW,OAAO,EAC9B,CAAC,EAAM,QAAS,EAAiB,EAAY,CAAC,EAEjD,EAAA,EAAA,eAAgB,CACV,EAAM,oBAAsB,IAAA,IAAa,EAAU,KAAO,IAAA,IAC5D,EAAM,gBAAgB,EAAU,GAAG,IAAI,EAExC,CAAC,EAAM,kBAAmB,EAAM,gBAAiB,EAAU,CAAC,EAG/D,EAAA,EAAA,gBACE,EAAe,IAAI,CACnB,EAAS,EAAE,CAAC,CACZ,EAAW,IAAA,GAAU,CACrB,EAAS,EAAE,CAAC,CACZ,EAAa,EAAE,CAAC,CAChB,EAAqB,GAAG,CACxB,EAAe,IAAA,GAAU,KACZ,EAAe,SAAS,OAAO,EAC3C,CAAC,EAAY,CAAC,EAEjB,EAAA,EAAA,eAAgB,CACd,GAAI,IAAuB,IAAA,GACzB,OAEF,IAAM,EAAa,IAAI,gBACvB,EAAiB,UAAU,CAC3B,IAAM,EAAS,IAAI,gBAAgB,CAAE,KAAM,EAAa,CAAC,CAiBzD,OAhBK,EACH,cAAc,mBAAmB,EAAmB,CAAC,SAAS,IAC9D,gBACA,EAAW,OACX,IAAoB,EAAI,UAAY,SACrC,CACE,KAAM,GAAa,EAAS,EAAS,QAAQ,CAAC,CAC9C,MAAO,GAAmB,CACpB,EAAW,OAAO,UACrB,EAAS,EAAE,CAAC,CACZ,EAAY,EAAM,GAEpB,CACD,YAAc,CACR,EAAW,OAAO,SAAS,EAAiB,OAAO,EACxD,KACS,EAAW,OAAO,EAC9B,CAAC,EAAa,EAAiB,EAAa,EAAmB,CAAC,EAEnE,EAAA,EAAA,eAAgB,CACd,GAAI,IAAuB,IAAA,GACzB,OAEF,IAAM,EAAa,IAAI,gBACvB,EAAoB,UAAU,CAC9B,IAAM,EAAO,cAAc,mBAAmB,EAAmB,GAC3D,EAA4B,EAAE,CAsCpC,OArCI,EACF,EAAS,KACP,EACE,GAAG,EAAK,QACR,gBACA,EAAW,OACX,IAAoB,EAAI,UAAY,SACrC,CAAC,KAAM,GAAa,EAAS,EAAS,MAAM,CAAC,CAC/C,CAED,EAAS,EAAE,CAAC,CAEV,EACF,EAAS,KACP,EACE,GAAG,EAAK,YACR,oBACA,EAAW,OACX,IAAoB,EAAI,UAAY,SACrC,CAAC,KAAM,GAAa,CACnB,EAAa,EAAS,UAAU,CAChC,EAAsB,GACpB,EAAS,UAAU,KAAM,GAAY,EAAQ,KAAO,EAAQ,CAAG,EAAU,GAC1E,EACD,CACH,EAED,EAAa,EAAE,CAAC,CAChB,EAAqB,GAAG,EAErB,QAAQ,IAAI,EAAS,CACvB,MAAO,GAAmB,CACpB,EAAW,OAAO,SAAS,EAAY,EAAM,EAClD,CACD,YAAc,CACR,EAAW,OAAO,SAAS,EAAoB,OAAO,EAC3D,KACS,EAAW,OAAO,EAC9B,CAAC,EAAiB,EAAa,EAAoB,EAAe,EAAkB,CAAC,EAExF,EAAA,EAAA,eAAgB,CACd,GAAI,IAAuB,IAAA,IAAa,EAAkB,SAAW,EAAG,CACtE,EAAe,IAAA,GAAU,CACzB,OAEF,IAAM,EAAa,IAAI,gBAYvB,OAVK,EACH,GAAG,cAFsB,mBAAmB,EAAmB,CAAC,YAExD,GAAG,mBAAmB,EAAkB,CAAC,OACjD,eACA,EAAW,OACX,IAAoB,EAAI,UAAY,SACrC,CACE,KAAK,EAAe,CACpB,MAAO,GAAmB,CACpB,EAAW,OAAO,SAAS,EAAY,EAAM,EAClD,KACS,EAAW,OAAO,EAC9B,CAAC,EAAiB,EAAa,EAAmB,EAAmB,CAAC,EAEzE,EAAA,EAAA,mBACc,CACN,GAAS,OAAS,SAAS,IAAI,gBAAgB,EAAQ,IAAI,EAEjE,CAAC,EAAQ,CACV,CAED,IAAM,GAAA,EAAA,EAAA,iBAAiC,CACrC,EAAe,SAAS,OAAO,CAC/B,EAAe,QAAU,IAAA,GACzB,EAAW,IAAA,GAAU,EACpB,EAAE,CAAC,CAEA,IAAA,EAAA,EAAA,aACJ,KAAO,IAAiC,CAGtC,GAFA,EAAe,SAAS,OAAO,CAC/B,EAAe,QAAU,IAAA,GACrB,IAAuB,IAAA,GACzB,OAEF,IAAK,EAAK,MAAQ,GAAK,EAAuB,CAC5C,EAAW,CAAE,KAAM,QAAS,OAAM,CAAC,CACnC,OAEF,IAAM,EAAY,EAAc,EAAK,KAAK,CACpC,EAAY,EAAW,IAAI,EAAU,CAC3C,GAAI,CAAC,EAAe,IAAI,EAAU,EAAI,IAAc,IAAA,GAAW,CAC7D,EAAW,CAAE,KAAM,SAAU,OAAM,CAAC,CACpC,OAGF,EAAW,CAAE,KAAM,UAAW,OAAM,CAAC,CACrC,EAAc,GAAG,CACjB,IAAM,EAAa,IAAI,gBACvB,EAAe,QAAU,EACzB,GAAI,CACF,IAAM,EAAW,MAAM,MAAM,EAAe,EAAoB,EAAK,KAAK,CAAE,CAC1E,OAAQ,EAAW,OACpB,CAAC,CACF,GAAI,CAAC,EAAS,GACZ,MAAU,MAAM,MAAM,EAAqB,EAAU,eAAe,CAAC,CAEvE,IAAM,EAAQ,MAAM,EAAS,aAAa,CAC1C,GAAI,EAAM,WAAa,EAAuB,CAC5C,EAAW,CAAE,KAAM,QAAS,OAAM,CAAC,CACnC,OAEF,GAAI,IAAc,IAAA,GAAW,CAE3B,EAAW,CAAE,KAAM,QAAS,OAAM,IADtB,IAAI,gBAAgB,IAAI,KAAK,CAAC,EAAM,CAAE,CAAE,KAAM,EAAW,CAAC,CACpC,CAAK,CAAC,CACxC,OAEF,GAAI,CAEF,EAAW,CAAE,KAAM,OAAQ,OAAM,KADpB,IAAI,YAAY,QAAS,CAAE,MAAO,GAAM,CAAC,CAAC,OAAO,EAC7B,CAAM,CAAC,MAClC,CACN,EAAW,CAAE,KAAM,SAAU,OAAM,CAAC,QAE/B,EAAO,CACd,GAAI,EAAW,OAAO,QAAS,OAC/B,EAAY,EAAM,CAClB,EAAW,CAAE,KAAM,SAAU,OAAM,CAAC,QAC5B,CACJ,EAAe,UAAY,IAAY,EAAe,QAAU,IAAA,MAGxE,CAAC,EAAa,EAAmB,CAClC,CAmBD,OAjBK,EAAM,SAkBT,EAAA,EAAA,MAAC,EAAD,CAAiB,UAAU,iCAAiC,aAAW,qBAAvE,EACE,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,YACN,YAAY,uFACZ,QACE,EAAA,EAAA,MAAC,EAAD,CACE,SAAU,IAAqB,UAC/B,KAAK,KACL,KAAK,SACL,QAAQ,YACR,YAAe,EAAoB,GAAY,EAAU,EAAE,UAL7D,EAOE,EAAA,EAAA,KAAC,EAAD,CAAY,KAAM,EAAgB,cAAY,OAAS,CAAA,CAAA,UAEhD,GAEX,CAAA,EAEF,EAAA,EAAA,KAAC,EAAD,CAAmB,UAAU,0DAC1B,EAAU,SAAW,GACpB,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,SACV,MACE,IAAqB,UAAY,oBAAsB,6BAEzD,KACE,IAAqB,UACjB,mCACA,8FAEN,CAAA,EAEF,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gHAAf,EACE,EAAA,EAAA,KAAC,EAAD,CACa,YACE,cACb,SAAU,EAAM,gBAChB,CAAA,EACF,EAAA,EAAA,KAAC,GAAD,CACe,cACN,QACP,QAAS,IAAkB,UAC3B,gBAAkB,GAAa,CAC7B,GAAc,CACd,EAAe,EAAS,EAE1B,WAAa,GAAS,KAAK,GAAS,EAAK,CACzC,aAAe,GAAa,CAC1B,GAAc,CACd,EAAe,EAAS,EAE1B,CAAA,EACF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mDACZ,IAAoB,IAAA,IACnB,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,sBACN,KAAK,uEACL,CAAA,EAEF,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,GAAD,CAAiB,QAAS,EAAiB,MAAO,EAAc,CAAA,EAChE,EAAA,EAAA,KAAC,EAAD,CAA2B,UAAS,WAAY,EAAgB,IAAO,CAAA,EACvE,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,IAAqB,UAC9B,KAAM,EACC,QACI,YACQ,oBACnB,cAAe,EAAgB,aAAa,MAC5C,kBAAmB,EAAgB,aAAa,UAChD,gBAAiB,EACjB,CAAA,CACD,CAAA,CAAA,CAED,CAAA,CACF,GAEU,CAAA,CACJ,IA9FhB,EAAA,EAAA,MAAC,EAAD,CAAiB,UAAU,iCAAiC,aAAW,qBAAvE,EACE,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,YACN,YAAY,uFACZ,CAAA,EACF,EAAA,EAAA,KAAC,EAAD,CAAmB,UAAU,0BAC3B,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,wBACN,KAAK,mGACL,CAAA,CACgB,CAAA,CACJ,GAuFxB,SAAS,EAAY,EAIlB,CACD,OACE,EAAA,EAAA,MAAC,EAAD,CAAe,UAAU,uDAAzB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+CAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mFAA0E,aAEnF,CAAA,EACP,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,kDAAb,CACG,EAAM,UAAU,OAAO,SAAO,EAAM,UAAU,SAAW,EAAI,UAAY,WACxE,GACA,IACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,uCACZ,EAAM,UAAU,IAAK,IACpB,EAAA,EAAA,MAAC,EAAD,CACE,UAAW,EACT,0FACA,EAAQ,MAAQ,EAAM,aAAe,0CACtC,CAED,KAAK,SACL,QAAQ,QACR,YAAe,EAAM,SAAS,EAAQ,IAAI,UAR5C,EAUE,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,2DAAhB,EACE,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,0DACf,EAAQ,GACF,CAAA,EACT,EAAA,EAAA,KAAC,EAAD,CAAmB,UAAU,8CAC1B,EAAQ,SACS,CAAA,CACf,IACP,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,4EACb,EAAQ,QACJ,CAAA,CACA,EAhBF,EAAQ,IAgBN,CACT,CACE,CAAA,CACQ,GAIpB,SAAS,GAAY,EAOlB,CACD,IAAM,GAAA,EAAA,EAAA,aAA4B,EAAmB,EAAM,YAAY,CAAE,CAAC,EAAM,YAAY,CAAC,CAC7F,OACE,EAAA,EAAA,MAAC,EAAD,CAAe,UAAU,4DAAzB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+CAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mFAA0E,QAEnF,CAAA,EACP,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,kDAAyC,sBAAuB,CAAA,CACzE,IACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,kGACZ,EAAY,KAAK,EAAY,KAC5B,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,mCAAhB,CACG,EAAQ,GAAI,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,oCAA2B,IAAQ,CAAA,CAAG,MACnE,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,qCACV,KAAK,KACL,KAAK,SACL,QAAQ,QACR,YAAe,EAAM,aAAa,EAAW,KAAK,UAEjD,EAAW,MACL,CAAA,CACJ,EAXwC,EAAW,KAWnD,CACP,CACE,CAAA,EACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,uCAAf,CACG,EAAM,SACL,EAAA,EAAA,KAAC,EAAD,CACE,KAAK,UACL,MAAM,oBACN,KAAK,2CACL,CAAA,CACA,KACH,CAAC,EAAM,SAAW,EAAM,MAAM,SAAW,GACxC,EAAA,EAAA,KAAC,EAAD,CACE,KAAK,UACL,MAAM,kBACN,KAAK,6CACL,CAAA,CACA,KACH,EAAM,MAAM,IAAK,IAChB,EAAA,EAAA,MAAC,EAAD,CACE,UAAU,6IAEV,KAAK,SACL,QAAQ,QACR,YACE,EAAK,OAAS,YAAc,EAAM,gBAAgB,EAAK,KAAK,CAAG,EAAM,WAAW,EAAK,UANzF,EASE,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,wBACV,KAAM,EAAK,OAAS,YAAc,EAAa,EAC/C,cAAY,OACZ,CAAA,EACF,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,oCAA4B,EAAS,EAAK,KAAK,CAAQ,CAAA,EACvE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mEACb,EAAK,OAAS,OAAS,EAAY,EAAK,KAAK,CAAG,EAAK,KACjD,CAAA,CACA,EAhBF,EAAK,KAgBH,CACT,CACE,GACQ,GAIpB,SAAS,GAAgB,EAAyD,CAChF,OACE,EAAA,EAAA,MAAC,EAAD,CAAe,UAAU,eAAzB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,4DAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mBAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mFAA0E,iBAEnF,CAAA,EACP,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,mEACX,EAAM,QAAQ,GACZ,CAAA,EACL,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,qEACV,EAAM,QAAQ,QACb,CAAA,CACA,IACN,EAAA,EAAA,KAAC,EAAD,CAAA,SAAoB,EAAM,QAAQ,SAA6B,CAAA,CAC3D,IACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+CAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,SAAS,OAAQ,EAAM,QAAQ,SAAY,CAAA,EAC/D,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,gBAAgB,OAAQ,EAAM,QAAQ,UAAa,CAAA,CACnE,GACL,EAAM,MAAM,OAAS,GACpB,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,0HACV,EAAM,MACL,CAAA,CACF,KACU,GAIpB,SAAS,EAAa,EAA4C,CAChE,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mEAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,2EACb,EAAM,MACF,CAAA,EACP,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,oEACV,EAAM,OAAO,KAAK,KAAK,EAAI,IAC1B,CAAA,CACA,GAIV,SAAS,EAAiB,EAAiE,CACzF,IAAM,EAAO,EAAM,SAAS,KAC5B,OACE,EAAA,EAAA,MAAC,EAAD,CAAe,UAAU,wDAAzB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gGAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mBAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mFAA0E,UAEnF,CAAA,EACP,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,2EACV,GAAM,MAAQ,gBACb,CAAA,CACA,GACL,IAAS,IAAA,GAON,MANF,EAAA,EAAA,KAAC,EAAD,CAAQ,QAAA,GAAQ,KAAK,KAAK,QAAQ,sBAChC,EAAA,EAAA,MAAC,IAAD,CAAG,KAAM,EAAe,EAAM,WAAY,EAAK,KAAM,GAAK,UAA1D,EACE,EAAA,EAAA,KAAC,EAAD,CAAY,KAAM,EAAgB,cAAY,OAAS,CAAA,CAAA,WAErD,GACG,CAAA,CAEP,IACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yDAAf,CACG,EAAM,UAAY,IAAA,IACjB,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,sBACV,KAAK,UACL,MAAM,mBACN,KAAK,iDACL,CAAA,CACA,KACH,EAAM,SAAS,OAAS,WACvB,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,sBACV,KAAK,UACL,MAAM,kBACN,KAAK,6BACL,CAAA,CACA,KACH,EAAM,SAAS,OAAS,QACvB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,kLACZ,EAAM,QAAQ,KACX,CAAA,CACJ,KACH,EAAM,SAAS,OAAS,SACvB,EAAA,EAAA,KAAC,MAAD,CACE,UAAU,wEACV,IAAK,EAAM,QAAQ,IACnB,IAAK,EAAS,EAAM,QAAQ,KAAK,KAAK,CACtC,CAAA,CACA,KACH,EAAM,SAAS,OAAS,UACvB,EAAA,EAAA,KAAC,EAAD,CAAe,KAAK,sEAAwE,CAAA,CAC1F,KACH,EAAM,SAAS,OAAS,SACvB,EAAA,EAAA,KAAC,EAAD,CAAe,KAAK,2DAA6D,CAAA,CAC/E,KACA,GACQ,GAIpB,SAAS,EAAc,EAAyB,CAC9C,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gEAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAY,UAAU,gCAAgC,KAAM,EAAM,cAAY,OAAS,CAAA,EACvF,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,uDAA+C,EAAM,KAAS,CAAA,CACvE,GAIV,SAAS,EAAa,EASnB,CACD,OACE,EAAA,EAAA,MAAC,EAAD,CAAe,UAAU,eAAzB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mDAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mFAA0E,UAEnF,CAAA,EACP,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,kDAAyC,wCAElD,CAAA,CACA,CAAA,CAAA,CACL,EAAM,SAAU,EAAA,EAAA,KAAC,EAAD,CAAA,SAAmB,aAA8B,CAAA,CAAG,KACjE,IAEN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2BAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAgB,MAAM,iBAClB,EAAM,cAEJ,EAAM,MAAM,SAAW,GACzB,EAAA,EAAA,KAAC,EAAD,CAAc,KAAK,0BAA4B,CAAA,EAE/C,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACZ,EAAM,MAAM,IAAK,IAChB,EAAA,EAAA,MAAC,MAAD,CACE,UAAU,oHADZ,EAIE,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,2BAAhB,CACG,EAAK,cAAc,IAAE,EAAK,SACtB,IACP,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,0CAAhB,CACG,EAAK,KAAK,IAAE,EAAK,SACb,GACH,EARC,GAAG,EAAK,cAAc,GAAG,EAAK,WAQ/B,CACN,CACE,CAAA,EAlBN,EAAA,EAAA,KAAC,EAAD,CAAc,KAAK,qDAAuD,CAAA,CAoB7D,CAAA,EAEjB,EAAA,EAAA,KAAC,EAAD,CAAgB,MAAM,qBAClB,EAAM,kBAEJ,EAAM,UAAU,SAAW,GAC7B,EAAA,EAAA,KAAC,EAAD,CAAc,KAAK,qCAAuC,CAAA,EAE1D,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACZ,EAAM,UAAU,IAAK,IACpB,EAAA,EAAA,MAAC,EAAD,CACE,UAAW,EACT,kHACA,EAAQ,KAAO,EAAM,mBACnB,0CACH,CAED,KAAK,SACL,QAAQ,QACR,YAAe,EAAM,gBAAgB,EAAQ,GAAG,UATlD,EAWE,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,2CAAhB,EACE,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,wBACV,KAAM,EACN,cAAY,OACZ,CAAA,EACF,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sDACb,CAAC,EAAQ,QAAS,GAAG,EAAQ,KAAK,CAAC,KAAK,IAAI,CACxC,CAAA,CACF,IACP,EAAA,EAAA,KAAC,EAAD,CAAmB,UAAU,qCAC1B,EAAQ,OACS,CAAA,CACb,EAlBF,EAAQ,GAkBN,CACT,CACE,CAAA,EAhCN,EAAA,EAAA,KAAC,EAAD,CAAc,KAAK,uDAAyD,CAAA,CAkC/D,CAAA,CAEhB,EAAM,kBAAkB,OAAS,GAChC,EAAA,EAAA,KAAC,EAAD,CAAgB,MAAM,wBACnB,EAAM,OAAS,IAAA,IACd,EAAA,EAAA,KAAC,EAAD,CAAc,KAAK,qCAAuC,CAAA,EAE1D,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,sBAAf,EACE,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,SACN,KAAM,EAAM,KAAK,OACjB,UAAW,EAAM,KAAK,gBACtB,CAAA,EACF,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,SACN,KAAM,EAAM,KAAK,OACjB,UAAW,EAAM,KAAK,gBACtB,CAAA,CACE,GAEO,CAAA,CACf,KACA,GACQ,GAIpB,SAAS,EAAe,EAA+C,CACrE,OACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,sBAAnB,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,uFACX,EAAM,MACJ,CAAA,CACJ,EAAM,SACC,GAId,SAAS,EAAa,EAAyB,CAC7C,OACE,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,kHACV,EAAM,KACL,CAAA,CAIR,SAAS,EAAS,EAA4D,CAC5E,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+EAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+JAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAM,MAAa,CAAA,CACzB,EAAM,WAAY,EAAA,EAAA,KAAC,OAAD,CAAA,SAAM,YAAgB,CAAA,CAAG,KACxC,IACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,0HACZ,EAAM,MAAQ,YACX,CAAA,CACF,GAIV,eAAe,EACb,EACA,EACA,EACA,EAAsB,UACV,CACZ,IAAM,EAAW,MAAM,MAAM,EAAK,CAAE,QAAO,SAAQ,CAAC,CACpD,GAAI,CAAC,EAAS,GACZ,MAAU,MAAM,MAAM,EAAqB,EAAU,EAAM,CAAC,CAE9D,OAAQ,MAAM,EAAS,MAAM,CAG/B,SAAS,EAAmB,EAA0D,CACpF,IAAM,EAAW,IAAa,IAAM,EAAE,CAAG,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,CACtE,EAAc,CAAC,CAAE,MAAO,IAAK,KAAM,IAAK,CAAC,CAC/C,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAS,OAAQ,GAAS,EACpD,EAAY,KAAK,CACf,MAAO,EAAS,IAAU,GAC1B,KAAM,EAAS,MAAM,EAAG,EAAQ,EAAE,CAAC,KAAK,IAAI,CAC7C,CAAC,CAEJ,OAAO,EAGT,SAAS,EAAe,EAAoB,EAAkB,EAAW,GAAe,CACtF,IAAM,EAAS,IAAI,gBAAgB,CAAE,KAAM,EAAU,CAAC,CAEtD,OADI,GAAU,EAAO,IAAI,WAAY,IAAI,CAClC,cAAc,mBAAmB,EAAW,CAAC,iBAAiB,IAGvE,SAAS,EAAc,EAA0B,CAC/C,IAAM,EAAO,EAAS,EAAS,CAAC,aAAa,CACvC,EAAM,EAAK,YAAY,IAAI,CACjC,OAAO,EAAM,EAAI,EAAO,EAAK,MAAM,EAAM,EAAE,CAG7C,SAAS,EAAS,EAA0B,CAC1C,OAAO,EAAS,MAAM,IAAI,CAAC,GAAG,GAAG,EAAI,EAGvC,SAAS,EAAY,EAAkC,CAIrD,OAHI,IAAS,IAAA,GAAkB,IAC3B,EAAO,KAAa,GAAG,EAAK,IAC5B,EAAO,KAAO,KAAa,IAAI,EAAO,MAAM,QAAQ,EAAE,CAAC,MACpD,IAAI,GAAQ,KAAO,OAAO,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,r as t,s as n,t as r}from"./utils-C9GMruoG.js";import{C as i,D as a,E as o,F as s,O as c,Q as l,S as u,T as d,W as f,c as p,n as m,o as h,q as g,w as _,z as v}from"./index-Bh7RLPBw.js";var y=n(e(),1),b=new Map([[`bold`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,48H180V36A28,28,0,0,0,152,8H104A28,28,0,0,0,76,36V48H40a12,12,0,0,0,0,24h4V208a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V72h4a12,12,0,0,0,0-24ZM100,36a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4V48H100Zm88,168H68V72H188ZM116,104v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Zm48,0v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Z`}))],[`duotone`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M200,56V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V56Z`,opacity:`0.2`}),y.createElement(`path`,{d:`M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z`}))],[`fill`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z`}))],[`light`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,50H174V40a22,22,0,0,0-22-22H104A22,22,0,0,0,82,40V50H40a6,6,0,0,0,0,12H50V208a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V62h10a6,6,0,0,0,0-12ZM94,40a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10V50H94ZM194,208a2,2,0,0,1-2,2H64a2,2,0,0,1-2-2V62H194ZM110,104v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Zm48,0v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Z`}))],[`regular`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z`}))],[`thin`,y.createElement(y.Fragment,null,y.createElement(`path`,{d:`M216,52H172V40a20,20,0,0,0-20-20H104A20,20,0,0,0,84,40V52H40a4,4,0,0,0,0,8H52V208a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V60h12a4,4,0,0,0,0-8ZM92,40a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12V52H92ZM196,208a4,4,0,0,1-4,4H64a4,4,0,0,1-4-4V60H196ZM108,104v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Zm48,0v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Z`}))]]),x=y.forwardRef((e,t)=>y.createElement(f,{ref:t,...e,weights:b}));x.displayName=`TrashIcon`;var S=x,C=t();function w(e){return e.sessionsEnabled?e.sessions.length===0?(0,C.jsx)(h,{"aria-label":`Sessions`,children:(0,C.jsx)(m,{title:e.sessionLoadState===`loading`?`Loading sessions`:`No sessions`,text:e.sessionLoadState===`loading`?`Reading saved Studio sessions.`:`Start a chat to create a Studio session.`})}):(0,C.jsx)(h,{className:`overflow-auto pb-6 pr-6`,"aria-label":`Sessions`,children:(0,C.jsxs)(p,{className:`h-full min-w-225`,children:[(0,C.jsxs)(`div`,{className:`sticky top-0 z-10 grid min-h-11 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b bg-background/95 px-4 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground backdrop-blur`,children:[(0,C.jsx)(`span`,{children:`Session`}),(0,C.jsx)(`span`,{children:`Agent`}),(0,C.jsx)(`span`,{children:`Messages`}),(0,C.jsx)(`span`,{children:`Updated`}),(0,C.jsx)(`span`,{className:`sr-only`,children:`Actions`})]}),e.sessions.map(t=>(0,C.jsxs)(`div`,{className:r(`grid min-h-14 w-full min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b px-4 text-left text-muted-foreground transition duration-200 hover:bg-accent/80 hover:text-accent-foreground`,t.id===e.selectedSessionId&&`bg-muted/45 text-foreground`),children:[(0,C.jsxs)(s,{className:`col-span-4 grid h-full min-h-14 min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px] items-center justify-start gap-4 border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit`,type:`button`,variant:`ghost`,onClick:()=>e.onOpenSession(t.id),children:[(0,C.jsxs)(`span`,{className:`grid min-w-0 gap-0.5`,children:[(0,C.jsx)(`strong`,{className:`min-w-0 truncate text-sm font-medium text-foreground`,children:t.title??`Untitled chat`}),(0,C.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium text-muted-foreground`,children:t.id})]}),(0,C.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium`,children:g(e.agents,t.agentId)}),(0,C.jsxs)(`span`,{className:`text-xs font-medium tabular-nums text-muted-foreground`,children:[t.messageCount,` messages`]}),(0,C.jsx)(`time`,{className:`text-xs font-medium text-muted-foreground`,children:l(t.updatedAt)})]}),(0,C.jsxs)(`span`,{className:`flex items-center justify-end gap-1`,children:[(0,C.jsx)(s,{"aria-label":`View tracing for ${t.title??`Untitled chat`}`,className:`h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-foreground hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5`,size:`icon`,type:`button`,variant:`ghost`,onClick:n=>{n.stopPropagation(),e.onViewSessionTracing(t.id)},children:(0,C.jsx)(u,{icon:v,"aria-hidden":`true`})}),(0,C.jsx)(s,{"aria-label":`Delete ${t.title??`Untitled chat`}`,className:`h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-destructive hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5`,size:`icon`,type:`button`,variant:`ghost`,onClick:n=>{n.stopPropagation(),e.onDeleteSession(t)},children:(0,C.jsx)(u,{icon:S,"aria-hidden":`true`})})]})]},t.id))]})}):(0,C.jsx)(h,{"aria-label":`Sessions`,children:(0,C.jsx)(m,{className:`h-full`,title:`Sessions unavailable`,text:`This Studio runtime does not expose saved sessions.`})})}function T(e){let t=e.session?.title??`Untitled chat`;return(0,C.jsx)(i,{open:e.session!==void 0,onOpenChange:e.onOpenChange,children:(0,C.jsxs)(_,{children:[(0,C.jsxs)(a,{children:[(0,C.jsx)(c,{children:`Delete session`}),(0,C.jsxs)(d,{children:[`Delete "`,t,`" and its traces. This cannot be undone.`]})]}),(0,C.jsxs)(o,{children:[(0,C.jsx)(s,{type:`button`,variant:`ghost`,onClick:()=>e.onOpenChange(!1),children:`Cancel`}),(0,C.jsx)(s,{type:`button`,variant:`destructive`,onClick:()=>{e.session!==void 0&&e.onConfirm(e.session)},children:`Delete`})]})]})})}export{T as DeleteSessionDialog,w as SessionsPage};
|
|
2
|
+
//# sourceMappingURL=sessions-page-CSN2vSKZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions-page-CSN2vSKZ.js","names":["s","e","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/Trash.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/Trash.es.js","../../../src/ui/app/modules/sessions/sessions-page.tsx"],"sourcesContent":["import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H180V36A28,28,0,0,0,152,8H104A28,28,0,0,0,76,36V48H40a12,12,0,0,0,0,24h4V208a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V72h4a12,12,0,0,0,0-24ZM100,36a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4V48H100Zm88,168H68V72H188ZM116,104v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Zm48,0v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,56V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V56Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,50H174V40a22,22,0,0,0-22-22H104A22,22,0,0,0,82,40V50H40a6,6,0,0,0,0,12H50V208a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V62h10a6,6,0,0,0,0-12ZM94,40a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10V50H94ZM194,208a2,2,0,0,1-2,2H64a2,2,0,0,1-2-2V62H194ZM110,104v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Zm48,0v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,52H172V40a20,20,0,0,0-20-20H104A20,20,0,0,0,84,40V52H40a4,4,0,0,0,0,8H52V208a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V60h12a4,4,0,0,0,0-8ZM92,40a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12V52H92ZM196,208a4,4,0,0,1-4,4H64a4,4,0,0,1-4-4V60H196ZM108,104v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Zm48,0v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Z\" }))\n ]\n]);\nexport {\n e as default\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Trash.es.js\";\nconst r = o.forwardRef((a, e) => /* @__PURE__ */ o.createElement(s, { ref: e, ...a, weights: t }));\nr.displayName = \"TrashIcon\";\nconst n = r;\nexport {\n n as Trash,\n r as TrashIcon\n};\n","import { Pulse, Trash } from \"@phosphor-icons/react\";\nimport type { StudioConfig, StudioSessionSummary } from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../../components/ui/dialog\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { StudioEmptyState, StudioPageShell, StudioSurface } from \"../../components/ui/studio\";\nimport { cn } from \"../../lib/utils\";\nimport { agentLabel, formatRelativeTime } from \"../shared/format\";\nimport type { SessionLoadState } from \"../shared/types\";\n\nexport function SessionsPage(props: {\n agents: StudioConfig[\"agents\"];\n sessions: StudioSessionSummary[];\n sessionsEnabled: boolean;\n sessionLoadState: SessionLoadState;\n selectedSessionId: string;\n onOpenSession: (sessionId: string) => void;\n onViewSessionTracing: (sessionId: string) => void;\n onDeleteSession: (session: StudioSessionSummary) => void;\n}) {\n if (!props.sessionsEnabled) {\n return (\n <StudioPageShell aria-label=\"Sessions\">\n <StudioEmptyState\n className=\"h-full\"\n title=\"Sessions unavailable\"\n text=\"This Studio runtime does not expose saved sessions.\"\n />\n </StudioPageShell>\n );\n }\n if (props.sessions.length === 0) {\n return (\n <StudioPageShell aria-label=\"Sessions\">\n <StudioEmptyState\n title={props.sessionLoadState === \"loading\" ? \"Loading sessions\" : \"No sessions\"}\n text={\n props.sessionLoadState === \"loading\"\n ? \"Reading saved Studio sessions.\"\n : \"Start a chat to create a Studio session.\"\n }\n />\n </StudioPageShell>\n );\n }\n\n return (\n <StudioPageShell className=\"overflow-auto pb-6 pr-6\" aria-label=\"Sessions\">\n <StudioSurface className=\"h-full min-w-225\">\n <div className=\"sticky top-0 z-10 grid min-h-11 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b bg-background/95 px-4 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground backdrop-blur\">\n <span>Session</span>\n <span>Agent</span>\n <span>Messages</span>\n <span>Updated</span>\n <span className=\"sr-only\">Actions</span>\n </div>\n {props.sessions.map((session) => (\n <div\n className={cn(\n \"grid min-h-14 w-full min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px_72px] items-center gap-4 border-b px-4 text-left text-muted-foreground transition duration-200 hover:bg-accent/80 hover:text-accent-foreground\",\n session.id === props.selectedSessionId && \"bg-muted/45 text-foreground\",\n )}\n key={session.id}\n >\n <Button\n className=\"col-span-4 grid h-full min-h-14 min-w-0 grid-cols-[minmax(220px,1.3fr)_180px_120px_120px] items-center justify-start gap-4 border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onOpenSession(session.id)}\n >\n <span className=\"grid min-w-0 gap-0.5\">\n <strong className=\"min-w-0 truncate text-sm font-medium text-foreground\">\n {session.title ?? \"Untitled chat\"}\n </strong>\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {session.id}\n </span>\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {agentLabel(props.agents, session.agentId)}\n </span>\n <span className=\"text-xs font-medium tabular-nums text-muted-foreground\">\n {session.messageCount} messages\n </span>\n <time className=\"text-xs font-medium text-muted-foreground\">\n {formatRelativeTime(session.updatedAt)}\n </time>\n </Button>\n <span className=\"flex items-center justify-end gap-1\">\n <Button\n aria-label={`View tracing for ${session.title ?? \"Untitled chat\"}`}\n className=\"h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-foreground hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n props.onViewSessionTracing(session.id);\n }}\n >\n <StudioIcon icon={Pulse} aria-hidden=\"true\" />\n </Button>\n <Button\n aria-label={`Delete ${session.title ?? \"Untitled chat\"}`}\n className=\"h-7 min-h-7 w-7 border-0 bg-transparent p-0 text-muted-foreground opacity-80 hover:bg-transparent hover:text-destructive hover:opacity-100 [&_svg]:h-3.5 [&_svg]:w-3.5\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n props.onDeleteSession(session);\n }}\n >\n <StudioIcon icon={Trash} aria-hidden=\"true\" />\n </Button>\n </span>\n </div>\n ))}\n </StudioSurface>\n </StudioPageShell>\n );\n}\n\nexport function DeleteSessionDialog(props: {\n session: StudioSessionSummary | undefined;\n onOpenChange: (open: boolean) => void;\n onConfirm: (session: StudioSessionSummary) => void;\n}) {\n const title = props.session?.title ?? \"Untitled chat\";\n\n return (\n <Dialog open={props.session !== undefined} onOpenChange={props.onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete session</DialogTitle>\n <DialogDescription>\n Delete \"{title}\" and its traces. This cannot be undone.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={() => props.onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={() => {\n if (props.session !== undefined) {\n props.onConfirm(props.session);\n }\n }}\n >\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,r as t,s as n}from"./utils-C9GMruoG.js";import{F as r,Q as i,a,i as o,n as s,o as c,r as l}from"./index-Bh7RLPBw.js";import{t as u}from"./badge-RJJoRC4P.js";import{t as d}from"./renderers-B8gvjR2u.js";var f=n(e(),1),p=t();function m(e){let[t,n]=(0,f.useState)(),[i,u]=(0,f.useState)(!1),[d,m]=(0,f.useState)(``),g=(0,f.useCallback)(async()=>{if(!e.enabled){n(void 0);return}u(!0),m(``);try{let e=await fetch(`/status`);if(!e.ok)throw Error(`Status failed with HTTP ${e.status}`);n(await e.json())}catch(e){m(e instanceof Error?e.message:String(e)),n(void 0)}finally{u(!1)}},[e.enabled]);return(0,f.useEffect)(()=>{g()},[g]),(0,p.jsxs)(c,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":`Status`,children:[(0,p.jsx)(a,{title:`Status`,description:`Runtime health, storage adapters, feature capabilities, and current record counts.`,action:(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start`,children:[(0,p.jsx)(l,{label:`agents`,value:t?.counts.agents??0}),(0,p.jsx)(l,{label:`sessions`,value:t?.counts.sessions??`-`}),(0,p.jsx)(l,{label:`traces`,value:t?.counts.traces??`-`}),(0,p.jsx)(r,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:`secondary`,disabled:i,onClick:()=>void g(),children:`Refresh`})]})}),(0,p.jsx)(o,{className:`overflow-auto`,children:e.enabled?i&&t===void 0?(0,p.jsx)(s,{title:`Loading status`,text:`Reading runtime status.`}):d.length>0?(0,p.jsx)(s,{title:`Status error`,text:d}):t===void 0?null:(0,p.jsx)(h,{summary:t}):(0,p.jsx)(s,{title:`Status unavailable`,text:`This Studio runtime did not expose status.`})})]})}function h(e){let t=Object.entries(e.summary.capabilities).filter(([,e])=>e?.enabled===!0).length;return(0,p.jsxs)(`div`,{className:`grid h-full min-h-0 gap-5 border-t border-border/80 pt-4`,children:[(0,p.jsxs)(`section`,{className:`grid gap-5 xl:grid-cols-[minmax(280px,0.58fr)_minmax(0,1.42fr)]`,children:[(0,p.jsx)(g,{summary:e.summary,enabledCapabilityCount:t}),(0,p.jsxs)(`div`,{className:`grid gap-5 lg:grid-cols-2`,children:[(0,p.jsx)(_,{storage:e.summary.storage}),(0,p.jsx)(v,{counts:e.summary.counts})]})]}),(0,p.jsxs)(`section`,{className:`grid gap-5 xl:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]`,children:[(0,p.jsx)(y,{capabilities:e.summary.capabilities}),(0,p.jsx)(b,{summary:e.summary})]})]})}function g(e){return(0,p.jsxs)(`section`,{className:`grid content-start gap-5 border-b border-border/80 pb-5 xl:border-b-0 xl:border-r xl:pb-0 xl:pr-5`,children:[(0,p.jsxs)(`div`,{className:`grid gap-3`,children:[(0,p.jsx)(S,{children:`runtime`}),(0,p.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,p.jsx)(u,{className:`border-border/80 bg-muted/45 text-foreground`,children:`online`}),(0,p.jsxs)(u,{className:`border-border/80 bg-background/45 text-muted-foreground`,children:[e.enabledCapabilityCount,` capabilities`]})]})]}),(0,p.jsxs)(`div`,{className:`grid border-y border-border/80`,children:[(0,p.jsx)(C,{label:`id`,value:e.summary.runner.id}),(0,p.jsx)(C,{label:`name`,value:e.summary.runner.name??`-`}),(0,p.jsx)(C,{label:`version`,value:e.summary.runner.version??`-`}),(0,p.jsx)(C,{label:`generated`,value:`${i(e.summary.generatedAt)} / ${e.summary.generatedAt}`})]})]})}function _(e){let t=Object.entries(e.storage);return(0,p.jsxs)(`section`,{className:`grid content-start gap-3`,children:[(0,p.jsx)(x,{title:`storage`,value:`${t.length} adapters`}),t.length===0?(0,p.jsx)(T,{text:`No storage adapters reported.`}):(0,p.jsx)(`div`,{className:`grid border-y border-border/80`,children:t.map(([e,t])=>(0,p.jsx)(w,{label:E(e),value:t??`-`,tone:t===void 0?`muted`:`normal`},e))})]})}function v(e){let t=Object.entries(e.counts).filter(e=>typeof e[1]==`number`);return(0,p.jsxs)(`section`,{className:`grid content-start gap-3`,children:[(0,p.jsx)(x,{title:`records`,value:`${t.length} counters`}),(0,p.jsx)(`div`,{className:`grid border-y border-border/80`,children:t.map(([e,t])=>(0,p.jsx)(w,{label:E(e),value:t},e))})]})}function y(e){let t=Object.entries(e.capabilities);return(0,p.jsxs)(`section`,{className:`grid content-start gap-3`,children:[(0,p.jsx)(x,{title:`capabilities`,value:`${t.length} reported`}),t.length===0?(0,p.jsx)(T,{text:`No capabilities reported.`}):(0,p.jsx)(`div`,{className:`grid border-y border-border/80 sm:grid-cols-2 sm:divide-x sm:divide-border/80`,children:t.map(([e,n],r)=>(0,p.jsxs)(`div`,{className:[`grid min-w-0 gap-1 border-b border-border/70 px-3 py-3`,r>=t.length-(t.length%2==0?2:1)?`sm:border-b-0`:``].join(` `),children:[(0,p.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,p.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:E(e)}),(0,p.jsx)(`span`,{className:n?.enabled?`text-xs font-medium text-foreground`:`text-xs font-medium text-muted-foreground`,children:n?.enabled?`enabled`:`disabled`})]}),n?.reason===void 0?null:(0,p.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:n.reason})]},e))})]})}function b(e){return(0,p.jsxs)(`section`,{className:`grid min-w-0 content-start gap-3`,children:[(0,p.jsx)(x,{title:`raw summary`,value:`JSON`}),(0,p.jsxs)(`details`,{className:`group grid min-w-0 overflow-hidden border-y border-border/80`,open:!0,children:[(0,p.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:[`Payload`,(0,p.jsx)(`span`,{className:`font-medium normal-case tracking-normal group-open:hidden`,children:`Show`}),(0,p.jsx)(`span`,{className:`hidden font-medium normal-case tracking-normal group-open:inline`,children:`Hide`})]}),(0,p.jsx)(`div`,{className:`min-w-0 overflow-x-auto border-t border-border/70`,children:(0,p.jsx)(`pre`,{className:`m-0 max-h-[28rem] min-w-max p-4 text-xs leading-5 text-foreground`,children:(0,p.jsx)(`code`,{children:(0,p.jsx)(d,{text:JSON.stringify(e.summary,null,2)})})})})]})]})}function x(e){return(0,p.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,p.jsx)(S,{children:e.title}),(0,p.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:e.value})]})}function S(e){return(0,p.jsx)(`h2`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:e.children})}function C(e){return(0,p.jsxs)(`div`,{className:`grid min-w-0 gap-1 border-b border-border/70 px-3 py-3 first:pt-3 last:border-b-0`,children:[(0,p.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.label}),(0,p.jsx)(`span`,{className:`min-w-0 truncate text-sm text-foreground`,title:String(e.value),children:e.value})]})}function w(e){return(0,p.jsxs)(`div`,{className:`grid min-w-0 grid-cols-[minmax(120px,0.5fr)_minmax(0,1fr)] gap-3 border-b border-border/70 px-3 py-3 last:border-b-0`,children:[(0,p.jsx)(`span`,{className:`min-w-0 truncate text-sm font-medium text-muted-foreground`,children:e.label}),(0,p.jsx)(`span`,{className:[`min-w-0 truncate text-right text-sm font-semibold tabular-nums`,e.tone===`muted`?`text-muted-foreground`:`text-foreground`].join(` `),title:String(e.value),children:e.value})]})}function T(e){return(0,p.jsx)(`div`,{className:`border-y border-dashed border-border/80 px-3 py-8 text-center text-sm text-muted-foreground`,children:e.text})}function E(e){return e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/[_-]+/g,` `).toLowerCase()}export{m as StatusPage};
|
|
2
|
+
//# sourceMappingURL=status-page-CgRNt0wi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-page-CgRNt0wi.js","names":[],"sources":["../../../src/ui/app/modules/status/status-page.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { StudioStatusSummary } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n StudioEmptyState,\n StudioHeaderMetric,\n StudioPageContent,\n StudioPageHeader,\n StudioPageShell,\n} from \"../../components/ui/studio\";\nimport { formatRelativeTime } from \"../shared/format\";\nimport { JsonSyntax } from \"../shared/renderers\";\n\nexport function StatusPage(props: { enabled: boolean }) {\n const [summary, setSummary] = useState<StudioStatusSummary | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const loadStatus = useCallback(async () => {\n if (!props.enabled) {\n setSummary(undefined);\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n const response = await fetch(\"/status\");\n if (!response.ok) {\n throw new Error(`Status failed with HTTP ${response.status}`);\n }\n setSummary((await response.json()) as StudioStatusSummary);\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError));\n setSummary(undefined);\n } finally {\n setLoading(false);\n }\n }, [props.enabled]);\n\n useEffect(() => {\n void loadStatus();\n }, [loadStatus]);\n\n return (\n <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Status\">\n <StudioPageHeader\n title=\"Status\"\n description=\"Runtime health, storage adapters, feature capabilities, and current record counts.\"\n action={\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start\">\n <StudioHeaderMetric label=\"agents\" value={summary?.counts.agents ?? 0} />\n <StudioHeaderMetric label=\"sessions\" value={summary?.counts.sessions ?? \"-\"} />\n <StudioHeaderMetric label=\"traces\" value={summary?.counts.traces ?? \"-\"} />\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant=\"secondary\"\n disabled={loading}\n onClick={() => void loadStatus()}\n >\n Refresh\n </Button>\n </div>\n }\n />\n\n <StudioPageContent className=\"overflow-auto\">\n {!props.enabled ? (\n <StudioEmptyState\n title=\"Status unavailable\"\n text=\"This Studio runtime did not expose status.\"\n />\n ) : loading && summary === undefined ? (\n <StudioEmptyState title=\"Loading status\" text=\"Reading runtime status.\" />\n ) : error.length > 0 ? (\n <StudioEmptyState title=\"Status error\" text={error} />\n ) : summary === undefined ? null : (\n <StatusDashboard summary={summary} />\n )}\n </StudioPageContent>\n </StudioPageShell>\n );\n}\n\nfunction StatusDashboard(props: { summary: StudioStatusSummary }) {\n const capabilityEntries = Object.entries(props.summary.capabilities);\n const enabledCapabilityCount = capabilityEntries.filter(\n ([, capability]) => capability?.enabled === true,\n ).length;\n\n return (\n <div className=\"grid h-full min-h-0 gap-5 border-t border-border/80 pt-4\">\n <section className=\"grid gap-5 xl:grid-cols-[minmax(280px,0.58fr)_minmax(0,1.42fr)]\">\n <RuntimeSummary summary={props.summary} enabledCapabilityCount={enabledCapabilityCount} />\n <div className=\"grid gap-5 lg:grid-cols-2\">\n <StorageMatrix storage={props.summary.storage} />\n <CountsLedger counts={props.summary.counts} />\n </div>\n </section>\n <section className=\"grid gap-5 xl:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]\">\n <CapabilityLedger capabilities={props.summary.capabilities} />\n <RawSummary summary={props.summary} />\n </section>\n </div>\n );\n}\n\nfunction RuntimeSummary(props: { summary: StudioStatusSummary; enabledCapabilityCount: number }) {\n return (\n <section className=\"grid content-start gap-5 border-b border-border/80 pb-5 xl:border-b-0 xl:border-r xl:pb-0 xl:pr-5\">\n <div className=\"grid gap-3\">\n <SectionLabel>runtime</SectionLabel>\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Badge className=\"border-border/80 bg-muted/45 text-foreground\">online</Badge>\n <Badge className=\"border-border/80 bg-background/45 text-muted-foreground\">\n {props.enabledCapabilityCount} capabilities\n </Badge>\n </div>\n </div>\n <div className=\"grid border-y border-border/80\">\n <StatusFact label=\"id\" value={props.summary.runner.id} />\n <StatusFact label=\"name\" value={props.summary.runner.name ?? \"-\"} />\n <StatusFact label=\"version\" value={props.summary.runner.version ?? \"-\"} />\n <StatusFact\n label=\"generated\"\n value={`${formatRelativeTime(props.summary.generatedAt)} / ${props.summary.generatedAt}`}\n />\n </div>\n </section>\n );\n}\n\nfunction StorageMatrix(props: { storage: StudioStatusSummary[\"storage\"] }) {\n const entries = Object.entries(props.storage);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"storage\" value={`${entries.length} adapters`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No storage adapters reported.\" />\n ) : (\n <div className=\"grid border-y border-border/80\">\n {entries.map(([key, value]) => (\n <StatusRow\n label={humanizeKey(key)}\n value={value ?? \"-\"}\n key={key}\n tone={value === undefined ? \"muted\" : \"normal\"}\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction CountsLedger(props: { counts: StudioStatusSummary[\"counts\"] }) {\n const entries = Object.entries(props.counts).filter((entry): entry is [string, number] => {\n return typeof entry[1] === \"number\";\n });\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"records\" value={`${entries.length} counters`} />\n <div className=\"grid border-y border-border/80\">\n {entries.map(([key, value]) => (\n <StatusRow label={humanizeKey(key)} value={value} key={key} />\n ))}\n </div>\n </section>\n );\n}\n\nfunction CapabilityLedger(props: { capabilities: StudioStatusSummary[\"capabilities\"] }) {\n const entries = Object.entries(props.capabilities);\n return (\n <section className=\"grid content-start gap-3\">\n <SectionHeader title=\"capabilities\" value={`${entries.length} reported`} />\n {entries.length === 0 ? (\n <DashedNote text=\"No capabilities reported.\" />\n ) : (\n <div className=\"grid border-y border-border/80 sm:grid-cols-2 sm:divide-x sm:divide-border/80\">\n {entries.map(([name, capability], index) => (\n <div\n className={[\n \"grid min-w-0 gap-1 border-b border-border/70 px-3 py-3\",\n index >= entries.length - (entries.length % 2 === 0 ? 2 : 1) ? \"sm:border-b-0\" : \"\",\n ].join(\" \")}\n key={name}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {humanizeKey(name)}\n </span>\n <span\n className={\n capability?.enabled\n ? \"text-xs font-medium text-foreground\"\n : \"text-xs font-medium text-muted-foreground\"\n }\n >\n {capability?.enabled ? \"enabled\" : \"disabled\"}\n </span>\n </div>\n {capability?.reason === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{capability.reason}</p>\n )}\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction RawSummary(props: { summary: StudioStatusSummary }) {\n return (\n <section className=\"grid min-w-0 content-start gap-3\">\n <SectionHeader title=\"raw summary\" value=\"JSON\" />\n <details className=\"group grid min-w-0 overflow-hidden border-y border-border/80\" open>\n <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\">\n Payload\n <span className=\"font-medium normal-case tracking-normal group-open:hidden\">Show</span>\n <span className=\"hidden font-medium normal-case tracking-normal group-open:inline\">\n Hide\n </span>\n </summary>\n <div className=\"min-w-0 overflow-x-auto border-t border-border/70\">\n <pre className=\"m-0 max-h-[28rem] min-w-max p-4 text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={JSON.stringify(props.summary, null, 2)} />\n </code>\n </pre>\n </div>\n </details>\n </section>\n );\n}\n\nfunction SectionHeader(props: { title: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <SectionLabel>{props.title}</SectionLabel>\n <span className=\"text-xs font-medium text-muted-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction SectionLabel(props: { children: string }) {\n return (\n <h2 className=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n {props.children}\n </h2>\n );\n}\n\nfunction StatusFact(props: { label: string; value: string | number }) {\n return (\n <div className=\"grid min-w-0 gap-1 border-b border-border/70 px-3 py-3 first:pt-3 last:border-b-0\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.label}\n </span>\n <span className=\"min-w-0 truncate text-sm text-foreground\" title={String(props.value)}>\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction StatusRow(props: { label: string; value: string | number; tone?: \"normal\" | \"muted\" }) {\n return (\n <div className=\"grid min-w-0 grid-cols-[minmax(120px,0.5fr)_minmax(0,1fr)] gap-3 border-b border-border/70 px-3 py-3 last:border-b-0\">\n <span className=\"min-w-0 truncate text-sm font-medium text-muted-foreground\">\n {props.label}\n </span>\n <span\n className={[\n \"min-w-0 truncate text-right text-sm font-semibold tabular-nums\",\n props.tone === \"muted\" ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n title={String(props.value)}\n >\n {props.value}\n </span>\n </div>\n );\n}\n\nfunction DashedNote(props: { text: string }) {\n return (\n <div className=\"border-y border-dashed border-border/80 px-3 py-8 text-center text-sm text-muted-foreground\">\n {props.text}\n </div>\n );\n}\n\nfunction humanizeKey(value: string): string {\n return value\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .toLowerCase();\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,r as t,s as n}from"./utils-C9GMruoG.js";import{F as r,at as i,d as a,f as o,m as s,p as c,rt as l,t as u,u as d}from"./index-Bh7RLPBw.js";import{t as f}from"./badge-RJJoRC4P.js";import{t as ee}from"./renderers-B8gvjR2u.js";import{t as p}from"./input-BOUv3rgO.js";var m=n(e(),1),h=t();function g(e){let[t,n]=(0,m.useState)(`form`),r=(0,m.useMemo)(()=>T(e.schema),[e.schema]),a=(0,m.useMemo)(()=>F(e.value),[e.value]),o=e.disabled===!0,s=r.length>0,c=s?t:`json`,l=a.ok&&i(a.value)?a.value:void 0;function u(t,n){let r=l??{};e.onChange(z(P(r,t,n)))}function d(t,n){let r=l??{},i=N(r,t);Array.isArray(i)&&e.onChange(z(P(r,t,i.filter((e,t)=>t!==n))))}return(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-3`,children:[(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Arguments`}),s?(0,h.jsxs)(`div`,{className:`inline-grid h-8 grid-cols-2 overflow-hidden rounded-md border border-border/80 bg-background/45 p-0.5`,children:[(0,h.jsx)(_,{active:c===`form`,onClick:()=>n(`form`),children:`Form`}),(0,h.jsx)(_,{active:c===`json`,onClick:()=>n(`json`),children:`JSON`})]}):(0,h.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:`JSON`})]}),c===`json`||l===void 0?(0,h.jsx)(v,{disabled:o,error:a.ok?``:a.error,value:e.value,onChange:e.onChange}):(0,h.jsx)(`div`,{className:`grid gap-3`,children:r.map(e=>(0,h.jsx)(y,{disabled:o,field:e,path:[e.name],rootValue:l,onChange:u,onRemoveArrayItem:d},e.name))})]})}function _(e){return(0,h.jsx)(`button`,{className:e.active?`rounded-[5px] bg-muted/55 px-3 text-xs font-semibold text-foreground`:`rounded-[5px] px-3 text-xs font-medium text-muted-foreground transition hover:text-foreground`,type:`button`,onClick:e.onClick,children:e.children})}function v(e){return(0,h.jsxs)(`div`,{className:`grid gap-2`,children:[(0,h.jsx)(u,{className:`min-h-36 resize-y rounded-md border-border bg-background/45 p-3 text-xs leading-5`,disabled:e.disabled,value:e.value,spellCheck:!1,onChange:t=>e.onChange(t.target.value)}),e.error.length===0?null:(0,h.jsx)(`div`,{className:`rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive`,children:e.error})]})}function y(e){let t=N(e.rootValue,e.path),n=k(e.field.schema,e.field.name),r=A(e.field.schema),i=E(e.field.schema);if(i===`object`){let i=T(e.field.schema);return(0,h.jsxs)(`fieldset`,{className:`grid min-w-0 gap-3 border-b border-border/70 pb-3 last:border-b-0`,children:[(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(`legend`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:n}),e.field.required?(0,h.jsx)(S,{}):null]}),r===void 0?null:(0,h.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:r}),i.length===0?(0,h.jsx)(w,{disabled:e.disabled,path:e.path,value:t,onChange:e.onChange}):(0,h.jsx)(`div`,{className:`grid gap-3 border-l border-border/70 pl-3`,children:i.map(t=>(0,h.jsx)(y,{disabled:e.disabled,field:t,path:[...e.path,t.name],rootValue:e.rootValue,onChange:e.onChange,onRemoveArrayItem:e.onRemoveArrayItem},t.name))})]})}return i===`array`?(0,h.jsx)(b,{description:r,disabled:e.disabled,field:e.field,label:n,path:e.path,rootValue:e.rootValue,value:t,onChange:e.onChange,onRemoveArrayItem:e.onRemoveArrayItem}):(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-2 border-b border-border/70 pb-3 last:border-b-0`,children:[(0,h.jsx)(x,{label:n,required:e.field.required}),r===void 0?null:(0,h.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:r}),(0,h.jsx)(te,{disabled:e.disabled,path:e.path,required:e.field.required,schema:e.field.schema,value:t,onChange:e.onChange})]})}function b(e){let t=D(e.field.schema),n=Array.isArray(e.value)?e.value:[],i=n.map((t,n)=>({index:n,key:`${H(e.path)}:${n}:${V(t)}`}));return(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-3 border-b border-border/70 pb-3 last:border-b-0`,children:[(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(x,{label:e.label,required:e.field.required}),t===void 0?null:(0,h.jsx)(r,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,disabled:e.disabled,type:`button`,variant:`secondary`,onClick:()=>e.onChange(e.path,[...n,M(t)]),children:`Add`})]}),e.description===void 0?null:(0,h.jsx)(`p`,{className:`m-0 text-xs leading-5 text-muted-foreground`,children:e.description}),t===void 0?(0,h.jsx)(w,{disabled:e.disabled,path:e.path,value:e.value,onChange:e.onChange}):n.length===0?(0,h.jsx)(`div`,{className:`rounded-md border border-dashed border-border/70 px-3 py-2 text-xs text-muted-foreground`,children:`Empty array`}):(0,h.jsx)(`div`,{className:`grid gap-3 border-l border-border/70 pl-3`,children:i.map(n=>(0,h.jsxs)(`div`,{className:`grid gap-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,h.jsxs)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:[`Item `,n.index+1]}),(0,h.jsx)(r,{className:`h-7 min-h-7 rounded-md px-2 text-xs`,disabled:e.disabled,type:`button`,variant:`ghost`,onClick:()=>e.onRemoveArrayItem(e.path,n.index),children:`Remove`})]}),(0,h.jsx)(y,{disabled:e.disabled,field:{name:String(n.index+1),required:!0,schema:t},path:[...e.path,n.index],rootValue:e.rootValue,onChange:e.onChange,onRemoveArrayItem:e.onRemoveArrayItem})]},n.key))})]})}function x(e){return(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,h.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.label}),e.required?(0,h.jsx)(S,{}):null]})}function S(){return(0,h.jsx)(`span`,{className:`rounded-md bg-muted/35 px-2 py-0.5 text-[11px] font-medium text-muted-foreground`,children:`required`})}function te(e){let t=O(e.schema);if(t.length>0){let n=t.findIndex(t=>B(t,e.value)),i=t.map((e,t)=>({label:V(e),value:String(t),key:`${t}:${V(e)}`}));return(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,h.jsxs)(d,{value:n===-1?``:String(n),disabled:e.disabled,onValueChange:n=>e.onChange(e.path,t[Number(n)]),children:[(0,h.jsx)(c,{className:`h-9 min-h-9 rounded-md border-border bg-background/45 text-sm`,children:(0,h.jsx)(s,{placeholder:`Select value`})}),(0,h.jsx)(a,{children:i.map(e=>(0,h.jsx)(o,{value:e.value,children:e.label},e.key))})]}),n===-1||e.required?null:(0,h.jsx)(r,{className:`h-9 min-h-9 rounded-md px-3 text-xs`,disabled:e.disabled,type:`button`,variant:`ghost`,onClick:()=>e.onChange(e.path,void 0),children:`Clear`})]})}let n=E(e.schema);return n===`boolean`?(0,h.jsxs)(`label`,{className:`flex min-h-9 w-fit cursor-pointer items-center gap-2 rounded-md border border-border/70 bg-background/45 px-3 text-sm text-foreground`,children:[(0,h.jsx)(`input`,{checked:e.value===!0,disabled:e.disabled,type:`checkbox`,className:`h-4 w-4 accent-foreground`,onChange:t=>e.onChange(e.path,t.target.checked)}),`Enabled`]}):n===`number`||n===`integer`?(0,h.jsx)(C,{disabled:e.disabled,path:e.path,schema:e.schema,type:n,value:e.value,onChange:e.onChange}):n===`string`?(0,h.jsx)(p,{className:`h-9 rounded-md border-border bg-background/45 text-sm`,disabled:e.disabled,type:`text`,value:typeof e.value==`string`?e.value:``,placeholder:j(e.schema),onChange:t=>{let n=t.target.value;e.onChange(e.path,n.length===0&&!e.required?void 0:n)}}):(0,h.jsx)(w,{disabled:e.disabled,path:e.path,value:e.value,onChange:e.onChange})}function C(e){let t=typeof e.value==`number`?String(e.value):``,[n,r]=(0,m.useState)(t);return(0,m.useEffect)(()=>{r(t)},[t]),(0,h.jsx)(p,{className:`h-9 rounded-md border-border bg-background/45 text-sm`,disabled:e.disabled,inputMode:e.type===`integer`?`numeric`:`decimal`,type:`text`,value:n,placeholder:j(e.schema),onBlur:()=>{if(n.trim().length===0){r(``);return}let i=I(n,e.type);r(i.ok?String(i.value):t)},onChange:t=>{let n=t.target.value;if(r(n),n.trim().length===0){e.onChange(e.path,void 0);return}let i=I(n,e.type);i.ok&&e.onChange(e.path,i.value)}})}function w(e){let t=(0,m.useMemo)(()=>R(e.value),[e.value]),[n,r]=(0,m.useState)(t),i=(0,m.useMemo)(()=>F(n),[n]);return(0,m.useEffect)(()=>{r(t)},[t]),(0,h.jsxs)(`div`,{className:`grid gap-2`,children:[(0,h.jsx)(u,{className:`min-h-24 resize-y rounded-md border-border bg-background/45 p-3 text-xs leading-5`,disabled:e.disabled,value:n,spellCheck:!1,onChange:t=>{let n=t.target.value;if(r(n),n.trim().length===0){e.onChange(e.path,void 0);return}let i=F(n);i.ok&&e.onChange(e.path,i.value)}}),i.ok||n.trim().length===0?null:(0,h.jsx)(`div`,{className:`rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive`,children:i.error})]})}function T(e){if(!i(e))return[];let t=e.properties;if(!i(t))return[];let n=ne(e);return Object.entries(t).map(([e,t])=>({name:e,required:n.has(e),schema:i(t)?t:{}}))}function ne(e){let t=e.required;return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`)):new Set}function E(e){let t=e.type;if(typeof t==`string`)return t;if(Array.isArray(t)){let e=t.find(e=>typeof e==`string`&&e!==`null`);if(e!==void 0)return e}return O(e).length>0?`enum`:i(e.properties)?`object`:e.items===void 0?`unknown`:`array`}function D(e){return i(e.items)?e.items:void 0}function O(e){return Array.isArray(e.enum)?e.enum:[]}function k(e,t){return typeof e.title==`string`&&e.title.length>0?e.title:U(t)}function A(e){return typeof e.description==`string`&&e.description.length>0?e.description:void 0}function j(e){return Object.hasOwn(e,`default`)?V(e.default):void 0}function M(e){if(Object.hasOwn(e,`default`))return e.default;let t=O(e);if(t.length>0)return t[0];let n=E(e);return n===`boolean`?!1:n===`integer`||n===`number`?0:n===`array`?[]:n===`object`?{}:n===`string`?``:null}function N(e,t){let n=e;for(let e of t){if(typeof e==`number`){if(!Array.isArray(n))return;n=n[e];continue}if(!i(n))return;n=n[e]}return n}function P(e,t,n){if(t.length===0)return n;let[r,...a]=t,o=Array.isArray(e)?[...e]:i(e)?{...e}:{};if(a.length===0)return n===void 0?(Array.isArray(o)&&typeof r==`number`?o.splice(r,1):!Array.isArray(o)&&typeof r==`string`&&delete o[r],o):((Array.isArray(o)&&typeof r==`number`||!Array.isArray(o)&&typeof r==`string`)&&(o[r]=n),o);let s=P(Array.isArray(o)&&typeof r==`number`||!Array.isArray(o)&&typeof r==`string`?o[r]:void 0,a,n);return(Array.isArray(o)&&typeof r==`number`||!Array.isArray(o)&&typeof r==`string`)&&(o[r]=s),o}function F(e){if(e.trim().length===0)return{ok:!0,value:void 0};try{return{ok:!0,value:JSON.parse(e)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}function I(e,t){let n=e.trim();if(n.length===0||L(n))return{ok:!1};let r=Number(n);return!Number.isFinite(r)||t===`integer`&&!Number.isInteger(r)?{ok:!1}:{ok:!0,value:r}}function L(e){return e===`-`||e===`+`||e===`.`||e===`-.`||e===`+.`||/^[+-]?\d+\.$/.test(e)||/[eE][+-]?$/.test(e)}function R(e){return e===void 0?``:z(e)}function z(e){return JSON.stringify(e,null,2)}function B(e,t){return JSON.stringify(e)===JSON.stringify(t)}function V(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):e===null?`null`:JSON.stringify(e)}function H(e){return e.join(`.`)}function U(e){return e.replace(/[_-]+/g,` `).replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/\b\w/g,e=>e.toUpperCase())}function W(e){let t=e.selectedTool===void 0?0:$(e.selectedTool.parameters);return(0,h.jsxs)(`section`,{className:`grid gap-4 border-t border-border/80 pt-4 xl:grid-cols-[minmax(260px,0.42fr)_minmax(0,1fr)]`,children:[(0,h.jsxs)(`div`,{className:`grid content-start gap-3`,children:[(0,h.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,h.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:`Runner`}),e.selectedTool===void 0?(0,h.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:`No tool selected`}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`p`,{className:`m-0 break-all text-sm font-semibold leading-6 text-foreground`,children:e.selectedTool.name}),(0,h.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:e.selectedTool.description})]})]}),e.selectedTool===void 0?null:(0,h.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,h.jsx)(f,{className:X(e.selectedTool),children:Z(e.selectedTool)}),(0,h.jsxs)(f,{className:J(e.selectedTool.approval.required),children:[`approval `,e.selectedTool.approval.required?`required`:`none`]}),(0,h.jsxs)(q,{children:[t,` `,t===1?`field`:`fields`]})]}),e.selectedTool?.approval.reason===void 0?null:(0,h.jsx)(`p`,{className:`m-0 border-l border-border/80 pl-3 text-xs leading-5 text-muted-foreground`,children:e.selectedTool.approval.reason})]}),(0,h.jsxs)(`div`,{className:`grid min-w-0 gap-3`,children:[(0,h.jsx)(g,{disabled:e.selectedTool===void 0,schema:e.selectedTool?.parameters,value:e.argsText,onChange:e.onArgsTextChange}),(0,h.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,h.jsx)(`span`,{className:`min-w-0 truncate text-xs text-muted-foreground`,children:`Arguments must be valid JSON.`}),(0,h.jsx)(r,{className:`h-8 min-h-8 rounded-md px-4 text-xs`,type:`button`,disabled:e.runState===`running`||e.selectedTool===void 0,onClick:e.onRun,children:e.runState===`running`?`Running`:`Run`})]}),e.runError.length>0?(0,h.jsx)(`div`,{className:`rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive`,children:e.runError}):null,e.selectedTool===void 0?null:(0,h.jsxs)(`details`,{className:`group border-t border-border/70 pt-3`,children:[(0,h.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[`Parameter schema`,(0,h.jsx)(`span`,{className:`font-medium normal-case tracking-normal`,children:Q(e.selectedTool.parameters)})]}),(0,h.jsx)(`div`,{className:`mt-3`,children:(0,h.jsx)(K,{value:e.selectedTool.parameters,title:`JSON schema`})})]}),e.runResponse===void 0?null:(0,h.jsx)(G,{response:e.runResponse})]})]})}function G(e){let t=Object.hasOwn(e.response,`result`),n=t?e.response.result:e.response.error,r=t?`Tool result`:`Tool error`;return(0,h.jsxs)(`div`,{className:`grid gap-3`,children:[(0,h.jsx)(K,{value:ae(n),title:r}),(0,h.jsxs)(`details`,{className:`group border-t border-border/70 pt-3`,children:[(0,h.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden`,children:[`Raw run response`,(0,h.jsxs)(`span`,{className:`font-medium normal-case tracking-normal`,children:[e.response.status,` / `,e.response.durationMs,`ms`]})]}),(0,h.jsx)(`div`,{className:`mt-3`,children:(0,h.jsx)(K,{value:e.response,title:`Studio envelope`})})]})]})}function K(e){return(0,h.jsxs)(`section`,{className:`grid min-w-0 content-start overflow-hidden rounded-lg bg-background/45`,children:[(0,h.jsxs)(`div`,{className:`flex min-h-9 items-center justify-between gap-3 bg-muted/20 px-4`,children:[(0,h.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground`,children:e.title}),(0,h.jsx)(`span`,{className:` text-xs text-muted-foreground`,children:Q(e.value)})]}),(0,h.jsx)(`div`,{className:`min-w-0 overflow-x-auto`,children:(0,h.jsx)(`pre`,{className:`m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground`,children:(0,h.jsx)(`code`,{children:(0,h.jsx)(ee,{text:oe(e.value)})})})})]})}function q(e){return(0,h.jsx)(`span`,{className:`inline-flex min-h-7 items-center rounded-md bg-muted/25 px-2.5 text-xs font-medium text-muted-foreground`,children:e.children})}function J(e){return e?`border-border/80 bg-muted/35 text-foreground`:`border-transparent bg-transparent text-muted-foreground/60`}function Y(e){return e===`dynamic`?`border-border/80 bg-muted/45 text-foreground`:`border-border/80 bg-muted/55 text-muted-foreground`}function X(e){return e.mcpServerName===void 0?Y(e.source):`border-border/80 bg-muted/35 text-foreground`}function Z(e){return e.mcpServerName===void 0?e.source:`MCP / ${e.mcpServerName}`}function Q(e){if(typeof e!=`object`||!e||Array.isArray(e))return`value`;let t=e.type;return typeof t==`string`?t:`object`}function $(e){if(typeof e!=`object`||!e||Array.isArray(e))return 0;let t=e.properties;return typeof t==`object`&&t&&!Array.isArray(t)?Object.keys(t).length:0}function re(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function ie(e){if(i(e)&&!(typeof e.agentId!=`string`||e.agentId.length===0)&&!(typeof e.toolName!=`string`||e.toolName.length===0)&&!(e.status!==`success`&&e.status!==`error`)&&!(typeof e.durationMs!=`number`||!Number.isFinite(e.durationMs))&&!(typeof e.startedAt!=`string`||typeof e.endedAt!=`string`)&&Array.isArray(e.events))return e}function ae(e){if(typeof e!=`string`)return e;let t=l(e);return t.kind===`json`?t.value:e}function oe(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}export{re as a,$ as c,Z as d,J as i,Q as l,q as n,X as o,W as r,ie as s,K as t,Y as u};
|
|
2
|
+
//# sourceMappingURL=tool-runner-BZN-PZJU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-runner-BZN-PZJU.js","names":[],"sources":["../../../src/ui/app/modules/tools/schema-argument-editor.tsx","../../../src/ui/app/modules/tools/tool-runner.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\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 { Textarea } from \"../../components/ui/textarea\";\nimport { isRecord } from \"../shared/object\";\n\ntype ArgumentMode = \"form\" | \"json\";\ntype JsonPath = Array<string | number>;\ntype ParseResult = { ok: true; value: unknown } | { ok: false; error: string };\n\nexport function SchemaArgumentEditor(props: {\n schema: unknown;\n value: string;\n disabled?: boolean;\n onChange: (value: string) => void;\n}) {\n const [mode, setMode] = useState<ArgumentMode>(\"form\");\n const rootFields = useMemo(() => schemaFields(props.schema), [props.schema]);\n const parsed = useMemo(() => parseJson(props.value), [props.value]);\n const disabled = props.disabled === true;\n const canRenderForm = rootFields.length > 0;\n const effectiveMode = canRenderForm ? mode : \"json\";\n const rootValue = parsed.ok && isRecord(parsed.value) ? parsed.value : undefined;\n\n function updatePath(path: JsonPath, value: unknown | undefined) {\n const base = rootValue ?? {};\n props.onChange(formatEditorJson(setValueAtPath(base, path, value)));\n }\n\n function removePathItem(path: JsonPath, index: number) {\n const base = rootValue ?? {};\n const arrayValue = getValueAtPath(base, path);\n if (!Array.isArray(arrayValue)) {\n return;\n }\n props.onChange(\n formatEditorJson(\n setValueAtPath(\n base,\n path,\n arrayValue.filter((_, itemIndex) => itemIndex !== index),\n ),\n ),\n );\n }\n\n return (\n <div className=\"grid min-w-0 gap-3\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Arguments\n </span>\n {canRenderForm ? (\n <div className=\"inline-grid h-8 grid-cols-2 overflow-hidden rounded-md border border-border/80 bg-background/45 p-0.5\">\n <ModeButton active={effectiveMode === \"form\"} onClick={() => setMode(\"form\")}>\n Form\n </ModeButton>\n <ModeButton active={effectiveMode === \"json\"} onClick={() => setMode(\"json\")}>\n JSON\n </ModeButton>\n </div>\n ) : (\n <span className=\"text-xs font-medium text-muted-foreground\">JSON</span>\n )}\n </div>\n\n {effectiveMode === \"json\" || rootValue === undefined ? (\n <RawJsonEditor\n disabled={disabled}\n error={parsed.ok ? \"\" : parsed.error}\n value={props.value}\n onChange={props.onChange}\n />\n ) : (\n <div className=\"grid gap-3\">\n {rootFields.map((field) => (\n <SchemaField\n disabled={disabled}\n field={field}\n key={field.name}\n path={[field.name]}\n rootValue={rootValue}\n onChange={updatePath}\n onRemoveArrayItem={removePathItem}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ModeButton(props: { active: boolean; children: string; onClick: () => void }) {\n return (\n <button\n className={\n props.active\n ? \"rounded-[5px] bg-muted/55 px-3 text-xs font-semibold text-foreground\"\n : \"rounded-[5px] px-3 text-xs font-medium text-muted-foreground transition hover:text-foreground\"\n }\n type=\"button\"\n onClick={props.onClick}\n >\n {props.children}\n </button>\n );\n}\n\nfunction RawJsonEditor(props: {\n value: string;\n error: string;\n disabled: boolean;\n onChange: (value: string) => void;\n}) {\n return (\n <div className=\"grid gap-2\">\n <Textarea\n className=\"min-h-36 resize-y rounded-md border-border bg-background/45 p-3 text-xs leading-5\"\n disabled={props.disabled}\n value={props.value}\n spellCheck={false}\n onChange={(event) => props.onChange(event.target.value)}\n />\n {props.error.length === 0 ? null : (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive\">\n {props.error}\n </div>\n )}\n </div>\n );\n}\n\ntype SchemaFieldDefinition = {\n name: string;\n schema: Record<string, unknown>;\n required: boolean;\n};\n\nfunction SchemaField(props: {\n field: SchemaFieldDefinition;\n path: JsonPath;\n rootValue: Record<string, unknown>;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n onRemoveArrayItem: (path: JsonPath, index: number) => void;\n}) {\n const value = getValueAtPath(props.rootValue, props.path);\n const label = schemaLabel(props.field.schema, props.field.name);\n const description = schemaDescription(props.field.schema);\n const type = schemaPrimaryType(props.field.schema);\n\n if (type === \"object\") {\n const fields = schemaFields(props.field.schema);\n return (\n <fieldset className=\"grid min-w-0 gap-3 border-b border-border/70 pb-3 last:border-b-0\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <legend className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {label}\n </legend>\n {props.field.required ? <RequiredBadge /> : null}\n </div>\n {description === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{description}</p>\n )}\n {fields.length === 0 ? (\n <JsonValueField\n disabled={props.disabled}\n path={props.path}\n value={value}\n onChange={props.onChange}\n />\n ) : (\n <div className=\"grid gap-3 border-l border-border/70 pl-3\">\n {fields.map((field) => (\n <SchemaField\n disabled={props.disabled}\n field={field}\n key={field.name}\n path={[...props.path, field.name]}\n rootValue={props.rootValue}\n onChange={props.onChange}\n onRemoveArrayItem={props.onRemoveArrayItem}\n />\n ))}\n </div>\n )}\n </fieldset>\n );\n }\n\n if (type === \"array\") {\n return (\n <ArrayField\n description={description}\n disabled={props.disabled}\n field={props.field}\n label={label}\n path={props.path}\n rootValue={props.rootValue}\n value={value}\n onChange={props.onChange}\n onRemoveArrayItem={props.onRemoveArrayItem}\n />\n );\n }\n\n return (\n <div className=\"grid min-w-0 gap-2 border-b border-border/70 pb-3 last:border-b-0\">\n <FieldHeader label={label} required={props.field.required} />\n {description === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{description}</p>\n )}\n <ScalarFieldControl\n disabled={props.disabled}\n path={props.path}\n required={props.field.required}\n schema={props.field.schema}\n value={value}\n onChange={props.onChange}\n />\n </div>\n );\n}\n\nfunction ArrayField(props: {\n field: SchemaFieldDefinition;\n label: string;\n description: string | undefined;\n path: JsonPath;\n rootValue: Record<string, unknown>;\n value: unknown;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n onRemoveArrayItem: (path: JsonPath, index: number) => void;\n}) {\n const itemSchema = schemaItems(props.field.schema);\n const items = Array.isArray(props.value) ? props.value : [];\n const itemEntries = items.map((item, index) => ({\n index,\n key: `${formatPath(props.path)}:${index}:${formatEnumValue(item)}`,\n }));\n return (\n <div className=\"grid min-w-0 gap-3 border-b border-border/70 pb-3 last:border-b-0\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <FieldHeader label={props.label} required={props.field.required} />\n {itemSchema === undefined ? null : (\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n disabled={props.disabled}\n type=\"button\"\n variant=\"secondary\"\n onClick={() =>\n props.onChange(props.path, [...items, defaultValueForSchema(itemSchema)])\n }\n >\n Add\n </Button>\n )}\n </div>\n {props.description === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{props.description}</p>\n )}\n {itemSchema === undefined ? (\n <JsonValueField\n disabled={props.disabled}\n path={props.path}\n value={props.value}\n onChange={props.onChange}\n />\n ) : items.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border/70 px-3 py-2 text-xs text-muted-foreground\">\n Empty array\n </div>\n ) : (\n <div className=\"grid gap-3 border-l border-border/70 pl-3\">\n {itemEntries.map((item) => (\n <div className=\"grid gap-2\" key={item.key}>\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Item {item.index + 1}\n </span>\n <Button\n className=\"h-7 min-h-7 rounded-md px-2 text-xs\"\n disabled={props.disabled}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onRemoveArrayItem(props.path, item.index)}\n >\n Remove\n </Button>\n </div>\n <SchemaField\n disabled={props.disabled}\n field={{\n name: String(item.index + 1),\n required: true,\n schema: itemSchema,\n }}\n path={[...props.path, item.index]}\n rootValue={props.rootValue}\n onChange={props.onChange}\n onRemoveArrayItem={props.onRemoveArrayItem}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction FieldHeader(props: { label: string; required: boolean }) {\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">{props.label}</span>\n {props.required ? <RequiredBadge /> : null}\n </div>\n );\n}\n\nfunction RequiredBadge() {\n return (\n <span className=\"rounded-md bg-muted/35 px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">\n required\n </span>\n );\n}\n\nfunction ScalarFieldControl(props: {\n schema: Record<string, unknown>;\n path: JsonPath;\n value: unknown;\n required: boolean;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n}) {\n const enumOptions = schemaEnum(props.schema);\n if (enumOptions.length > 0) {\n const selectedIndex = enumOptions.findIndex((option) => jsonEqual(option, props.value));\n const optionEntries = enumOptions.map((option, index) => ({\n label: formatEnumValue(option),\n value: String(index),\n key: `${index}:${formatEnumValue(option)}`,\n }));\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n <Select\n value={selectedIndex === -1 ? \"\" : String(selectedIndex)}\n disabled={props.disabled}\n onValueChange={(value) => props.onChange(props.path, enumOptions[Number(value)])}\n >\n <SelectTrigger className=\"h-9 min-h-9 rounded-md border-border bg-background/45 text-sm\">\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n {optionEntries.map((option) => (\n <SelectItem value={option.value} key={option.key}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {selectedIndex === -1 || props.required ? null : (\n <Button\n className=\"h-9 min-h-9 rounded-md px-3 text-xs\"\n disabled={props.disabled}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onChange(props.path, undefined)}\n >\n Clear\n </Button>\n )}\n </div>\n );\n }\n\n const type = schemaPrimaryType(props.schema);\n if (type === \"boolean\") {\n return (\n <label className=\"flex min-h-9 w-fit cursor-pointer items-center gap-2 rounded-md border border-border/70 bg-background/45 px-3 text-sm text-foreground\">\n <input\n checked={props.value === true}\n disabled={props.disabled}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-foreground\"\n onChange={(event) => props.onChange(props.path, event.target.checked)}\n />\n Enabled\n </label>\n );\n }\n\n if (type === \"number\" || type === \"integer\") {\n return (\n <NumberFieldControl\n disabled={props.disabled}\n path={props.path}\n schema={props.schema}\n type={type}\n value={props.value}\n onChange={props.onChange}\n />\n );\n }\n\n if (type === \"string\") {\n return (\n <Input\n className=\"h-9 rounded-md border-border bg-background/45 text-sm\"\n disabled={props.disabled}\n type=\"text\"\n value={typeof props.value === \"string\" ? props.value : \"\"}\n placeholder={schemaDefaultPlaceholder(props.schema)}\n onChange={(event) => {\n const nextValue = event.target.value;\n props.onChange(\n props.path,\n nextValue.length === 0 && !props.required ? undefined : nextValue,\n );\n }}\n />\n );\n }\n\n return (\n <JsonValueField\n disabled={props.disabled}\n path={props.path}\n value={props.value}\n onChange={props.onChange}\n />\n );\n}\n\nfunction NumberFieldControl(props: {\n schema: Record<string, unknown>;\n type: \"number\" | \"integer\";\n path: JsonPath;\n value: unknown;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n}) {\n const externalValue = typeof props.value === \"number\" ? String(props.value) : \"\";\n const [draft, setDraft] = useState(externalValue);\n\n useEffect(() => {\n setDraft(externalValue);\n }, [externalValue]);\n\n return (\n <Input\n className=\"h-9 rounded-md border-border bg-background/45 text-sm\"\n disabled={props.disabled}\n inputMode={props.type === \"integer\" ? \"numeric\" : \"decimal\"}\n type=\"text\"\n value={draft}\n placeholder={schemaDefaultPlaceholder(props.schema)}\n onBlur={() => {\n if (draft.trim().length === 0) {\n setDraft(\"\");\n return;\n }\n const nextValue = parseNumberDraft(draft, props.type);\n setDraft(nextValue.ok ? String(nextValue.value) : externalValue);\n }}\n onChange={(event) => {\n const nextDraft = event.target.value;\n setDraft(nextDraft);\n if (nextDraft.trim().length === 0) {\n props.onChange(props.path, undefined);\n return;\n }\n const nextValue = parseNumberDraft(nextDraft, props.type);\n if (nextValue.ok) {\n props.onChange(props.path, nextValue.value);\n }\n }}\n />\n );\n}\n\nfunction JsonValueField(props: {\n path: JsonPath;\n value: unknown;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n}) {\n const externalValue = useMemo(() => fieldJsonValue(props.value), [props.value]);\n const [draft, setDraft] = useState(externalValue);\n const parsed = useMemo(() => parseJson(draft), [draft]);\n\n useEffect(() => {\n setDraft(externalValue);\n }, [externalValue]);\n\n return (\n <div className=\"grid gap-2\">\n <Textarea\n className=\"min-h-24 resize-y rounded-md border-border bg-background/45 p-3 text-xs leading-5\"\n disabled={props.disabled}\n value={draft}\n spellCheck={false}\n onChange={(event) => {\n const nextDraft = event.target.value;\n setDraft(nextDraft);\n if (nextDraft.trim().length === 0) {\n props.onChange(props.path, undefined);\n return;\n }\n const nextValue = parseJson(nextDraft);\n if (nextValue.ok) {\n props.onChange(props.path, nextValue.value);\n }\n }}\n />\n {parsed.ok || draft.trim().length === 0 ? null : (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive\">\n {parsed.error}\n </div>\n )}\n </div>\n );\n}\n\nfunction schemaFields(schema: unknown): SchemaFieldDefinition[] {\n if (!isRecord(schema)) {\n return [];\n }\n const properties = schema.properties;\n if (!isRecord(properties)) {\n return [];\n }\n const required = schemaRequired(schema);\n return Object.entries(properties).map(([name, propertySchema]) => ({\n name,\n required: required.has(name),\n schema: isRecord(propertySchema) ? propertySchema : {},\n }));\n}\n\nfunction schemaRequired(schema: Record<string, unknown>): Set<string> {\n const required = schema.required;\n if (!Array.isArray(required)) {\n return new Set();\n }\n return new Set(required.filter((item): item is string => typeof item === \"string\"));\n}\n\nfunction schemaPrimaryType(schema: Record<string, unknown>): string {\n const type = schema.type;\n if (typeof type === \"string\") {\n return type;\n }\n if (Array.isArray(type)) {\n const firstType = type.find(\n (item): item is string => typeof item === \"string\" && item !== \"null\",\n );\n if (firstType !== undefined) {\n return firstType;\n }\n }\n if (schemaEnum(schema).length > 0) {\n return \"enum\";\n }\n if (isRecord(schema.properties)) {\n return \"object\";\n }\n if (schema.items !== undefined) {\n return \"array\";\n }\n return \"unknown\";\n}\n\nfunction schemaItems(schema: Record<string, unknown>): Record<string, unknown> | undefined {\n return isRecord(schema.items) ? schema.items : undefined;\n}\n\nfunction schemaEnum(schema: Record<string, unknown>): unknown[] {\n return Array.isArray(schema.enum) ? schema.enum : [];\n}\n\nfunction schemaLabel(schema: Record<string, unknown>, fallback: string): string {\n return typeof schema.title === \"string\" && schema.title.length > 0\n ? schema.title\n : formatFieldName(fallback);\n}\n\nfunction schemaDescription(schema: Record<string, unknown>): string | undefined {\n return typeof schema.description === \"string\" && schema.description.length > 0\n ? schema.description\n : undefined;\n}\n\nfunction schemaDefaultPlaceholder(schema: Record<string, unknown>): string | undefined {\n return Object.hasOwn(schema, \"default\") ? formatEnumValue(schema.default) : undefined;\n}\n\nfunction defaultValueForSchema(schema: Record<string, unknown>): unknown {\n if (Object.hasOwn(schema, \"default\")) {\n return schema.default;\n }\n const enumOptions = schemaEnum(schema);\n if (enumOptions.length > 0) {\n return enumOptions[0];\n }\n const type = schemaPrimaryType(schema);\n if (type === \"boolean\") {\n return false;\n }\n if (type === \"integer\" || type === \"number\") {\n return 0;\n }\n if (type === \"array\") {\n return [];\n }\n if (type === \"object\") {\n return {};\n }\n if (type === \"string\") {\n return \"\";\n }\n return null;\n}\n\nfunction getValueAtPath(root: unknown, path: JsonPath): unknown {\n let current = root;\n for (const segment of path) {\n if (typeof segment === \"number\") {\n if (!Array.isArray(current)) {\n return undefined;\n }\n current = current[segment];\n continue;\n }\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction setValueAtPath(root: unknown, path: JsonPath, value: unknown | undefined): unknown {\n if (path.length === 0) {\n return value;\n }\n const [segment, ...rest] = path;\n const nextRoot = Array.isArray(root) ? [...root] : isRecord(root) ? { ...root } : {};\n if (rest.length === 0) {\n if (value === undefined) {\n if (Array.isArray(nextRoot) && typeof segment === \"number\") {\n nextRoot.splice(segment, 1);\n } else if (!Array.isArray(nextRoot) && typeof segment === \"string\") {\n delete nextRoot[segment];\n }\n return nextRoot;\n }\n if (Array.isArray(nextRoot) && typeof segment === \"number\") {\n nextRoot[segment] = value;\n } else if (!Array.isArray(nextRoot) && typeof segment === \"string\") {\n nextRoot[segment] = value;\n }\n return nextRoot;\n }\n const currentValue =\n Array.isArray(nextRoot) && typeof segment === \"number\"\n ? nextRoot[segment]\n : !Array.isArray(nextRoot) && typeof segment === \"string\"\n ? nextRoot[segment]\n : undefined;\n const nextValue = setValueAtPath(currentValue, rest, value);\n if (Array.isArray(nextRoot) && typeof segment === \"number\") {\n nextRoot[segment] = nextValue;\n } else if (!Array.isArray(nextRoot) && typeof segment === \"string\") {\n nextRoot[segment] = nextValue;\n }\n return nextRoot;\n}\n\nfunction parseJson(value: string): ParseResult {\n if (value.trim().length === 0) {\n return { ok: true, value: undefined };\n }\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\ntype NumberParseResult = { ok: true; value: number } | { ok: false };\n\nfunction parseNumberDraft(value: string, type: \"number\" | \"integer\"): NumberParseResult {\n const normalized = value.trim();\n if (normalized.length === 0 || isIncompleteNumberDraft(normalized)) {\n return { ok: false };\n }\n const parsed = Number(normalized);\n if (!Number.isFinite(parsed)) {\n return { ok: false };\n }\n if (type === \"integer\" && !Number.isInteger(parsed)) {\n return { ok: false };\n }\n return { ok: true, value: parsed };\n}\n\nfunction isIncompleteNumberDraft(value: string): boolean {\n return (\n value === \"-\" ||\n value === \"+\" ||\n value === \".\" ||\n value === \"-.\" ||\n value === \"+.\" ||\n /^[+-]?\\d+\\.$/.test(value) ||\n /[eE][+-]?$/.test(value)\n );\n}\n\nfunction fieldJsonValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n return formatEditorJson(value);\n}\n\nfunction formatEditorJson(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nfunction jsonEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction formatEnumValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value === null) {\n return \"null\";\n }\n return JSON.stringify(value);\n}\n\nfunction formatPath(path: JsonPath): string {\n return path.join(\".\");\n}\n\nfunction formatFieldName(value: string): string {\n return value\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/\\b\\w/g, (match) => match.toUpperCase());\n}\n","import type { ReactNode } from \"react\";\nimport type { StudioAgentToolMetadata, StudioToolRunResponse } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { parseToolDisplayValue } from \"../shared/format\";\nimport { isRecord } from \"../shared/object\";\nimport { JsonSyntax } from \"../shared/renderers\";\nimport { SchemaArgumentEditor } from \"./schema-argument-editor\";\n\nexport type ToolRunState = \"idle\" | \"running\";\n\nexport function ToolRunner(props: {\n selectedTool: StudioAgentToolMetadata | undefined;\n argsText: string;\n runState: ToolRunState;\n runError: string;\n runResponse: StudioToolRunResponse | undefined;\n onArgsTextChange: (value: string) => void;\n onRun: () => void;\n}) {\n const propertyCount =\n props.selectedTool === undefined ? 0 : schemaPropertyCount(props.selectedTool.parameters);\n return (\n <section className=\"grid gap-4 border-t border-border/80 pt-4 xl:grid-cols-[minmax(260px,0.42fr)_minmax(0,1fr)]\">\n <div className=\"grid content-start gap-3\">\n <div className=\"grid gap-1.5\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">Runner</h2>\n {props.selectedTool === undefined ? (\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">No tool selected</p>\n ) : (\n <>\n <p className=\"m-0 break-all text-sm font-semibold leading-6 text-foreground\">\n {props.selectedTool.name}\n </p>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n {props.selectedTool.description}\n </p>\n </>\n )}\n </div>\n {props.selectedTool === undefined ? null : (\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <Badge className={originBadgeClass(props.selectedTool)}>\n {toolOriginLabel(props.selectedTool)}\n </Badge>\n <Badge className={approvalBadgeClass(props.selectedTool.approval.required)}>\n approval {props.selectedTool.approval.required ? \"required\" : \"none\"}\n </Badge>\n <ToolMetaPill>\n {propertyCount} {propertyCount === 1 ? \"field\" : \"fields\"}\n </ToolMetaPill>\n </div>\n )}\n {props.selectedTool?.approval.reason === undefined ? null : (\n <p className=\"m-0 border-l border-border/80 pl-3 text-xs leading-5 text-muted-foreground\">\n {props.selectedTool.approval.reason}\n </p>\n )}\n </div>\n <div className=\"grid min-w-0 gap-3\">\n <SchemaArgumentEditor\n disabled={props.selectedTool === undefined}\n schema={props.selectedTool?.parameters}\n value={props.argsText}\n onChange={props.onArgsTextChange}\n />\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate text-xs text-muted-foreground\">\n Arguments must be valid JSON.\n </span>\n <Button\n className=\"h-8 min-h-8 rounded-md px-4 text-xs\"\n type=\"button\"\n disabled={props.runState === \"running\" || props.selectedTool === undefined}\n onClick={props.onRun}\n >\n {props.runState === \"running\" ? \"Running\" : \"Run\"}\n </Button>\n </div>\n {props.runError.length > 0 ? (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive\">\n {props.runError}\n </div>\n ) : null}\n {props.selectedTool === undefined ? null : (\n <details className=\"group border-t border-border/70 pt-3\">\n <summary className=\"flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Parameter schema\n <span className=\"font-medium normal-case tracking-normal\">\n {schemaType(props.selectedTool.parameters)}\n </span>\n </summary>\n <div className=\"mt-3\">\n <SchemaBlock value={props.selectedTool.parameters} title=\"JSON schema\" />\n </div>\n </details>\n )}\n {props.runResponse === undefined ? null : <ToolRunResult response={props.runResponse} />}\n </div>\n </section>\n );\n}\n\nfunction ToolRunResult(props: { response: StudioToolRunResponse }) {\n const hasResult = Object.hasOwn(props.response, \"result\");\n const primaryValue = hasResult ? props.response.result : props.response.error;\n const title = hasResult ? \"Tool result\" : \"Tool error\";\n\n return (\n <div className=\"grid gap-3\">\n <SchemaBlock value={displayToolRunValue(primaryValue)} title={title} />\n <details className=\"group border-t border-border/70 pt-3\">\n <summary className=\"flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Raw run response\n <span className=\"font-medium normal-case tracking-normal\">\n {props.response.status} / {props.response.durationMs}ms\n </span>\n </summary>\n <div className=\"mt-3\">\n <SchemaBlock value={props.response} title=\"Studio envelope\" />\n </div>\n </details>\n </div>\n );\n}\n\nexport function SchemaBlock(props: { value: unknown; title: string }) {\n return (\n <section className=\"grid min-w-0 content-start overflow-hidden rounded-lg bg-background/45\">\n <div className=\"flex min-h-9 items-center justify-between gap-3 bg-muted/20 px-4\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground\">\n {props.title}\n </span>\n <span className=\" text-xs text-muted-foreground\">{schemaType(props.value)}</span>\n </div>\n <div className=\"min-w-0 overflow-x-auto\">\n <pre className=\"m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={formatSchema(props.value)} />\n </code>\n </pre>\n </div>\n </section>\n );\n}\n\nexport function ToolMetaPill(props: { children: ReactNode }) {\n return (\n <span className=\"inline-flex min-h-7 items-center rounded-md bg-muted/25 px-2.5 text-xs font-medium text-muted-foreground\">\n {props.children}\n </span>\n );\n}\n\nexport function approvalBadgeClass(required: boolean): string {\n return required\n ? \"border-border/80 bg-muted/35 text-foreground\"\n : \"border-transparent bg-transparent text-muted-foreground/60\";\n}\n\nexport function sourceBadgeClass(source: \"static\" | \"dynamic\"): string {\n return source === \"dynamic\"\n ? \"border-border/80 bg-muted/45 text-foreground\"\n : \"border-border/80 bg-muted/55 text-muted-foreground\";\n}\n\nexport function originBadgeClass(tool: StudioAgentToolMetadata): string {\n return tool.mcpServerName === undefined\n ? sourceBadgeClass(tool.source)\n : \"border-border/80 bg-muted/35 text-foreground\";\n}\n\nexport function toolOriginLabel(tool: StudioAgentToolMetadata): string {\n return tool.mcpServerName === undefined ? tool.source : `MCP / ${tool.mcpServerName}`;\n}\n\nexport function schemaType(value: unknown): string {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return \"value\";\n }\n const type = (value as { type?: unknown }).type;\n return typeof type === \"string\" ? type : \"object\";\n}\n\nexport function schemaPropertyCount(value: unknown): number {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return 0;\n }\n const properties = (value as { properties?: unknown }).properties;\n return typeof properties === \"object\" && properties !== null && !Array.isArray(properties)\n ? Object.keys(properties).length\n : 0;\n}\n\nexport function formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function parseStudioToolRunResponse(value: unknown): StudioToolRunResponse | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n if (typeof value.agentId !== \"string\" || value.agentId.length === 0) {\n return undefined;\n }\n if (typeof value.toolName !== \"string\" || value.toolName.length === 0) {\n return undefined;\n }\n if (value.status !== \"success\" && value.status !== \"error\") {\n return undefined;\n }\n if (typeof value.durationMs !== \"number\" || !Number.isFinite(value.durationMs)) {\n return undefined;\n }\n if (typeof value.startedAt !== \"string\" || typeof value.endedAt !== \"string\") {\n return undefined;\n }\n if (!Array.isArray(value.events)) {\n return undefined;\n }\n return value as StudioToolRunResponse;\n}\n\nfunction displayToolRunValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const parsed = parseToolDisplayValue(value);\n return parsed.kind === \"json\" ? parsed.value : value;\n}\n\nfunction formatSchema(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,r as t,s as n}from"./utils-C9GMruoG.js";import{F as r,a as i,d as a,f as o,i as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./index-Bh7RLPBw.js";import{t as m}from"./badge-RJJoRC4P.js";import{a as h,c as g,d as _,i as v,l as y,n as b,o as x,r as S,s as C}from"./tool-runner-BZN-PZJU.js";var w=n(e(),1),T=t();function E(e){let t=e.agents.find(t=>t.id===e.selectedAgentId)??e.agents[0],n=e.summary?.tools??[],[r,m]=(0,w.useState)(``),[g,_]=(0,w.useState)(`{}`),[v,y]=(0,w.useState)(`idle`),[b,x]=(0,w.useState)(),[E,O]=(0,w.useState)(``),k=(0,w.useMemo)(()=>n.find(e=>e.name===r)??n[0],[r,n]),A=t===void 0||k===void 0?``:`${t.id}:${k.name}`,M=(0,w.useRef)(A),N=(0,w.useRef)(0),P=j(n);(0,w.useEffect)(()=>{if(n.length===0){m(``);return}n.some(e=>e.name===r)||m(n[0]?.name??``)},[r,n]),(0,w.useEffect)(()=>{M.current!==A&&(M.current=A,N.current+=1,y(`idle`),O(``),x(void 0))},[A]);async function F(){if(t===void 0||k===void 0)return;let e;try{e=JSON.parse(g)}catch(e){O(e instanceof Error?e.message:String(e)),x(void 0);return}y(`running`),O(``),x(void 0);let n=A,r=N.current+1;N.current=r;let i=()=>N.current===r&&M.current===n;try{let n=await fetch(`/agents/${encodeURIComponent(t.id)}/tools/${encodeURIComponent(k.name)}/runs`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({args:e})}),r=await n.json();if(!i())return;let a=C(r);if(a===void 0){O(`Unexpected Studio tool run response: ${h(r)}`);return}x(a),(!n.ok||a.status===`error`)&&O(h(a.error??a))}catch(e){i()&&O(e instanceof Error?e.message:String(e))}finally{i()&&y(`idle`)}}return(0,T.jsxs)(u,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":`Tools`,children:[(0,T.jsx)(i,{title:`Tools`,description:`Tool definitions registered on Studio agents, including approval policy and input schema.`,action:(0,T.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start`,children:[(0,T.jsx)(f,{label:`tools`,value:P.total}),(0,T.jsx)(f,{label:`mcp`,value:P.mcp}),(0,T.jsx)(f,{label:`static`,value:P.static}),(0,T.jsx)(f,{label:`dynamic`,value:P.dynamic}),(0,T.jsx)(f,{label:`approvals`,value:P.approvals}),e.agents.length>1?(0,T.jsxs)(p,{value:t?.id??``,onValueChange:e.onSelectAgent,children:[(0,T.jsx)(d,{className:`h-8 min-h-8 w-64 rounded-md border-border text-xs max-sm:w-full`,children:(0,T.jsx)(c,{placeholder:`Agent`})}),(0,T.jsx)(a,{align:`end`,children:e.agents.map(e=>(0,T.jsx)(o,{value:e.id,children:e.name??e.id},e.id))})]}):null]})}),(0,T.jsx)(s,{className:`overflow-auto`,children:e.enabled?e.loading?(0,T.jsx)(l,{title:`Loading tools`,text:`Reading registered tool metadata.`}):n.length===0?(0,T.jsx)(l,{title:`No tools`,text:`The selected agent has no registered tools.`}):(0,T.jsxs)(`div`,{className:`grid w-full gap-5`,children:[(0,T.jsx)(D,{selectedToolName:k?.name??``,tools:n,onSelectTool:m}),(0,T.jsx)(S,{argsText:g,runError:E,runResponse:b,runState:v,selectedTool:k,onArgsTextChange:_,onRun:()=>void F()})]}):(0,T.jsx)(l,{title:`Tools unavailable`,text:`No registered Studio agent exposes static or dynamic tools.`})})]})}function D(e){return(0,T.jsx)(`div`,{className:`min-w-[1040px]`,children:(0,T.jsxs)(`table`,{className:`w-full border-separate border-spacing-0 text-left`,children:[(0,T.jsx)(`thead`,{className:`sticky top-0 z-10 bg-background/95 backdrop-blur`,children:(0,T.jsxs)(`tr`,{children:[(0,T.jsx)(k,{children:`Tool`}),(0,T.jsx)(k,{children:`Origin`}),(0,T.jsx)(k,{children:`Schema`}),(0,T.jsx)(k,{children:`Approval`}),(0,T.jsx)(k,{children:`Run`})]})}),(0,T.jsx)(`tbody`,{children:e.tools.map(t=>(0,T.jsx)(O,{active:e.selectedToolName===t.name,tool:t,onSelectTool:e.onSelectTool},`${t.source}:${t.name}`))})]})})}function O(e){let t=g(e.tool.parameters);return(0,T.jsxs)(`tr`,{children:[(0,T.jsx)(A,{children:(0,T.jsxs)(`div`,{className:`grid min-w-0 gap-1.5`,children:[(0,T.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,T.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.tool.name}),e.active?(0,T.jsx)(m,{className:M,children:`selected`}):null]}),(0,T.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium text-muted-foreground`,children:e.tool.agentId}),(0,T.jsx)(`p`,{className:`m-0 max-w-[64ch] truncate text-sm leading-6 text-muted-foreground`,children:e.tool.description})]})}),(0,T.jsx)(A,{children:(0,T.jsx)(m,{className:x(e.tool),children:_(e.tool)})}),(0,T.jsx)(A,{children:(0,T.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,T.jsx)(b,{children:y(e.tool.parameters)}),(0,T.jsxs)(b,{children:[t,` `,t===1?`field`:`fields`]})]})}),(0,T.jsx)(A,{children:(0,T.jsxs)(`div`,{className:`grid min-w-0 gap-1.5`,children:[(0,T.jsx)(m,{className:v(e.tool.approval.required),children:e.tool.approval.required?`required`:`none`}),e.tool.approval.reason===void 0?null:(0,T.jsx)(`span`,{className:`max-w-[280px] truncate text-xs leading-5 text-muted-foreground`,title:e.tool.approval.reason,children:e.tool.approval.reason})]})}),(0,T.jsx)(A,{children:(0,T.jsx)(r,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:e.active?`secondary`:`ghost`,onClick:()=>e.onSelectTool(e.tool.name),children:e.active?`Selected`:`Use`})})]})}function k(e){return(0,T.jsx)(`th`,{className:`border-b border-border/80 py-2.5 pr-5 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground first:pl-0`,children:e.children})}function A(e){return(0,T.jsx)(`td`,{className:`border-b border-border/70 py-3.5 pr-5 align-top first:pl-0`,children:e.children})}function j(e){return e.reduce((e,t)=>(e.total+=1,t.source===`dynamic`?e.dynamic+=1:e.static+=1,t.mcpServerName!==void 0&&(e.mcp+=1),t.approval.required&&(e.approvals+=1),e),{approvals:0,dynamic:0,mcp:0,static:0,total:0})}var M=`border-border/80 bg-muted/45 text-foreground`;export{E as ToolsPage};
|
|
2
|
+
//# sourceMappingURL=tools-page-DRv7aklU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-page-DRv7aklU.js","names":[],"sources":["../../../src/ui/app/modules/tools/tools-page.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n StudioAgentToolMetadata,\n StudioAgentToolsSummary,\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 StudioEmptyState,\n StudioHeaderMetric,\n StudioPageContent,\n StudioPageHeader,\n StudioPageShell,\n} from \"../../components/ui/studio\";\nimport {\n approvalBadgeClass,\n formatJson,\n originBadgeClass,\n parseStudioToolRunResponse,\n schemaPropertyCount,\n schemaType,\n ToolMetaPill,\n ToolRunner,\n toolOriginLabel,\n} from \"./tool-runner\";\n\nexport function ToolsPage(props: {\n agents: StudioConfig[\"agents\"];\n selectedAgentId: string;\n summary: StudioAgentToolsSummary | 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 tools = props.summary?.tools ?? [];\n const [selectedToolName, setSelectedToolName] = 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 () => tools.find((tool) => tool.name === selectedToolName) ?? tools[0],\n [selectedToolName, tools],\n );\n const selectedToolRunKey =\n selectedAgent === undefined || selectedTool === undefined\n ? \"\"\n : `${selectedAgent.id}:${selectedTool.name}`;\n const selectedToolRunKeyRef = useRef(selectedToolRunKey);\n const runRequestIdRef = useRef(0);\n const toolTotals = summarizeTools(tools);\n\n useEffect(() => {\n if (tools.length === 0) {\n setSelectedToolName(\"\");\n return;\n }\n if (!tools.some((tool) => tool.name === selectedToolName)) {\n setSelectedToolName(tools[0]?.name ?? \"\");\n }\n }, [selectedToolName, tools]);\n\n useEffect(() => {\n if (selectedToolRunKeyRef.current === selectedToolRunKey) {\n return;\n }\n selectedToolRunKeyRef.current = selectedToolRunKey;\n runRequestIdRef.current += 1;\n setRunState(\"idle\");\n setRunError(\"\");\n setRunResponse(undefined);\n }, [selectedToolRunKey]);\n\n async function runSelectedTool() {\n if (selectedAgent === undefined || 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 = selectedToolRunKey;\n const requestId = runRequestIdRef.current + 1;\n runRequestIdRef.current = requestId;\n const isCurrentRun = () =>\n runRequestIdRef.current === requestId && selectedToolRunKeyRef.current === runToolKey;\n try {\n const response = await fetch(\n `/agents/${encodeURIComponent(selectedAgent.id)}/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 <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Tools\">\n <StudioPageHeader\n title=\"Tools\"\n description=\"Tool definitions registered on Studio agents, including approval policy and input schema.\"\n action={\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start\">\n <StudioHeaderMetric label=\"tools\" value={toolTotals.total} />\n <StudioHeaderMetric label=\"mcp\" value={toolTotals.mcp} />\n <StudioHeaderMetric label=\"static\" value={toolTotals.static} />\n <StudioHeaderMetric label=\"dynamic\" value={toolTotals.dynamic} />\n <StudioHeaderMetric label=\"approvals\" value={toolTotals.approvals} />\n {props.agents.length > 1 ? (\n <Select value={selectedAgent?.id ?? \"\"} onValueChange={props.onSelectAgent}>\n <SelectTrigger className=\"h-8 min-h-8 w-64 rounded-md border-border text-xs max-sm: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 }\n />\n\n <StudioPageContent className=\"overflow-auto\">\n {!props.enabled ? (\n <StudioEmptyState\n title=\"Tools unavailable\"\n text=\"No registered Studio agent exposes static or dynamic tools.\"\n />\n ) : props.loading ? (\n <StudioEmptyState title=\"Loading tools\" text=\"Reading registered tool metadata.\" />\n ) : tools.length === 0 ? (\n <StudioEmptyState title=\"No tools\" text=\"The selected agent has no registered tools.\" />\n ) : (\n <div className=\"grid w-full gap-5\">\n <ToolRegistryTable\n selectedToolName={selectedTool?.name ?? \"\"}\n tools={tools}\n onSelectTool={setSelectedToolName}\n />\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 </div>\n )}\n </StudioPageContent>\n </StudioPageShell>\n );\n}\n\nfunction ToolRegistryTable(props: {\n tools: StudioAgentToolMetadata[];\n selectedToolName: string;\n onSelectTool: (toolName: string) => void;\n}) {\n return (\n <div className=\"min-w-[1040px]\">\n <table className=\"w-full border-separate border-spacing-0 text-left\">\n <thead className=\"sticky top-0 z-10 bg-background/95 backdrop-blur\">\n <tr>\n <ToolTableHead>Tool</ToolTableHead>\n <ToolTableHead>Origin</ToolTableHead>\n <ToolTableHead>Schema</ToolTableHead>\n <ToolTableHead>Approval</ToolTableHead>\n <ToolTableHead>Run</ToolTableHead>\n </tr>\n </thead>\n <tbody>\n {props.tools.map((tool) => (\n <ToolRegistryRow\n active={props.selectedToolName === tool.name}\n key={`${tool.source}:${tool.name}`}\n tool={tool}\n onSelectTool={props.onSelectTool}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction ToolRegistryRow(props: {\n tool: StudioAgentToolMetadata;\n active: boolean;\n onSelectTool: (toolName: string) => void;\n}) {\n const propertyCount = schemaPropertyCount(props.tool.parameters);\n return (\n <tr>\n <ToolTableCell>\n <div className=\"grid min-w-0 gap-1.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.tool.name}\n </span>\n {props.active ? <Badge className={selectedBadge}>selected</Badge> : null}\n </div>\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {props.tool.agentId}\n </span>\n <p className=\"m-0 max-w-[64ch] truncate text-sm leading-6 text-muted-foreground\">\n {props.tool.description}\n </p>\n </div>\n </ToolTableCell>\n <ToolTableCell>\n <Badge className={originBadgeClass(props.tool)}>{toolOriginLabel(props.tool)}</Badge>\n </ToolTableCell>\n <ToolTableCell>\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <ToolMetaPill>{schemaType(props.tool.parameters)}</ToolMetaPill>\n <ToolMetaPill>\n {propertyCount} {propertyCount === 1 ? \"field\" : \"fields\"}\n </ToolMetaPill>\n </div>\n </ToolTableCell>\n <ToolTableCell>\n <div className=\"grid min-w-0 gap-1.5\">\n <Badge className={approvalBadgeClass(props.tool.approval.required)}>\n {props.tool.approval.required ? \"required\" : \"none\"}\n </Badge>\n {props.tool.approval.reason === undefined ? null : (\n <span\n className=\"max-w-[280px] truncate text-xs leading-5 text-muted-foreground\"\n title={props.tool.approval.reason}\n >\n {props.tool.approval.reason}\n </span>\n )}\n </div>\n </ToolTableCell>\n <ToolTableCell>\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant={props.active ? \"secondary\" : \"ghost\"}\n onClick={() => props.onSelectTool(props.tool.name)}\n >\n {props.active ? \"Selected\" : \"Use\"}\n </Button>\n </ToolTableCell>\n </tr>\n );\n}\n\nfunction ToolTableHead(props: { children: string }) {\n return (\n <th className=\"border-b border-border/80 py-2.5 pr-5 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground first:pl-0\">\n {props.children}\n </th>\n );\n}\n\nfunction ToolTableCell(props: { children: ReactNode }) {\n return (\n <td className=\"border-b border-border/70 py-3.5 pr-5 align-top first:pl-0\">{props.children}</td>\n );\n}\n\nfunction summarizeTools(tools: StudioAgentToolMetadata[]) {\n return tools.reduce(\n (totals, tool) => {\n totals.total += 1;\n if (tool.source === \"dynamic\") {\n totals.dynamic += 1;\n } else {\n totals.static += 1;\n }\n if (tool.mcpServerName !== undefined) {\n totals.mcp += 1;\n }\n if (tool.approval.required) {\n totals.approvals += 1;\n }\n return totals;\n },\n { approvals: 0, dynamic: 0, mcp: 0, static: 0, total: 0 },\n );\n}\n\nconst selectedBadge = \"border-border/80 bg-muted/45 text-foreground\";\n"],"mappings":"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"}
|