@runfusion/fusion 0.35.0 → 0.37.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/bin.js +2685 -585
- package/dist/client/.vite/manifest.json +61 -61
- package/dist/client/assets/{AgentDetailView-CFX3jxfA.js → AgentDetailView-T_AHPxcG.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-4tnYHS0-.js → AgentPermissionPolicyEditor-niLSqGAE.js} +1 -1
- package/dist/client/assets/{AgentsView-DnNWfwiY.js → AgentsView-CQhaLHz_.js} +3 -3
- package/dist/client/assets/{ChatView-rwl2O-s0.js → ChatView-B60kYfdk.js} +1 -1
- package/dist/client/assets/{DevServerView-C9fEzcFQ.js → DevServerView-0Gb44WOb.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-Cwyr0Sl4.js → DirectoryPicker-BSQA0XM9.js} +1 -1
- package/dist/client/assets/{DocumentsView-gDWTMU2w.js → DocumentsView-XZbaqEFF.js} +1 -1
- package/dist/client/assets/{EvalsView-Cw7D1x0W.js → EvalsView-CJNtXxX9.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-8yeOcqbX.js → ExperimentalAgentOnboardingModal-DR8E3i36.js} +1 -1
- package/dist/client/assets/GoalsView-CN1zQ_Ax.js +1 -0
- package/dist/client/assets/GoalsView-CtWi0fxE.css +1 -0
- package/dist/client/assets/{InsightsView-IHHikd5n.js → InsightsView-D_jRaMyn.js} +1 -1
- package/dist/client/assets/{MemoryView-pii3HOba.js → MemoryView-D90vdPnp.js} +1 -1
- package/dist/client/assets/{NodesView-CoDK14B3.js → NodesView-C1zuedAe.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-vH7EJ5JD.js → PiExtensionsManager-DBJDDVfM.js} +1 -1
- package/dist/client/assets/{PluginManager-PbkFQ0Nu.js → PluginManager-Ceg64P2Z.js} +1 -1
- package/dist/client/assets/{ResearchView-Dp4g_BWq.js → ResearchView-XRwWdczc.js} +1 -1
- package/dist/client/assets/{SecretsView-Q8wES8_N.js → SecretsView-TCrKyCme.js} +1 -1
- package/dist/client/assets/{SettingsModal-127YAB8c.js → SettingsModal-B8fRuWdQ.js} +4 -4
- package/dist/client/assets/{SettingsModal-DdUztATB.js → SettingsModal-C1TczsEr.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-BSAFiQpJ.js → SetupWizardModal-D6moSTT3.js} +1 -1
- package/dist/client/assets/{SkillsView-Bj8KQQXB.js → SkillsView-BDHLPVBi.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-DvKN_b_k.js → StashRecoveryView-DZGa591R.js} +1 -1
- package/dist/client/assets/{TodoView-C-cabt2D.js → TodoView-nr_SnCJv.js} +1 -1
- package/dist/client/assets/{dashboard-view-DrHb8VOl.js → dashboard-view-0XeZ1FTR.js} +1 -1
- package/dist/client/assets/{folder-open-CYVKFKAx.js → folder-open-iURwQbEg.js} +1 -1
- package/dist/client/assets/index-CjuQj4qe.js +742 -0
- package/dist/client/assets/index-DmrpDn7c.css +1 -0
- package/dist/client/assets/{upload-eQh-mH3-.js → upload-Beqg4S4L.js} +1 -1
- package/dist/client/assets/{users-B5upejXg.js → users-C2o86ZCR.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/index.ts +1 -1
- package/dist/droid-cli/package.json +3 -3
- package/dist/droid-cli/src/__tests__/thinking-config.test.ts +1 -1
- package/dist/extension.js +1928 -287
- package/dist/pi-claude-cli/index.ts +3 -3
- package/dist/pi-claude-cli/package.json +3 -3
- package/dist/pi-claude-cli/src/__tests__/event-bridge.test.ts +3 -3
- package/dist/pi-claude-cli/src/__tests__/provider.test.ts +3 -3
- package/dist/pi-claude-cli/src/__tests__/thinking-config.test.ts +1 -1
- package/dist/pi-claude-cli/src/event-bridge.ts +2 -2
- package/dist/pi-claude-cli/src/provider.ts +1 -1
- package/dist/pi-claude-cli/src/thinking-config.ts +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +34607 -33421
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +7 -7
- package/skill/fusion/SKILL.md +1 -0
- package/skill/fusion/references/cli-commands.md +3 -0
- package/skill/fusion/references/extension-tools.md +43 -0
- package/skill/fusion/references/fusion-capabilities.md +4 -0
- package/dist/client/assets/GoalsView-Cg136Jcn.css +0 -1
- package/dist/client/assets/GoalsView-kRIhgAA6.js +0 -1
- package/dist/client/assets/index-Cuh_Pqv0.css +0 -1
- package/dist/client/assets/index-Cze5qbME.js +0 -742
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-
|
|
2
|
-
import{c as bt,A as Je,C as pt,Z as Is,s as Fs,r as Et,F as _t,f as zs,a as Os,b as ms,B as Lt,u as gs,d as yt,e as Ds,g as Hs,h as Bs,i as Pt,j as qt,k as xt,P as Ws,l as Gs,m as Vs,n as Ks,o as Zt,G as Us,S as Ys,L as kt,T as wt,R as Ze,X as Jt,p as Xs,q as qs,t as ut,v as Zs,w as Qt,x as Js,y as Qs,z as fe,D as nt,E as ea,M as ta,H as sa,I as es,N as ts,J as ss,K as aa,O as Ct,Q as mt,U as na,V as la,W as ia,Y as ra,_ as oa,$ as as,a0 as ca,a1 as da,a2 as gt,a3 as ua,a4 as ns,a5 as ma,a6 as ga}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-T_AHPxcG.js","assets/vendor-react-K0fH_qHe.js","assets/index-CjuQj4qe.js","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/vendor-codemirror-jBKmHyH0.js","assets/index-DmrpDn7c.css","assets/AgentPermissionPolicyEditor-niLSqGAE.js","assets/AgentPermissionPolicyEditor-CGxjOr6G.css","assets/ExperimentalAgentOnboardingModal-DR8E3i36.js","assets/ExperimentalAgentOnboardingModal-BNpveCEk.css","assets/AgentDetailView-CY-O6VkV.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{c as bt,A as Je,C as pt,Z as Is,s as Fs,r as Et,F as _t,f as zs,a as Os,b as ms,B as Lt,u as gs,d as yt,e as Ds,g as Hs,h as Bs,i as Pt,j as qt,k as xt,P as Ws,l as Gs,m as Vs,n as Ks,o as Zt,G as Us,S as Ys,L as kt,T as wt,R as Ze,X as Jt,p as Xs,q as qs,t as ut,v as Zs,w as Qt,x as Js,y as Qs,z as fe,D as nt,E as ea,M as ta,H as sa,I as es,N as ts,J as ss,K as aa,O as Ct,Q as mt,U as na,V as la,W as ia,Y as ra,_ as oa,$ as as,a0 as ca,a1 as da,a2 as gt,a3 as ua,a4 as ns,a5 as ma,a6 as ga}from"./index-CjuQj4qe.js";import{r as s,j as e,a as ha}from"./vendor-react-K0fH_qHe.js";import{A as pa,S as xa,E as ba,f as va}from"./ExperimentalAgentOnboardingModal-DR8E3i36.js";import{U as It}from"./upload-Beqg4S4L.js";import{F as fa}from"./folder-open-iURwQbEg.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";/**
|
|
3
3
|
* @license lucide-react v1.7.0 - ISC
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the ISC license.
|
|
@@ -26,4 +26,4 @@ reportsTo: null
|
|
|
26
26
|
skills:
|
|
27
27
|
- review
|
|
28
28
|
---
|
|
29
|
-
Agent instructions go here...`,value:j,onChange:i=>{f("paste"),y([]),k(i.target.value),O(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",d]}),ie&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(wt,{size:14}),ie]})]}),b==="preview"&&e.jsxs("div",{className:"agent-import-preview",children:[e.jsxs("div",{className:"agent-import-company",children:[e.jsx("span",{className:"agent-import-company-label",children:"Company"}),e.jsx("span",{className:"agent-import-company-name",children:w})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(_t,{size:14}),e.jsxs("span",{children:[P.length," agent",P.length!==1?"s":""," found"]})]}),P.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>z(P.map(i=>i.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>z([]),children:"Clear agents"})]}),P.length>0?e.jsx("div",{className:"agent-import-agent-list",children:P.map((i,p)=>e.jsxs("div",{className:"agent-import-agent-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select agent ${i.name}`,checked:v.includes(i.name),onChange:()=>Ie(i.name)})}),e.jsx("span",{className:"agent-import-agent-icon",children:i.icon||"🤖"}),e.jsxs("div",{className:"agent-import-agent-details",children:[e.jsx("span",{className:"agent-import-agent-name",children:i.name}),e.jsxs("span",{className:"agent-import-agent-meta",children:[i.title&&e.jsxs("span",{className:"agent-import-agent-title",children:[i.title," · "]}),e.jsx("span",{className:"agent-import-agent-role",children:i.role}),i.reportsTo&&e.jsxs("span",{className:"agent-import-agent-reports",children:[" · reports to ",i.reportsTo]}),i.skills&&i.skills.length>0&&e.jsxs("span",{className:"agent-import-agent-model",children:[" · skills: ",i.skills.join(", ")]})]}),i.instructionsText&&e.jsxs("span",{className:"agent-import-agent-instructions",children:[i.instructionsText.slice(0,100),i.instructionsText.length>100?"...":""]})]})]},p))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),T.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(_t,{size:14}),e.jsxs("span",{children:[T.length," skill",T.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>q(T.map(i=>i.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>q([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:T.map((i,p)=>e.jsxs("div",{className:"agent-import-skill-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select skill ${i.name}`,checked:F.includes(i.name),onChange:()=>Te(i.name)})}),e.jsx("span",{className:"agent-import-skill-icon",children:"⚡"}),e.jsxs("div",{className:"agent-import-skill-details",children:[e.jsx("span",{className:"agent-import-skill-name",children:i.name}),i.description&&e.jsx("span",{className:"agent-import-skill-description",children:i.description})]})]},`${i.name}-${p}`))})]}),he&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(wt,{size:14}),he]})]}),b==="result"&&N&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(pt,{size:32})}),e.jsx("h3",{className:"agent-import-result-title",children:"Import Complete"}),e.jsxs("p",{className:"agent-import-result-company",children:["From ",e.jsx("strong",{children:N.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[N.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[N.created.length," created"]})}),N.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[N.skipped.length," skipped (already exist)"]})}),N.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[N.errors.length," error",N.errors.length!==1?"s":""]})})]}),N.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:N.created.map((i,p)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(pt,{size:12}),e.jsx("span",{children:i.name})]},p))}),N.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:N.errors.map((i,p)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(Jt,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},p))}),N.skills&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-import-result-divider"}),e.jsx("h4",{className:"agent-import-result-section-title",children:"Skills"}),e.jsxs("div",{className:"agent-import-result-stats",children:[N.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[N.skills.imported.length," skill",N.skills.imported.length!==1?"s":""," imported"]})}),N.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[N.skills.skipped.length," skill",N.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),N.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[N.skills.errors.length," skill",N.skills.errors.length!==1?"s":""," error",N.skills.errors.length!==1?"s":""]})}),N.skills.imported.length===0&&N.skills.skipped.length===0&&N.skills.errors.length===0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsx("span",{children:"No skills in package"})})]}),N.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:N.skills.imported.map((i,p)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(pt,{size:12}),e.jsx("span",{children:i.name})]},p))}),N.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:N.skills.errors.map((i,p)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(Jt,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},p))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[b==="preview"&&e.jsx("button",{className:"btn",onClick:()=>o("input"),disabled:V,children:"Back"}),e.jsx("button",{className:"btn",onClick:Ae,disabled:V,children:b==="result"?"Close":"Cancel"}),b==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void ve(),disabled:je||(d==="directory"?$.length===0:d==="browse"?!K:!j.trim()),children:je?e.jsxs(e.Fragment,{children:[e.jsx(kt,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),b==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void Le(),disabled:V||M===0&&_===0,children:V?e.jsxs(e.Fragment,{children:[e.jsx(kt,{size:14,className:"spin"}),de]}):`Import ${Pe}`})]})]})}):null}const $t="fn-agent-org-chart-layout";function ds(n){return n==="auto"||n==="horizontal"||n==="vertical"}const Da=768,Ha={nodeWidth:220,siblingGap:24,rootGap:24,chartPadding:24},Ba={nodeWidth:160,siblingGap:8,rootGap:8,chartPadding:8};function hs(n){return n.children.length===0?1:n.children.reduce((r,x)=>r+hs(x),0)}function Wa(n){return n<=Da?Ba:Ha}function Ga(n,r){const x=hs(n);return x*r.nodeWidth+Math.max(0,x-1)*r.siblingGap}function Va(n,r=Number.POSITIVE_INFINITY){const x=Wa(r);if(n.length===0)return x.nodeWidth;const h=n.map(o=>Ga(o,x)).reduce((o,d)=>o+d,0),b=Math.max(0,n.length-1)*x.rootGap;return h+b+x.chartPadding*2}function Ka(n){const r=n.preference??"auto";if(r!=="auto")return r;const x=Number.isFinite(n.availableWidth)&&n.availableWidth>0?n.availableWidth:0;return x===0||n.tree.length<=1?"horizontal":Va(n.tree,x)>x?"vertical":"horizontal"}const us=s.lazy(()=>ca(()=>import("./AgentDetailView-CFX3jxfA.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])).then(n=>({default:n.AgentDetailView}))),Tt=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],Mt=[.1,.25,.5,1,2,3,5,10],Ua=.25,Ya=3,ht=16,qe=32;function Ft(n){switch(n){case"running":return"agent-badge--running";case"active":return"agent-badge--active";case"paused":return"agent-badge--paused";case"error":return"agent-badge--error";case"idle":default:return"agent-badge--idle"}}function zt(n,r){switch(r){case"running":return`${n}--running`;case"active":return`${n}--active`;case"paused":return`${n}--paused`;case"error":return`${n}--error`;case"idle":default:return`${n}--idle`}}function ps(n){return n.children.length===0?1:n.children.reduce((r,x)=>r+ps(x),0)}function Ot(n,r){return n.state==="error"?{title:void 0,label:"Error"}:{title:r.reason??r.label,label:r.stateDerived?null:r.label}}function xs({node:n,onSelect:r,getHealthStatus:x,selectedAgentId:g,registerNodeElement:h,linksRef:b}){const{agent:o,children:d}=n,f=x(o),j=Ot(o,f),k=Ft(o.state),$=zt("org-chart-node-card",o.state),y=ps(n),w={"--org-chart-subtree-leaves":String(y)};return e.jsxs("div",{className:`org-chart-node${d.length>0?" org-chart-node--has-children":""}`,style:w,children:[e.jsxs("div",{ref:E=>h(o.id,E),"data-agent-id":o.id,className:`org-chart-node-card ${$}${g===o.id?" agent-card--selected":""}`,onClick:()=>r(o.id),role:"button",tabIndex:0,onKeyDown:E=>{(E.key==="Enter"||E.key===" ")&&(E.key===" "&&E.preventDefault(),r(o.id))},children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:e.jsx(xt,{agent:o,size:20})}),e.jsx("span",{className:"org-chart-node__name",children:o.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${k}`,children:o.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:f.color},title:j.title,children:[f.icon,j.label&&e.jsx("span",{className:"text-secondary",children:j.label})]})]})]}),d.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${o.name} employees`,children:d.map(E=>(b.current.push({parentId:o.id,childId:E.agent.id}),e.jsx(xs,{node:E,onSelect:r,getHealthStatus:x,selectedAgentId:g,registerNodeElement:h,linksRef:b},E.agent.id)))})]})}function Xa({links:n,nodeElements:r,canvasRef:x,viewportRef:g,layoutMode:h,transform:b}){const[o,d]=s.useState([]);return s.useLayoutEffect(()=>{const f=x.current,j=g.current;if(!f||!j||n.length===0){d([]);return}const k=()=>{const y=f.getBoundingClientRect(),w=n.flatMap(({parentId:E,childId:P})=>{const W=r.get(E),T=r.get(P);if(!W||!T)return[];const L=W.getBoundingClientRect(),v=T.getBoundingClientRect(),z=(L.left-y.left)/b.scale,F=(L.top-y.top)/b.scale,q=(v.left-y.left)/b.scale,je=(v.top-y.top)/b.scale;if(h==="vertical"){const N=z,ge=F+L.height/b.scale/2,he=q,A=je+v.height/b.scale/2,Z=N-(N-he)/2;return[`M ${N} ${ge} L ${Z} ${ge} L ${Z} ${A} L ${he} ${A}`]}const le=z+L.width/b.scale/2,V=F+L.height/b.scale,ne=q+v.width/b.scale/2,ie=je,O=V+(ie-V)/2;return[`M ${le} ${V} L ${le} ${O} L ${ne} ${O} L ${ne} ${ie}`]});d(w)};k();const $=new ResizeObserver(k);return $.observe(f),$.observe(j),r.forEach(y=>$.observe(y)),()=>$.disconnect()},[x,h,n,r,b.scale,g]),e.jsx("svg",{className:"agent-org-chart-connectors","aria-hidden":"true",children:o.map((f,j)=>e.jsx("path",{d:f},`${j}-${f}`))})}function an({addToast:n,projectId:r,onOpenTaskLogs:x,agentOnboardingEnabled:g=!1}){const[h,b]=s.useState(!1),d=Xs()==="mobile",[f,j]=s.useState("all"),{agents:k,stats:$,isLoading:y,loadAgents:w,refreshAgents:E}=qs(r,{filterState:f,showSystemAgents:h}),[P,W]=s.useState(!1),[T,L]=s.useState(null),[v,z]=s.useState(!1),[F,q]=s.useState(null),[je,le]=s.useState(null),V=d&&!!F,[ne,ie]=s.useState("dashboard"),[O,N]=s.useState(null),[ge,he]=s.useState(!1),[A,Z]=s.useState(()=>{if(typeof window>"u")return"list";const t=ut("fn-agent-view",r);return t==="list"||t==="board"||t==="org"?t:"list"}),[re,Ee]=s.useState(()=>{if(typeof window>"u")return"auto";const t=ut($t,r);return ds(t)?t:"auto"}),[ee,te]=s.useState([]),[Ne,K]=s.useState(!1),[pe,Se]=s.useState(0),[oe,G]=s.useState(!1),[ce,xe]=s.useState(!1),[_e,ze]=s.useState(!1),[Ae,Oe]=s.useState(!1),[be,$e]=s.useState(0),[ve,Le]=s.useState(0),[M,_]=s.useState({scale:1,x:0,y:0}),[ye,ke]=s.useState(!1),Pe=s.useRef(null),de=s.useRef(null),Ie=s.useRef(null),Te=s.useRef(new Map),i=s.useRef([]),p=s.useRef(new Map),I=s.useRef(null),J=s.useRef(null),D=s.useRef(!1),{confirm:U}=Zs(),De=s.useRef(null),He=s.useId();s.useEffect(()=>{const t=ut("fn-agent-view",r);if(t==="list"||t==="board"||t==="org"){Z(t);return}Z("list")},[r]),s.useEffect(()=>{Qt("fn-agent-view",A,r)},[A,r]),s.useEffect(()=>{const t=ut($t,r);Ee(ds(t)?t:"auto")},[r]),s.useEffect(()=>{Qt($t,re,r)},[re,r]);const[vt,Fe]=s.useState(null),ft=s.useRef(null),[Qe,we]=s.useState(null),[lt,Me]=s.useState(null),[Be,Ce]=s.useState({}),[We,et]=s.useState(1),[a,S]=s.useState(!1),[se,ue]=s.useState(new Set),[Re,Ue]=s.useState(new Map),it=s.useRef(!0);s.useEffect(()=>(it.current=!0,()=>{it.current=!1}),[]),s.useEffect(()=>{Js(r).then(t=>{it.current&&et(t.heartbeatMultiplier??1)}).catch(()=>{})},[r]);const Dt=s.useCallback(async t=>{const l=Number.isFinite(t)&&t>0?t:1;et(l),S(!0);try{await Qs({heartbeatMultiplier:l},r),n(`Heartbeat speed set to ×${l.toFixed(1)}`,"success")}catch(c){n(`Failed to save heartbeat multiplier: ${fe(c)}`,"error")}finally{it.current&&S(!1)}},[r,n]),rt=s.useMemo(()=>Re.size===0?k:k.map(t=>{const l=Re.get(t.id);return l?{...t,state:l}:t}),[k,Re]),tt=s.useMemo(()=>rt.filter(t=>h||!nt(t)),[rt,h]),bs=s.useMemo(()=>rt.filter(t=>t.state!=="active"&&t.state!=="running"?!1:h||!nt(t)),[rt,h]),Ge=s.useMemo(()=>{if(h)return ee;const t=l=>nt(l.agent)?null:{...l,children:l.children.map(t).filter(c=>c!==null)};return ee.map(t).filter(l=>l!==null)},[ee,h]);s.useEffect(()=>{if(A!=="org")return;const t=de.current;if(!t)return;const l=()=>{Se(t.clientWidth)};l();const c=typeof ResizeObserver<"u"?new ResizeObserver(l):null;return c?.observe(t),window.addEventListener("resize",l),()=>{c?.disconnect(),window.removeEventListener("resize",l)}},[A,Ge.length]),s.useEffect(()=>{if(A!=="org")return;let t=!1;return K(!0),ea(r,{includeEphemeral:h}).then(l=>{t||te(l)}).catch(l=>{t||(n(`Failed to load org chart: ${fe(l)}`,"error"),te([]))}).finally(()=>{t||K(!1)}),()=>{t=!0}},[A,r,h,n]),s.useEffect(()=>{const t=setInterval(()=>{w()},3e4);return()=>{clearInterval(t)}},[w]),s.useEffect(()=>{if(!oe)return;let t=!1;Oe(!0),Pt(void 0,r).then(u=>{if(t)return;const C=u.filter(R=>!nt(R));$e(C.filter(R=>R.state==="active"||R.state==="running").length),Le(C.filter(R=>R.state==="paused").length)}).catch(u=>{t||($e(0),Le(0),n(`Failed to load bulk agent actions: ${fe(u)}`,"error"))}).finally(()=>{t||Oe(!1)});const l=u=>{const C=u.target;C&&(Pe.current?.contains(C)||De.current?.contains(C)||G(!1))},c=u=>{u.key==="Escape"&&(G(!1),De.current?.focus())};return document.addEventListener("mousedown",l),document.addEventListener("touchstart",l),document.addEventListener("keydown",c),()=>{t=!0,document.removeEventListener("mousedown",l),document.removeEventListener("touchstart",l),document.removeEventListener("keydown",c)}},[n,oe,r]);const Ht=async t=>{if(!_e){ze(!0);try{const c=(await Pt(void 0,r)).filter(B=>!nt(B)),u=c.filter(B=>t==="paused"?B.state==="active"||B.state==="running":B.state==="paused"),C=c.length-u.length;if(u.length===0){n(`No agents eligible to ${t==="paused"?"pause":"resume"}`,"error");return}if(!await U({title:t==="paused"?"Pause All Agents":"Resume All Agents",message:`${t==="paused"?"Pause":"Resume"} ${u.length} agent${u.length===1?"":"s"} in this project?`,danger:t==="paused"}))return;const ae=await Promise.allSettled(u.map(B=>as(B.id,t,r))),Q=ae.map((B,dt)=>({result:B,agent:u[dt]})).filter(B=>B.result.status==="rejected"),m=ae.length-Q.length,H=Q.length,X=`${t==="paused"?"Paused":"Resumed"} ${m} agent${m===1?"":"s"}; skipped ${C}`;if(H>0){const B=Q.slice(0,3).map(({agent:dt,result:Ps})=>`${dt.name||dt.id}: ${fe(Ps.reason)}`).join("; ");n(`${X}; failed ${H}${B?` (${B})`:""}`,"error")}else n(X,"success");await w()}catch(l){n(`Failed to ${t==="paused"?"pause":"resume"} agents: ${fe(l)}`,"error")}finally{ze(!1)}}},st=async(t,l)=>{if(!se.has(t)){ue(c=>new Set(c).add(t)),Ue(c=>{const u=new Map(c);return u.set(t,l),u});try{await as(t,l,r),n(`Agent state updated to ${l}`,"success"),await w(),Ue(c=>{const u=new Map(c);return u.delete(t),u})}catch(c){Ue(u=>{const C=new Map(u);return C.delete(t),C}),n(`Failed to update state: ${fe(c)}`,"error")}finally{ue(c=>{const u=new Set(c);return u.delete(t),u})}}},vs=async(t,l)=>{if(await U({title:"Delete Agent",message:`Delete agent "${l}"? This cannot be undone.`,danger:!0}))try{await ga(t,r),n(`Agent "${l}" deleted`,"success"),await w()}catch(u){n(`Failed to delete agent: ${fe(u)}`,"error")}},fs=async(t,l)=>{const c=k.find(u=>u.id===t);if(c){if(c.role===l){Fe(null);return}try{await gt(t,{role:l},r),n(`Agent role updated to ${Tt.find(u=>u.value===l)?.label??l}`,"success"),Fe(null),w()}catch(u){n(`Failed to update role: ${fe(u)}`,"error")}}},js=(t,l)=>{t.key==="Escape"&&Fe(null)},Ns=async(t,l)=>{lt===t.id&&(Me(null),Ce(c=>{const u={...c};return delete u[t.id],u})),we(t.id);try{await gt(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:l}},r),n(`Heartbeat interval updated to ${ns(l)} for ${t.name}`,"success"),w()}catch(c){n(`Failed to update heartbeat interval: ${fe(c)}`,"error")}finally{we(null)}},Bt=async t=>{const l=Be[t.id]??"";if(l.trim()===""){n("Please enter a heartbeat interval in minutes","error");return}const c=Number(l);if(isNaN(c)){n("Heartbeat interval must be a valid number","error");return}if(c<=0){n("Heartbeat interval must be greater than 0","error");return}if(c>=1&&c<5){we(t.id);try{await gt(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:ua}},r),n(`Heartbeat interval set to 5 minutes (minimum). ${c} minute${c!==1?"s":""} was below the 5-minute minimum.`,"success"),Me(null),Ce(C=>{const R={...C};return delete R[t.id],R}),w()}catch(C){n(`Failed to update heartbeat interval: ${fe(C)}`,"error")}finally{we(null)}return}const u=Math.round(c*6e4);we(t.id);try{await gt(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:u}},r),n(`Heartbeat interval updated to ${ns(u)} for ${t.name}`,"success"),Me(null),Ce(C=>{const R={...C};return delete R[t.id],R}),w()}catch(C){n(`Failed to update heartbeat interval: ${fe(C)}`,"error")}finally{we(null)}},ys=t=>{const l=Et(t.runtimeConfig?.heartbeatIntervalMs),c=Math.round(l/6e4);Me(t.id),Ce(u=>({...u,[t.id]:String(c)}))},me=s.useCallback((t,l)=>{q(t),ie(l?.initialTab??"dashboard"),N(l?.initialRunId??null),he(l?.preferActiveRun??!1)},[]),Ve=s.useCallback(()=>{q(null),ie("dashboard"),N(null),he(!1)},[]),Wt=s.useCallback(t=>{me(t)},[me]),ks=s.useCallback(t=>{le(t),me(t)},[me]),ws=s.useCallback(async({agentId:t,deleted:l})=>{await E(),l&&F===t&&Ve()},[E,F,Ve]),Cs=s.useCallback(t=>{me(t),d&&xe(!1)},[d,me]),Ss=async(t,l)=>{Ue(c=>{const u=new Map(c);return u.set(t,"running"),u});try{await ma(t,r,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),n(`Heartbeat run started for ${l}`,"success"),await w(),Ue(c=>{const u=new Map(c);return u.delete(t),u})}catch(c){Ue(u=>{const C=new Map(u);return C.delete(t),C}),n(`Failed to start heartbeat run: ${fe(c)}`,"error")}},Ke=s.useCallback(t=>Math.min(Ya,Math.max(Ua,t)),[]),Y=s.useCallback(t=>{const l=de.current,c=Ie.current?.querySelector(".agent-org-chart");if(!l||!c)return{...t,scale:Ke(t.scale)};const u=Ke(t.scale),C=c.scrollWidth*u,R=c.scrollHeight*u,ae=l.clientWidth,Q=l.clientHeight,m=Math.min(qe,ae-C-qe),H=qe,X=Math.min(qe,Q-R-qe),B=qe;return{scale:u,x:Math.max(m,Math.min(H,t.x)),y:Math.max(X,Math.min(B,t.y))}},[Ke]),ot=s.useCallback((t,l,c)=>{const u=de.current;u&&_(C=>{const R=Ke(t),ae=u.getBoundingClientRect(),Q=l-ae.left,m=c-ae.top,H=(Q-C.x)/C.scale,X=(m-C.y)/C.scale;return Y({scale:R,x:Q-H*R,y:m-X*R})})},[Ke,Y]),Ye=s.useCallback(()=>{const t=de.current,l=Ie.current?.querySelector(".agent-org-chart");if(!t||!l)return;const c=t.clientWidth,u=t.clientHeight,C=l.scrollWidth,R=l.scrollHeight;if(C<=0||R<=0)return;const ae=Ke(Math.min(c/C,u/R,1)),Q=(c-C*ae)/2,m=(u-R*ae)/2;_(Y({scale:ae,x:Q,y:m}))},[Ke,Y]),jt=s.useCallback(t=>{Z(t),t!=="org"&&_({scale:1,x:0,y:0}),d&&F&&Ve()},[Ve,d,F]),Gt=t=>Tt.find(l=>l.value===t)?.label??t,ct=s.useMemo(()=>Ka({tree:Ge,availableWidth:pe,preference:re}),[Ge,re,pe]),Vt=s.useCallback(t=>{Ee(t),_({scale:1,x:0,y:0})},[]);s.useEffect(()=>{_({scale:1,x:0,y:0}),D.current=!1},[r,ct]),s.useLayoutEffect(()=>{A!=="org"||Ne||Ge.length===0||D.current||(Ye(),D.current=!0)},[A,Ge.length,Ye,Ne]);const As=s.useCallback((t,l)=>{l?Te.current.set(t,l):Te.current.delete(t)},[]),Kt=s.useCallback(()=>e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>_(t=>Y({...t,scale:t.scale*.9})),"aria-label":"Zoom out org chart",title:"Zoom out",children:e.jsx(Aa,{size:16})}),e.jsxs("span",{className:"agent-org-chart-controls__zoom-label","aria-live":"polite",children:[Math.round(M.scale*100),"%"]}),e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>_(t=>Y({...t,scale:t.scale*1.1})),"aria-label":"Zoom in org chart",title:"Zoom in",children:e.jsx(Ca,{size:16})}),e.jsxs("button",{type:"button",className:"btn touch-target btn-sm agent-org-chart-controls__fit-btn",onClick:Ye,"aria-label":"Fit org chart",title:"Fit org chart",children:[e.jsx(ta,{size:16}),"Fit"]}),e.jsxs("button",{type:"button",className:"btn touch-target btn-sm",onClick:()=>_(t=>Y({...t,x:0,y:0})),"aria-label":"Center org chart",title:"Center org chart",children:[e.jsx(sa,{size:16}),"Center"]})]}),[Y,Ye,M.scale]),Rs=s.useCallback(t=>{if(!(t.ctrlKey||t.metaKey))return;t.preventDefault();const l=t.deltaY>0?.9:1.1;ot(M.scale*l,t.clientX,t.clientY)},[M.scale,ot]),$s=s.useCallback(t=>{if(t.target.closest(".org-chart-node-card"))return;if(t.currentTarget.setPointerCapture?.(t.pointerId),p.current.set(t.pointerId,{x:t.clientX,y:t.clientY}),p.current.size===1){I.current={x:t.clientX-M.x,y:t.clientY-M.y,pointerId:t.pointerId},ke(!0);return}if(p.current.size===2){const c=Array.from(p.current.values()),u=c[0].x-c[1].x,C=c[0].y-c[1].y;J.current={distance:Math.hypot(u,C),scale:M.scale,centerX:(c[0].x+c[1].x)/2,centerY:(c[0].y+c[1].y)/2},I.current=null}},[M.scale,M.x,M.y]),Ts=s.useCallback(t=>{if(p.current.has(t.pointerId)){if(p.current.set(t.pointerId,{x:t.clientX,y:t.clientY}),p.current.size>=2){const l=Array.from(p.current.values()),c=J.current;if(!c)return;const u=l[0].x-l[1].x,C=l[0].y-l[1].y,R=Math.hypot(u,C),ae=c.scale*(R/c.distance);ot(ae,c.centerX,c.centerY);return}!I.current||I.current.pointerId!==t.pointerId||_(l=>Y({...l,x:t.clientX-I.current.x,y:t.clientY-I.current.y}))}},[Y,ot]),Ut=s.useCallback(t=>{p.current.delete(t.pointerId),p.current.size<2&&(J.current=null),p.current.size===0&&(I.current=null,ke(!1))},[]),Ms=s.useCallback(t=>{if(t.key==="ArrowLeft")_(l=>Y({...l,x:l.x+ht}));else if(t.key==="ArrowRight")_(l=>Y({...l,x:l.x-ht}));else if(t.key==="ArrowUp")_(l=>Y({...l,y:l.y+ht}));else if(t.key==="ArrowDown")_(l=>Y({...l,y:l.y-ht}));else if(t.key==="+"||t.key==="=")_(l=>Y({...l,scale:l.scale*1.1}));else if(t.key==="-")_(l=>Y({...l,scale:l.scale*.9}));else if(t.key==="0")Ye();else if(t.key==="Home")_({scale:1,x:0,y:0});else return;t.preventDefault()},[Y,Ye]),Yt=s.useCallback(()=>{const t=[{value:"horizontal",label:"Horizontal",icon:e.jsx(ts,{size:16}),ariaLabel:"Horizontal layout"},{value:"vertical",label:"Vertical",icon:e.jsx(es,{size:16}),ariaLabel:"Vertical layout"},{value:"auto",label:"Auto",icon:e.jsx(Ze,{size:16}),ariaLabel:"Automatic layout"}];return e.jsx("div",{className:"agent-org-chart-layout-toggle","data-testid":"agent-org-chart-layout-toggle",children:t.map(l=>{const c=re===l.value;return e.jsxs("button",{type:"button",className:`btn-icon touch-target agent-org-chart-layout-toggle__button${c?" btn-icon--active":""}`,onClick:()=>Vt(l.value),"aria-pressed":c,"aria-label":l.ariaLabel,title:l.ariaLabel,"data-layout-value":l.value,children:[l.icon,e.jsx("span",{className:"agent-org-chart-layout-toggle__text",children:l.label})]},l.value)})})},[Vt,re]),Es=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],Nt=t=>da(t),_s=Ae||_e||be===0,Ls=Ae||_e||ve===0,Xt=y&&k.length===0,at=s.useCallback(()=>{W(!0)},[]);return e.jsxs("div",{className:"agents-view",children:[e.jsxs("div",{className:"agents-view-header",children:[e.jsxs("div",{className:"agents-view-title",children:[e.jsx(Lt,{size:24}),e.jsx("h2",{children:"Agents"})]}),e.jsxs("div",{className:"agents-view-controls",children:[e.jsxs("div",{className:"view-toggle",children:[e.jsx("button",{className:`view-toggle-btn${A==="list"?" active":""}`,onClick:()=>jt("list"),title:"List view","aria-label":"List view","aria-pressed":A==="list",children:e.jsx(es,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="board"?" active":""}`,onClick:()=>jt("board"),title:"Board view","aria-label":"Board view","aria-pressed":A==="board",children:e.jsx(Je,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="org"?" active":""}`,onClick:()=>jt("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":A==="org",children:e.jsx(ts,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:De,className:`btn-icon agent-controls-trigger${oe?" agent-controls-trigger--active":""}`,onClick:()=>G(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":oe,"aria-controls":He,children:e.jsx(ka,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void w(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Ze,{size:16,className:y?"spin":void 0})}),!d&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm agent-import-trigger",onClick:()=>{z(!0),G(!1)},"aria-label":"Import",title:"Import",children:[e.jsx(It,{size:16}),"Import"]}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{at(),G(!1)},"aria-label":"New Agent",title:"New Agent",children:[e.jsx(ss,{size:16}),"New Agent"]})]}),oe&&e.jsxs("div",{ref:Pe,id:He,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsx("div",{className:"agent-controls",children:e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(aa,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:f,onChange:t=>j(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:h,onChange:t=>b(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]})}),d&&e.jsxs("div",{className:"agent-controls-mobile-actions",children:[e.jsxs("button",{className:"btn btn-sm agent-import-trigger",onClick:()=>{z(!0),G(!1)},"aria-label":"Import",title:"Import",children:[e.jsx(It,{size:16}),"Import"]}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{at(),G(!1)},"aria-label":"New Agent",title:"New Agent",children:[e.jsx(ss,{size:16}),"New Agent"]})]}),e.jsxs("div",{className:"agent-controls-bulk-actions",role:"menu","aria-label":"Bulk agent actions",children:[e.jsxs("button",{type:"button",className:"agent-detail-bulk-menu-item",role:"menuitem",disabled:_s,onClick:()=>{G(!1),Ht("paused")},children:[e.jsxs("span",{className:"agent-controls-bulk-actions__label",children:[e.jsx(Ct,{}),e.jsx("span",{children:"Pause All Agents"})]}),e.jsx("span",{className:"agent-detail-bulk-menu-item-hint",children:Ae?"Loading eligibility…":be===0?"No active or running project agents to pause":`Pause ${be} active/running agent${be===1?"":"s"}`})]}),e.jsxs("button",{type:"button",className:"agent-detail-bulk-menu-item",role:"menuitem",disabled:Ls,onClick:()=>{G(!1),Ht("active")},children:[e.jsxs("span",{className:"agent-controls-bulk-actions__label",children:[e.jsx(mt,{}),e.jsx("span",{children:"Resume All Agents"})]}),e.jsx("span",{className:"agent-detail-bulk-menu-item-hint",children:Ae?"Loading eligibility…":ve===0?"No paused project agents to resume":`Resume ${ve} paused agent${ve===1?"":"s"}`})]})]}),e.jsx("div",{className:"agent-global-controls agent-controls-actions",children:e.jsxs("div",{className:"heartbeat-multiplier-group",children:[e.jsxs("div",{className:"heartbeat-multiplier-controls",children:[e.jsx("label",{htmlFor:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-label",children:"Heartbeat Speed"}),e.jsx("input",{id:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-slider touch-target",type:"range",min:.1,max:10,step:.1,value:We,onChange:t=>{const l=Number(t.target.value);Dt(Number.isFinite(l)&&l>0?l:1)},disabled:a}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",We.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(Mt.reduce((t,l)=>Math.abs(l-We)<Math.abs(t-We)?l:t,Mt[0])),onChange:t=>{const l=Number(t.target.value);Dt(Number.isFinite(l)&&l>0?l:1)},disabled:a,"aria-label":"Heartbeat speed preset",children:Mt.map(t=>e.jsxs("option",{value:String(t),children:["×",t]},t))})]}),e.jsx("small",{className:"text-secondary",children:"Scales all agent heartbeat intervals. ×0.5 = twice as fast, ×2.0 = twice as slow. Default: ×1.0"})]})}),e.jsx(Ra,{agents:tt})]})]})]})]}),e.jsx(Fa,{isOpen:P,onClose:()=>{W(!1),L(null)},onCreated:()=>{W(!1),L(null),w()},projectId:r,prefillDraft:T,agentOnboardingEnabled:g,existingAgents:k,onPrefillDraft:L}),e.jsx(Oa,{isOpen:v,onClose:()=>z(!1),onImported:()=>void w(),projectId:r}),e.jsx(Pa,{stats:$,activeAgents:bs,projectId:r,isOpen:ce,onToggle:()=>xe(t=>!t),onSelectAgent:Cs,onOpenTaskLogs:x}),A==="org"?e.jsx("div",{className:"agents-org-full-view",children:e.jsx("div",{className:"agents-view-content agents-view-content--org-full",children:F?e.jsxs("div",{className:"agents-org-detail-view","data-testid":"agents-org-detail-view",children:[e.jsx("button",{type:"button",className:"btn btn-sm agents-org-detail-back",onClick:Ve,"aria-label":"Back to org chart",children:"Back to org chart"}),e.jsx(s.Suspense,{fallback:null,children:e.jsx(us,{inline:!0,showInlineBackButton:!1,agentId:F,projectId:r,onClose:Ve,addToast:n,onChildClick:Wt,initialTab:ne,initialRunId:O,preferActiveRun:ge},F)})]}):Xt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ze,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):e.jsxs("div",{className:"agent-org-chart-shell","data-testid":"agent-org-chart-shell",children:[d?e.jsxs("div",{className:"agent-org-chart-controls","data-testid":"agent-org-chart-controls",children:[Yt(),Kt()]}):e.jsxs("div",{className:"agent-org-chart-toolbar",children:[Yt(),e.jsx("div",{className:"agent-org-chart-controls","data-testid":"agent-org-chart-controls",children:Kt()})]}),e.jsx("div",{ref:de,className:"agent-org-chart-viewport","data-testid":"agent-org-chart-viewport",tabIndex:0,role:"region","aria-label":"Org chart canvas",onWheel:Rs,onPointerDown:$s,onPointerMove:Ts,onPointerUp:Ut,onPointerCancel:Ut,onKeyDown:Ms,"data-panning":ye?"true":"false",children:e.jsxs("div",{ref:Ie,className:`agent-org-chart-canvas agent-org-chart-canvas--zoom-${Math.round((M.scale??1)*100)}`,"data-panning":ye?"true":"false",style:{transform:`translate(${M.x}px, ${M.y}px) scale(${M.scale})`},children:[e.jsx("div",{className:`agent-org-chart${ct==="vertical"?" agent-org-chart--vertical":""}`,"data-testid":"agent-org-chart","data-layout-mode":ct,children:Ne?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Ze,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):Ge.length===0?e.jsx(At,{onCtaClick:at}):(i.current=[],Ge.map(t=>e.jsx(xs,{node:t,onSelect:ks,getHealthStatus:Nt,selectedAgentId:je,registerNodeElement:As,linksRef:i},t.agent.id)))}),e.jsx(Xa,{links:i.current,nodeElements:Te.current,canvasRef:Ie,viewportRef:de,layoutMode:ct,transform:M})]})})]})})}):e.jsxs("div",{className:"agents-split-layout",children:[e.jsx("div",{className:`agents-split-sidebar${V?" agents-split-sidebar--hidden-mobile":""}`,children:e.jsx("div",{className:"agents-view-content",children:Xt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ze,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):A==="board"?e.jsx("div",{className:"agent-board",children:tt.length===0?e.jsx(At,{onCtaClick:at}):tt.map(t=>{const l=Nt(t),c=Ot(t,l),u=Ft(t.state),C=zt("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${C}${F===t.id?" agent-card--selected":""}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>me(t.id),role:"button",tabIndex:0,onKeyDown:R=>{(R.key==="Enter"||R.key===" ")&&(R.key===" "&&R.preventDefault(),me(t.id))},children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:e.jsx(xt,{agent:t,size:20})}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:Gt(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${u}`,children:t.state}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"agent-board-badge badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:l.color},title:c.title,children:[l.icon,c.label?` ${c.label}`:""]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:tt.length===0?e.jsx(At,{onCtaClick:at}):tt.map(t=>{const l=Nt(t),c=Ot(t,l),u=Ft(t.state),C=zt("agent-card",t.state),R=Et(t.runtimeConfig?.heartbeatIntervalMs),ae=na(R),Q=Qe===t.id;return e.jsxs("div",{className:`agent-card agent-card--clickable ${C}${F===t.id?" agent-card--selected":""}`,onClick:m=>{const H=m.target;if(H===m.currentTarget){me(t.id);return}const X=H.closest('button, select, input, [role="button"]');X&&X!==m.currentTarget||me(t.id)},role:"button",tabIndex:0,onKeyDown:m=>{m.target===m.currentTarget&&(m.key==="Enter"||m.key===" ")&&(m.key===" "&&m.preventDefault(),me(t.id))},"aria-label":`Open details for ${t.name}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info",children:[vt===t.id?e.jsx("select",{ref:ft,className:"select agent-role-select",value:t.role,onChange:m=>void fs(t.id,m.target.value),onKeyDown:m=>js(m,t.id),onBlur:()=>Fe(null),autoFocus:!0,children:Tt.map(m=>e.jsxs("option",{value:m.value,children:[m.icon," ",m.label]},m.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:m=>{m.stopPropagation(),Fe(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.stopPropagation(),Fe(t.id))},children:e.jsx(xt,{agent:t,size:20})}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(ms,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${u}`,children:t.state}),e.jsxs("span",{className:"badge",style:{color:l.color},title:c.title,children:[l.icon,c.label?` ${c.label}`:""]}),e.jsx("span",{className:"badge text-secondary",children:Gt(t.role)}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null,(()=>{const m=Es(t);if(m.length===0)return null;const H=m.slice(0,2),X=m.length-2;return e.jsxs(e.Fragment,{children:[H.map(B=>e.jsx("span",{className:"badge badge-skill",title:B,children:va(B)},B)),X>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",X]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.state==="error"&&t.lastError?e.jsx(la,{errorText:t.lastError,issueContext:{surface:"AgentsView list",agentId:t.id,agentName:t.name,agentState:t.state,taskId:t.taskId}}):null,t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),lt===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:Be[t.id]??"",onChange:m=>Ce(H=>({...H,[t.id]:m.target.value})),onKeyDown:m=>{m.key==="Enter"?Bt(t):m.key==="Escape"&&(Me(null),Ce(H=>{const X={...H};return delete X[t.id],X}))},disabled:Q,"aria-label":`Custom heartbeat interval in minutes for ${t.name}`}),e.jsx("span",{className:"text-secondary",children:"min"}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void Bt(t),disabled:Q,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn-sm",onClick:()=>{Me(null),Ce(m=>{const H={...m};return delete H[t.id],H})},disabled:Q,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:R,onChange:m=>{const H=m.target.value;H==="__custom__"?ys(t):Ns(t,Number(H))},disabled:Q,"aria-label":`Set heartbeat interval for ${t.name}`,children:[ae.map(m=>e.jsx("option",{value:m.value,children:m.label},m.value)),ia.some(m=>m.value===R)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),Q&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const m=new Date(t.lastHeartbeatAt),H=new Date(m.getTime()+R),X=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:m.toLocaleString(),children:["Last: ",m.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]}),X&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:H.toLocaleString(),children:["Next: ",H.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[e.jsxs("div",{className:"agent-card-actions-group agent-card-actions-group--primary",children:[t.state==="idle"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"active"),disabled:se.has(t.id),title:"Activate",children:[e.jsx(mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Start"})]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void Ss(t.id,t.name),disabled:se.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(Je,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Run Now"})]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"paused"),disabled:se.has(t.id),title:"Pause",children:[e.jsx(Ct,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Pause"})]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"active"),disabled:se.has(t.id),title:"Resume",children:[e.jsx(mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Resume"})]}),t.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>me(t.id,{initialTab:"runs",initialRunId:null,preferActiveRun:!0}),title:"View live run details","aria-label":`View live run details for ${t.name}`,children:[e.jsx(Je,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Running"})]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"paused"),disabled:se.has(t.id),title:"Pause",children:[e.jsx(Ct,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Pause"})]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"active"),disabled:se.has(t.id),title:"Retry",children:[e.jsx(mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Retry"})]})]}),e.jsxs("div",{className:"agent-card-actions-group agent-card-actions-group--secondary",children:[e.jsxs("button",{className:"btn btn-sm agent-card-details-btn",onClick:()=>me(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:[e.jsx(ra,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Details"})]}),(t.state==="idle"||t.state==="paused")&&e.jsxs("button",{className:"btn btn-sm btn-danger",onClick:()=>void vs(t.id,t.name),title:"Delete",children:[e.jsx(oa,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Delete"})]})]})]})]},t.id)})})})}),e.jsx("div",{className:`agents-split-detail${d&&!F?" agents-split-detail--hidden-mobile":""}`,children:F?e.jsx(s.Suspense,{fallback:null,children:e.jsx(us,{inline:!0,showInlineBackButton:d,agentId:F,projectId:r,onClose:Ve,addToast:n,onChildClick:Wt,initialTab:ne,initialRunId:O,preferActiveRun:ge,onMutationSuccess:ws},F)}):e.jsxs("div",{className:"agents-detail-empty-state",children:[e.jsx(Lt,{size:48}),e.jsx("h3",{children:"Select an agent"}),e.jsx("p",{children:"Choose an agent from the sidebar to view details"})]})})]})]})}export{an as AgentsView};
|
|
29
|
+
Agent instructions go here...`,value:j,onChange:i=>{f("paste"),y([]),k(i.target.value),O(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",d]}),ie&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(wt,{size:14}),ie]})]}),b==="preview"&&e.jsxs("div",{className:"agent-import-preview",children:[e.jsxs("div",{className:"agent-import-company",children:[e.jsx("span",{className:"agent-import-company-label",children:"Company"}),e.jsx("span",{className:"agent-import-company-name",children:w})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(_t,{size:14}),e.jsxs("span",{children:[P.length," agent",P.length!==1?"s":""," found"]})]}),P.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>z(P.map(i=>i.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>z([]),children:"Clear agents"})]}),P.length>0?e.jsx("div",{className:"agent-import-agent-list",children:P.map((i,p)=>e.jsxs("div",{className:"agent-import-agent-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select agent ${i.name}`,checked:v.includes(i.name),onChange:()=>Ie(i.name)})}),e.jsx("span",{className:"agent-import-agent-icon",children:i.icon||"🤖"}),e.jsxs("div",{className:"agent-import-agent-details",children:[e.jsx("span",{className:"agent-import-agent-name",children:i.name}),e.jsxs("span",{className:"agent-import-agent-meta",children:[i.title&&e.jsxs("span",{className:"agent-import-agent-title",children:[i.title," · "]}),e.jsx("span",{className:"agent-import-agent-role",children:i.role}),i.reportsTo&&e.jsxs("span",{className:"agent-import-agent-reports",children:[" · reports to ",i.reportsTo]}),i.skills&&i.skills.length>0&&e.jsxs("span",{className:"agent-import-agent-model",children:[" · skills: ",i.skills.join(", ")]})]}),i.instructionsText&&e.jsxs("span",{className:"agent-import-agent-instructions",children:[i.instructionsText.slice(0,100),i.instructionsText.length>100?"...":""]})]})]},p))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),T.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(_t,{size:14}),e.jsxs("span",{children:[T.length," skill",T.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>q(T.map(i=>i.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>q([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:T.map((i,p)=>e.jsxs("div",{className:"agent-import-skill-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select skill ${i.name}`,checked:F.includes(i.name),onChange:()=>Te(i.name)})}),e.jsx("span",{className:"agent-import-skill-icon",children:"⚡"}),e.jsxs("div",{className:"agent-import-skill-details",children:[e.jsx("span",{className:"agent-import-skill-name",children:i.name}),i.description&&e.jsx("span",{className:"agent-import-skill-description",children:i.description})]})]},`${i.name}-${p}`))})]}),he&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(wt,{size:14}),he]})]}),b==="result"&&N&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(pt,{size:32})}),e.jsx("h3",{className:"agent-import-result-title",children:"Import Complete"}),e.jsxs("p",{className:"agent-import-result-company",children:["From ",e.jsx("strong",{children:N.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[N.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[N.created.length," created"]})}),N.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[N.skipped.length," skipped (already exist)"]})}),N.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[N.errors.length," error",N.errors.length!==1?"s":""]})})]}),N.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:N.created.map((i,p)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(pt,{size:12}),e.jsx("span",{children:i.name})]},p))}),N.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:N.errors.map((i,p)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(Jt,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},p))}),N.skills&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-import-result-divider"}),e.jsx("h4",{className:"agent-import-result-section-title",children:"Skills"}),e.jsxs("div",{className:"agent-import-result-stats",children:[N.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[N.skills.imported.length," skill",N.skills.imported.length!==1?"s":""," imported"]})}),N.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[N.skills.skipped.length," skill",N.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),N.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[N.skills.errors.length," skill",N.skills.errors.length!==1?"s":""," error",N.skills.errors.length!==1?"s":""]})}),N.skills.imported.length===0&&N.skills.skipped.length===0&&N.skills.errors.length===0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsx("span",{children:"No skills in package"})})]}),N.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:N.skills.imported.map((i,p)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(pt,{size:12}),e.jsx("span",{children:i.name})]},p))}),N.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:N.skills.errors.map((i,p)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(Jt,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},p))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[b==="preview"&&e.jsx("button",{className:"btn",onClick:()=>o("input"),disabled:V,children:"Back"}),e.jsx("button",{className:"btn",onClick:Ae,disabled:V,children:b==="result"?"Close":"Cancel"}),b==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void ve(),disabled:je||(d==="directory"?$.length===0:d==="browse"?!K:!j.trim()),children:je?e.jsxs(e.Fragment,{children:[e.jsx(kt,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),b==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void Le(),disabled:V||M===0&&_===0,children:V?e.jsxs(e.Fragment,{children:[e.jsx(kt,{size:14,className:"spin"}),de]}):`Import ${Pe}`})]})]})}):null}const $t="fn-agent-org-chart-layout";function ds(n){return n==="auto"||n==="horizontal"||n==="vertical"}const Da=768,Ha={nodeWidth:220,siblingGap:24,rootGap:24,chartPadding:24},Ba={nodeWidth:160,siblingGap:8,rootGap:8,chartPadding:8};function hs(n){return n.children.length===0?1:n.children.reduce((r,x)=>r+hs(x),0)}function Wa(n){return n<=Da?Ba:Ha}function Ga(n,r){const x=hs(n);return x*r.nodeWidth+Math.max(0,x-1)*r.siblingGap}function Va(n,r=Number.POSITIVE_INFINITY){const x=Wa(r);if(n.length===0)return x.nodeWidth;const h=n.map(o=>Ga(o,x)).reduce((o,d)=>o+d,0),b=Math.max(0,n.length-1)*x.rootGap;return h+b+x.chartPadding*2}function Ka(n){const r=n.preference??"auto";if(r!=="auto")return r;const x=Number.isFinite(n.availableWidth)&&n.availableWidth>0?n.availableWidth:0;return x===0||n.tree.length<=1?"horizontal":Va(n.tree,x)>x?"vertical":"horizontal"}const us=s.lazy(()=>ca(()=>import("./AgentDetailView-T_AHPxcG.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])).then(n=>({default:n.AgentDetailView}))),Tt=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],Mt=[.1,.25,.5,1,2,3,5,10],Ua=.25,Ya=3,ht=16,qe=32;function Ft(n){switch(n){case"running":return"agent-badge--running";case"active":return"agent-badge--active";case"paused":return"agent-badge--paused";case"error":return"agent-badge--error";case"idle":default:return"agent-badge--idle"}}function zt(n,r){switch(r){case"running":return`${n}--running`;case"active":return`${n}--active`;case"paused":return`${n}--paused`;case"error":return`${n}--error`;case"idle":default:return`${n}--idle`}}function ps(n){return n.children.length===0?1:n.children.reduce((r,x)=>r+ps(x),0)}function Ot(n,r){return n.state==="error"?{title:void 0,label:"Error"}:{title:r.reason??r.label,label:r.stateDerived?null:r.label}}function xs({node:n,onSelect:r,getHealthStatus:x,selectedAgentId:g,registerNodeElement:h,linksRef:b}){const{agent:o,children:d}=n,f=x(o),j=Ot(o,f),k=Ft(o.state),$=zt("org-chart-node-card",o.state),y=ps(n),w={"--org-chart-subtree-leaves":String(y)};return e.jsxs("div",{className:`org-chart-node${d.length>0?" org-chart-node--has-children":""}`,style:w,children:[e.jsxs("div",{ref:E=>h(o.id,E),"data-agent-id":o.id,className:`org-chart-node-card ${$}${g===o.id?" agent-card--selected":""}`,onClick:()=>r(o.id),role:"button",tabIndex:0,onKeyDown:E=>{(E.key==="Enter"||E.key===" ")&&(E.key===" "&&E.preventDefault(),r(o.id))},children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:e.jsx(xt,{agent:o,size:20})}),e.jsx("span",{className:"org-chart-node__name",children:o.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${k}`,children:o.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:f.color},title:j.title,children:[f.icon,j.label&&e.jsx("span",{className:"text-secondary",children:j.label})]})]})]}),d.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${o.name} employees`,children:d.map(E=>(b.current.push({parentId:o.id,childId:E.agent.id}),e.jsx(xs,{node:E,onSelect:r,getHealthStatus:x,selectedAgentId:g,registerNodeElement:h,linksRef:b},E.agent.id)))})]})}function Xa({links:n,nodeElements:r,canvasRef:x,viewportRef:g,layoutMode:h,transform:b}){const[o,d]=s.useState([]);return s.useLayoutEffect(()=>{const f=x.current,j=g.current;if(!f||!j||n.length===0){d([]);return}const k=()=>{const y=f.getBoundingClientRect(),w=n.flatMap(({parentId:E,childId:P})=>{const W=r.get(E),T=r.get(P);if(!W||!T)return[];const L=W.getBoundingClientRect(),v=T.getBoundingClientRect(),z=(L.left-y.left)/b.scale,F=(L.top-y.top)/b.scale,q=(v.left-y.left)/b.scale,je=(v.top-y.top)/b.scale;if(h==="vertical"){const N=z,ge=F+L.height/b.scale/2,he=q,A=je+v.height/b.scale/2,Z=N-(N-he)/2;return[`M ${N} ${ge} L ${Z} ${ge} L ${Z} ${A} L ${he} ${A}`]}const le=z+L.width/b.scale/2,V=F+L.height/b.scale,ne=q+v.width/b.scale/2,ie=je,O=V+(ie-V)/2;return[`M ${le} ${V} L ${le} ${O} L ${ne} ${O} L ${ne} ${ie}`]});d(w)};k();const $=new ResizeObserver(k);return $.observe(f),$.observe(j),r.forEach(y=>$.observe(y)),()=>$.disconnect()},[x,h,n,r,b.scale,g]),e.jsx("svg",{className:"agent-org-chart-connectors","aria-hidden":"true",children:o.map((f,j)=>e.jsx("path",{d:f},`${j}-${f}`))})}function an({addToast:n,projectId:r,onOpenTaskLogs:x,agentOnboardingEnabled:g=!1}){const[h,b]=s.useState(!1),d=Xs()==="mobile",[f,j]=s.useState("all"),{agents:k,stats:$,isLoading:y,loadAgents:w,refreshAgents:E}=qs(r,{filterState:f,showSystemAgents:h}),[P,W]=s.useState(!1),[T,L]=s.useState(null),[v,z]=s.useState(!1),[F,q]=s.useState(null),[je,le]=s.useState(null),V=d&&!!F,[ne,ie]=s.useState("dashboard"),[O,N]=s.useState(null),[ge,he]=s.useState(!1),[A,Z]=s.useState(()=>{if(typeof window>"u")return"list";const t=ut("fn-agent-view",r);return t==="list"||t==="board"||t==="org"?t:"list"}),[re,Ee]=s.useState(()=>{if(typeof window>"u")return"auto";const t=ut($t,r);return ds(t)?t:"auto"}),[ee,te]=s.useState([]),[Ne,K]=s.useState(!1),[pe,Se]=s.useState(0),[oe,G]=s.useState(!1),[ce,xe]=s.useState(!1),[_e,ze]=s.useState(!1),[Ae,Oe]=s.useState(!1),[be,$e]=s.useState(0),[ve,Le]=s.useState(0),[M,_]=s.useState({scale:1,x:0,y:0}),[ye,ke]=s.useState(!1),Pe=s.useRef(null),de=s.useRef(null),Ie=s.useRef(null),Te=s.useRef(new Map),i=s.useRef([]),p=s.useRef(new Map),I=s.useRef(null),J=s.useRef(null),D=s.useRef(!1),{confirm:U}=Zs(),De=s.useRef(null),He=s.useId();s.useEffect(()=>{const t=ut("fn-agent-view",r);if(t==="list"||t==="board"||t==="org"){Z(t);return}Z("list")},[r]),s.useEffect(()=>{Qt("fn-agent-view",A,r)},[A,r]),s.useEffect(()=>{const t=ut($t,r);Ee(ds(t)?t:"auto")},[r]),s.useEffect(()=>{Qt($t,re,r)},[re,r]);const[vt,Fe]=s.useState(null),ft=s.useRef(null),[Qe,we]=s.useState(null),[lt,Me]=s.useState(null),[Be,Ce]=s.useState({}),[We,et]=s.useState(1),[a,S]=s.useState(!1),[se,ue]=s.useState(new Set),[Re,Ue]=s.useState(new Map),it=s.useRef(!0);s.useEffect(()=>(it.current=!0,()=>{it.current=!1}),[]),s.useEffect(()=>{Js(r).then(t=>{it.current&&et(t.heartbeatMultiplier??1)}).catch(()=>{})},[r]);const Dt=s.useCallback(async t=>{const l=Number.isFinite(t)&&t>0?t:1;et(l),S(!0);try{await Qs({heartbeatMultiplier:l},r),n(`Heartbeat speed set to ×${l.toFixed(1)}`,"success")}catch(c){n(`Failed to save heartbeat multiplier: ${fe(c)}`,"error")}finally{it.current&&S(!1)}},[r,n]),rt=s.useMemo(()=>Re.size===0?k:k.map(t=>{const l=Re.get(t.id);return l?{...t,state:l}:t}),[k,Re]),tt=s.useMemo(()=>rt.filter(t=>h||!nt(t)),[rt,h]),bs=s.useMemo(()=>rt.filter(t=>t.state!=="active"&&t.state!=="running"?!1:h||!nt(t)),[rt,h]),Ge=s.useMemo(()=>{if(h)return ee;const t=l=>nt(l.agent)?null:{...l,children:l.children.map(t).filter(c=>c!==null)};return ee.map(t).filter(l=>l!==null)},[ee,h]);s.useEffect(()=>{if(A!=="org")return;const t=de.current;if(!t)return;const l=()=>{Se(t.clientWidth)};l();const c=typeof ResizeObserver<"u"?new ResizeObserver(l):null;return c?.observe(t),window.addEventListener("resize",l),()=>{c?.disconnect(),window.removeEventListener("resize",l)}},[A,Ge.length]),s.useEffect(()=>{if(A!=="org")return;let t=!1;return K(!0),ea(r,{includeEphemeral:h}).then(l=>{t||te(l)}).catch(l=>{t||(n(`Failed to load org chart: ${fe(l)}`,"error"),te([]))}).finally(()=>{t||K(!1)}),()=>{t=!0}},[A,r,h,n]),s.useEffect(()=>{const t=setInterval(()=>{w()},3e4);return()=>{clearInterval(t)}},[w]),s.useEffect(()=>{if(!oe)return;let t=!1;Oe(!0),Pt(void 0,r).then(u=>{if(t)return;const C=u.filter(R=>!nt(R));$e(C.filter(R=>R.state==="active"||R.state==="running").length),Le(C.filter(R=>R.state==="paused").length)}).catch(u=>{t||($e(0),Le(0),n(`Failed to load bulk agent actions: ${fe(u)}`,"error"))}).finally(()=>{t||Oe(!1)});const l=u=>{const C=u.target;C&&(Pe.current?.contains(C)||De.current?.contains(C)||G(!1))},c=u=>{u.key==="Escape"&&(G(!1),De.current?.focus())};return document.addEventListener("mousedown",l),document.addEventListener("touchstart",l),document.addEventListener("keydown",c),()=>{t=!0,document.removeEventListener("mousedown",l),document.removeEventListener("touchstart",l),document.removeEventListener("keydown",c)}},[n,oe,r]);const Ht=async t=>{if(!_e){ze(!0);try{const c=(await Pt(void 0,r)).filter(B=>!nt(B)),u=c.filter(B=>t==="paused"?B.state==="active"||B.state==="running":B.state==="paused"),C=c.length-u.length;if(u.length===0){n(`No agents eligible to ${t==="paused"?"pause":"resume"}`,"error");return}if(!await U({title:t==="paused"?"Pause All Agents":"Resume All Agents",message:`${t==="paused"?"Pause":"Resume"} ${u.length} agent${u.length===1?"":"s"} in this project?`,danger:t==="paused"}))return;const ae=await Promise.allSettled(u.map(B=>as(B.id,t,r))),Q=ae.map((B,dt)=>({result:B,agent:u[dt]})).filter(B=>B.result.status==="rejected"),m=ae.length-Q.length,H=Q.length,X=`${t==="paused"?"Paused":"Resumed"} ${m} agent${m===1?"":"s"}; skipped ${C}`;if(H>0){const B=Q.slice(0,3).map(({agent:dt,result:Ps})=>`${dt.name||dt.id}: ${fe(Ps.reason)}`).join("; ");n(`${X}; failed ${H}${B?` (${B})`:""}`,"error")}else n(X,"success");await w()}catch(l){n(`Failed to ${t==="paused"?"pause":"resume"} agents: ${fe(l)}`,"error")}finally{ze(!1)}}},st=async(t,l)=>{if(!se.has(t)){ue(c=>new Set(c).add(t)),Ue(c=>{const u=new Map(c);return u.set(t,l),u});try{await as(t,l,r),n(`Agent state updated to ${l}`,"success"),await w(),Ue(c=>{const u=new Map(c);return u.delete(t),u})}catch(c){Ue(u=>{const C=new Map(u);return C.delete(t),C}),n(`Failed to update state: ${fe(c)}`,"error")}finally{ue(c=>{const u=new Set(c);return u.delete(t),u})}}},vs=async(t,l)=>{if(await U({title:"Delete Agent",message:`Delete agent "${l}"? This cannot be undone.`,danger:!0}))try{await ga(t,r),n(`Agent "${l}" deleted`,"success"),await w()}catch(u){n(`Failed to delete agent: ${fe(u)}`,"error")}},fs=async(t,l)=>{const c=k.find(u=>u.id===t);if(c){if(c.role===l){Fe(null);return}try{await gt(t,{role:l},r),n(`Agent role updated to ${Tt.find(u=>u.value===l)?.label??l}`,"success"),Fe(null),w()}catch(u){n(`Failed to update role: ${fe(u)}`,"error")}}},js=(t,l)=>{t.key==="Escape"&&Fe(null)},Ns=async(t,l)=>{lt===t.id&&(Me(null),Ce(c=>{const u={...c};return delete u[t.id],u})),we(t.id);try{await gt(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:l}},r),n(`Heartbeat interval updated to ${ns(l)} for ${t.name}`,"success"),w()}catch(c){n(`Failed to update heartbeat interval: ${fe(c)}`,"error")}finally{we(null)}},Bt=async t=>{const l=Be[t.id]??"";if(l.trim()===""){n("Please enter a heartbeat interval in minutes","error");return}const c=Number(l);if(isNaN(c)){n("Heartbeat interval must be a valid number","error");return}if(c<=0){n("Heartbeat interval must be greater than 0","error");return}if(c>=1&&c<5){we(t.id);try{await gt(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:ua}},r),n(`Heartbeat interval set to 5 minutes (minimum). ${c} minute${c!==1?"s":""} was below the 5-minute minimum.`,"success"),Me(null),Ce(C=>{const R={...C};return delete R[t.id],R}),w()}catch(C){n(`Failed to update heartbeat interval: ${fe(C)}`,"error")}finally{we(null)}return}const u=Math.round(c*6e4);we(t.id);try{await gt(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:u}},r),n(`Heartbeat interval updated to ${ns(u)} for ${t.name}`,"success"),Me(null),Ce(C=>{const R={...C};return delete R[t.id],R}),w()}catch(C){n(`Failed to update heartbeat interval: ${fe(C)}`,"error")}finally{we(null)}},ys=t=>{const l=Et(t.runtimeConfig?.heartbeatIntervalMs),c=Math.round(l/6e4);Me(t.id),Ce(u=>({...u,[t.id]:String(c)}))},me=s.useCallback((t,l)=>{q(t),ie(l?.initialTab??"dashboard"),N(l?.initialRunId??null),he(l?.preferActiveRun??!1)},[]),Ve=s.useCallback(()=>{q(null),ie("dashboard"),N(null),he(!1)},[]),Wt=s.useCallback(t=>{me(t)},[me]),ks=s.useCallback(t=>{le(t),me(t)},[me]),ws=s.useCallback(async({agentId:t,deleted:l})=>{await E(),l&&F===t&&Ve()},[E,F,Ve]),Cs=s.useCallback(t=>{me(t),d&&xe(!1)},[d,me]),Ss=async(t,l)=>{Ue(c=>{const u=new Map(c);return u.set(t,"running"),u});try{await ma(t,r,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),n(`Heartbeat run started for ${l}`,"success"),await w(),Ue(c=>{const u=new Map(c);return u.delete(t),u})}catch(c){Ue(u=>{const C=new Map(u);return C.delete(t),C}),n(`Failed to start heartbeat run: ${fe(c)}`,"error")}},Ke=s.useCallback(t=>Math.min(Ya,Math.max(Ua,t)),[]),Y=s.useCallback(t=>{const l=de.current,c=Ie.current?.querySelector(".agent-org-chart");if(!l||!c)return{...t,scale:Ke(t.scale)};const u=Ke(t.scale),C=c.scrollWidth*u,R=c.scrollHeight*u,ae=l.clientWidth,Q=l.clientHeight,m=Math.min(qe,ae-C-qe),H=qe,X=Math.min(qe,Q-R-qe),B=qe;return{scale:u,x:Math.max(m,Math.min(H,t.x)),y:Math.max(X,Math.min(B,t.y))}},[Ke]),ot=s.useCallback((t,l,c)=>{const u=de.current;u&&_(C=>{const R=Ke(t),ae=u.getBoundingClientRect(),Q=l-ae.left,m=c-ae.top,H=(Q-C.x)/C.scale,X=(m-C.y)/C.scale;return Y({scale:R,x:Q-H*R,y:m-X*R})})},[Ke,Y]),Ye=s.useCallback(()=>{const t=de.current,l=Ie.current?.querySelector(".agent-org-chart");if(!t||!l)return;const c=t.clientWidth,u=t.clientHeight,C=l.scrollWidth,R=l.scrollHeight;if(C<=0||R<=0)return;const ae=Ke(Math.min(c/C,u/R,1)),Q=(c-C*ae)/2,m=(u-R*ae)/2;_(Y({scale:ae,x:Q,y:m}))},[Ke,Y]),jt=s.useCallback(t=>{Z(t),t!=="org"&&_({scale:1,x:0,y:0}),d&&F&&Ve()},[Ve,d,F]),Gt=t=>Tt.find(l=>l.value===t)?.label??t,ct=s.useMemo(()=>Ka({tree:Ge,availableWidth:pe,preference:re}),[Ge,re,pe]),Vt=s.useCallback(t=>{Ee(t),_({scale:1,x:0,y:0})},[]);s.useEffect(()=>{_({scale:1,x:0,y:0}),D.current=!1},[r,ct]),s.useLayoutEffect(()=>{A!=="org"||Ne||Ge.length===0||D.current||(Ye(),D.current=!0)},[A,Ge.length,Ye,Ne]);const As=s.useCallback((t,l)=>{l?Te.current.set(t,l):Te.current.delete(t)},[]),Kt=s.useCallback(()=>e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>_(t=>Y({...t,scale:t.scale*.9})),"aria-label":"Zoom out org chart",title:"Zoom out",children:e.jsx(Aa,{size:16})}),e.jsxs("span",{className:"agent-org-chart-controls__zoom-label","aria-live":"polite",children:[Math.round(M.scale*100),"%"]}),e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>_(t=>Y({...t,scale:t.scale*1.1})),"aria-label":"Zoom in org chart",title:"Zoom in",children:e.jsx(Ca,{size:16})}),e.jsxs("button",{type:"button",className:"btn touch-target btn-sm agent-org-chart-controls__fit-btn",onClick:Ye,"aria-label":"Fit org chart",title:"Fit org chart",children:[e.jsx(ta,{size:16}),"Fit"]}),e.jsxs("button",{type:"button",className:"btn touch-target btn-sm",onClick:()=>_(t=>Y({...t,x:0,y:0})),"aria-label":"Center org chart",title:"Center org chart",children:[e.jsx(sa,{size:16}),"Center"]})]}),[Y,Ye,M.scale]),Rs=s.useCallback(t=>{if(!(t.ctrlKey||t.metaKey))return;t.preventDefault();const l=t.deltaY>0?.9:1.1;ot(M.scale*l,t.clientX,t.clientY)},[M.scale,ot]),$s=s.useCallback(t=>{if(t.target.closest(".org-chart-node-card"))return;if(t.currentTarget.setPointerCapture?.(t.pointerId),p.current.set(t.pointerId,{x:t.clientX,y:t.clientY}),p.current.size===1){I.current={x:t.clientX-M.x,y:t.clientY-M.y,pointerId:t.pointerId},ke(!0);return}if(p.current.size===2){const c=Array.from(p.current.values()),u=c[0].x-c[1].x,C=c[0].y-c[1].y;J.current={distance:Math.hypot(u,C),scale:M.scale,centerX:(c[0].x+c[1].x)/2,centerY:(c[0].y+c[1].y)/2},I.current=null}},[M.scale,M.x,M.y]),Ts=s.useCallback(t=>{if(p.current.has(t.pointerId)){if(p.current.set(t.pointerId,{x:t.clientX,y:t.clientY}),p.current.size>=2){const l=Array.from(p.current.values()),c=J.current;if(!c)return;const u=l[0].x-l[1].x,C=l[0].y-l[1].y,R=Math.hypot(u,C),ae=c.scale*(R/c.distance);ot(ae,c.centerX,c.centerY);return}!I.current||I.current.pointerId!==t.pointerId||_(l=>Y({...l,x:t.clientX-I.current.x,y:t.clientY-I.current.y}))}},[Y,ot]),Ut=s.useCallback(t=>{p.current.delete(t.pointerId),p.current.size<2&&(J.current=null),p.current.size===0&&(I.current=null,ke(!1))},[]),Ms=s.useCallback(t=>{if(t.key==="ArrowLeft")_(l=>Y({...l,x:l.x+ht}));else if(t.key==="ArrowRight")_(l=>Y({...l,x:l.x-ht}));else if(t.key==="ArrowUp")_(l=>Y({...l,y:l.y+ht}));else if(t.key==="ArrowDown")_(l=>Y({...l,y:l.y-ht}));else if(t.key==="+"||t.key==="=")_(l=>Y({...l,scale:l.scale*1.1}));else if(t.key==="-")_(l=>Y({...l,scale:l.scale*.9}));else if(t.key==="0")Ye();else if(t.key==="Home")_({scale:1,x:0,y:0});else return;t.preventDefault()},[Y,Ye]),Yt=s.useCallback(()=>{const t=[{value:"horizontal",label:"Horizontal",icon:e.jsx(ts,{size:16}),ariaLabel:"Horizontal layout"},{value:"vertical",label:"Vertical",icon:e.jsx(es,{size:16}),ariaLabel:"Vertical layout"},{value:"auto",label:"Auto",icon:e.jsx(Ze,{size:16}),ariaLabel:"Automatic layout"}];return e.jsx("div",{className:"agent-org-chart-layout-toggle","data-testid":"agent-org-chart-layout-toggle",children:t.map(l=>{const c=re===l.value;return e.jsxs("button",{type:"button",className:`btn-icon touch-target agent-org-chart-layout-toggle__button${c?" btn-icon--active":""}`,onClick:()=>Vt(l.value),"aria-pressed":c,"aria-label":l.ariaLabel,title:l.ariaLabel,"data-layout-value":l.value,children:[l.icon,e.jsx("span",{className:"agent-org-chart-layout-toggle__text",children:l.label})]},l.value)})})},[Vt,re]),Es=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],Nt=t=>da(t),_s=Ae||_e||be===0,Ls=Ae||_e||ve===0,Xt=y&&k.length===0,at=s.useCallback(()=>{W(!0)},[]);return e.jsxs("div",{className:"agents-view",children:[e.jsxs("div",{className:"agents-view-header",children:[e.jsxs("div",{className:"agents-view-title",children:[e.jsx(Lt,{size:24}),e.jsx("h2",{children:"Agents"})]}),e.jsxs("div",{className:"agents-view-controls",children:[e.jsxs("div",{className:"view-toggle",children:[e.jsx("button",{className:`view-toggle-btn${A==="list"?" active":""}`,onClick:()=>jt("list"),title:"List view","aria-label":"List view","aria-pressed":A==="list",children:e.jsx(es,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="board"?" active":""}`,onClick:()=>jt("board"),title:"Board view","aria-label":"Board view","aria-pressed":A==="board",children:e.jsx(Je,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="org"?" active":""}`,onClick:()=>jt("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":A==="org",children:e.jsx(ts,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:De,className:`btn-icon agent-controls-trigger${oe?" agent-controls-trigger--active":""}`,onClick:()=>G(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":oe,"aria-controls":He,children:e.jsx(ka,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void w(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Ze,{size:16,className:y?"spin":void 0})}),!d&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm agent-import-trigger",onClick:()=>{z(!0),G(!1)},"aria-label":"Import",title:"Import",children:[e.jsx(It,{size:16}),"Import"]}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{at(),G(!1)},"aria-label":"New Agent",title:"New Agent",children:[e.jsx(ss,{size:16}),"New Agent"]})]}),oe&&e.jsxs("div",{ref:Pe,id:He,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsx("div",{className:"agent-controls",children:e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(aa,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:f,onChange:t=>j(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:h,onChange:t=>b(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]})}),d&&e.jsxs("div",{className:"agent-controls-mobile-actions",children:[e.jsxs("button",{className:"btn btn-sm agent-import-trigger",onClick:()=>{z(!0),G(!1)},"aria-label":"Import",title:"Import",children:[e.jsx(It,{size:16}),"Import"]}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{at(),G(!1)},"aria-label":"New Agent",title:"New Agent",children:[e.jsx(ss,{size:16}),"New Agent"]})]}),e.jsxs("div",{className:"agent-controls-bulk-actions",role:"menu","aria-label":"Bulk agent actions",children:[e.jsxs("button",{type:"button",className:"agent-detail-bulk-menu-item",role:"menuitem",disabled:_s,onClick:()=>{G(!1),Ht("paused")},children:[e.jsxs("span",{className:"agent-controls-bulk-actions__label",children:[e.jsx(Ct,{}),e.jsx("span",{children:"Pause All Agents"})]}),e.jsx("span",{className:"agent-detail-bulk-menu-item-hint",children:Ae?"Loading eligibility…":be===0?"No active or running project agents to pause":`Pause ${be} active/running agent${be===1?"":"s"}`})]}),e.jsxs("button",{type:"button",className:"agent-detail-bulk-menu-item",role:"menuitem",disabled:Ls,onClick:()=>{G(!1),Ht("active")},children:[e.jsxs("span",{className:"agent-controls-bulk-actions__label",children:[e.jsx(mt,{}),e.jsx("span",{children:"Resume All Agents"})]}),e.jsx("span",{className:"agent-detail-bulk-menu-item-hint",children:Ae?"Loading eligibility…":ve===0?"No paused project agents to resume":`Resume ${ve} paused agent${ve===1?"":"s"}`})]})]}),e.jsx("div",{className:"agent-global-controls agent-controls-actions",children:e.jsxs("div",{className:"heartbeat-multiplier-group",children:[e.jsxs("div",{className:"heartbeat-multiplier-controls",children:[e.jsx("label",{htmlFor:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-label",children:"Heartbeat Speed"}),e.jsx("input",{id:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-slider touch-target",type:"range",min:.1,max:10,step:.1,value:We,onChange:t=>{const l=Number(t.target.value);Dt(Number.isFinite(l)&&l>0?l:1)},disabled:a}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",We.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(Mt.reduce((t,l)=>Math.abs(l-We)<Math.abs(t-We)?l:t,Mt[0])),onChange:t=>{const l=Number(t.target.value);Dt(Number.isFinite(l)&&l>0?l:1)},disabled:a,"aria-label":"Heartbeat speed preset",children:Mt.map(t=>e.jsxs("option",{value:String(t),children:["×",t]},t))})]}),e.jsx("small",{className:"text-secondary",children:"Scales all agent heartbeat intervals. ×0.5 = twice as fast, ×2.0 = twice as slow. Default: ×1.0"})]})}),e.jsx(Ra,{agents:tt})]})]})]})]}),e.jsx(Fa,{isOpen:P,onClose:()=>{W(!1),L(null)},onCreated:()=>{W(!1),L(null),w()},projectId:r,prefillDraft:T,agentOnboardingEnabled:g,existingAgents:k,onPrefillDraft:L}),e.jsx(Oa,{isOpen:v,onClose:()=>z(!1),onImported:()=>void w(),projectId:r}),e.jsx(Pa,{stats:$,activeAgents:bs,projectId:r,isOpen:ce,onToggle:()=>xe(t=>!t),onSelectAgent:Cs,onOpenTaskLogs:x}),A==="org"?e.jsx("div",{className:"agents-org-full-view",children:e.jsx("div",{className:"agents-view-content agents-view-content--org-full",children:F?e.jsxs("div",{className:"agents-org-detail-view","data-testid":"agents-org-detail-view",children:[e.jsx("button",{type:"button",className:"btn btn-sm agents-org-detail-back",onClick:Ve,"aria-label":"Back to org chart",children:"Back to org chart"}),e.jsx(s.Suspense,{fallback:null,children:e.jsx(us,{inline:!0,showInlineBackButton:!1,agentId:F,projectId:r,onClose:Ve,addToast:n,onChildClick:Wt,initialTab:ne,initialRunId:O,preferActiveRun:ge},F)})]}):Xt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ze,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):e.jsxs("div",{className:"agent-org-chart-shell","data-testid":"agent-org-chart-shell",children:[d?e.jsxs("div",{className:"agent-org-chart-controls","data-testid":"agent-org-chart-controls",children:[Yt(),Kt()]}):e.jsxs("div",{className:"agent-org-chart-toolbar",children:[Yt(),e.jsx("div",{className:"agent-org-chart-controls","data-testid":"agent-org-chart-controls",children:Kt()})]}),e.jsx("div",{ref:de,className:"agent-org-chart-viewport","data-testid":"agent-org-chart-viewport",tabIndex:0,role:"region","aria-label":"Org chart canvas",onWheel:Rs,onPointerDown:$s,onPointerMove:Ts,onPointerUp:Ut,onPointerCancel:Ut,onKeyDown:Ms,"data-panning":ye?"true":"false",children:e.jsxs("div",{ref:Ie,className:`agent-org-chart-canvas agent-org-chart-canvas--zoom-${Math.round((M.scale??1)*100)}`,"data-panning":ye?"true":"false",style:{transform:`translate(${M.x}px, ${M.y}px) scale(${M.scale})`},children:[e.jsx("div",{className:`agent-org-chart${ct==="vertical"?" agent-org-chart--vertical":""}`,"data-testid":"agent-org-chart","data-layout-mode":ct,children:Ne?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Ze,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):Ge.length===0?e.jsx(At,{onCtaClick:at}):(i.current=[],Ge.map(t=>e.jsx(xs,{node:t,onSelect:ks,getHealthStatus:Nt,selectedAgentId:je,registerNodeElement:As,linksRef:i},t.agent.id)))}),e.jsx(Xa,{links:i.current,nodeElements:Te.current,canvasRef:Ie,viewportRef:de,layoutMode:ct,transform:M})]})})]})})}):e.jsxs("div",{className:"agents-split-layout",children:[e.jsx("div",{className:`agents-split-sidebar${V?" agents-split-sidebar--hidden-mobile":""}`,children:e.jsx("div",{className:"agents-view-content",children:Xt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ze,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):A==="board"?e.jsx("div",{className:"agent-board",children:tt.length===0?e.jsx(At,{onCtaClick:at}):tt.map(t=>{const l=Nt(t),c=Ot(t,l),u=Ft(t.state),C=zt("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${C}${F===t.id?" agent-card--selected":""}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>me(t.id),role:"button",tabIndex:0,onKeyDown:R=>{(R.key==="Enter"||R.key===" ")&&(R.key===" "&&R.preventDefault(),me(t.id))},children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:e.jsx(xt,{agent:t,size:20})}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:Gt(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${u}`,children:t.state}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"agent-board-badge badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:l.color},title:c.title,children:[l.icon,c.label?` ${c.label}`:""]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:tt.length===0?e.jsx(At,{onCtaClick:at}):tt.map(t=>{const l=Nt(t),c=Ot(t,l),u=Ft(t.state),C=zt("agent-card",t.state),R=Et(t.runtimeConfig?.heartbeatIntervalMs),ae=na(R),Q=Qe===t.id;return e.jsxs("div",{className:`agent-card agent-card--clickable ${C}${F===t.id?" agent-card--selected":""}`,onClick:m=>{const H=m.target;if(H===m.currentTarget){me(t.id);return}const X=H.closest('button, select, input, [role="button"]');X&&X!==m.currentTarget||me(t.id)},role:"button",tabIndex:0,onKeyDown:m=>{m.target===m.currentTarget&&(m.key==="Enter"||m.key===" ")&&(m.key===" "&&m.preventDefault(),me(t.id))},"aria-label":`Open details for ${t.name}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info",children:[vt===t.id?e.jsx("select",{ref:ft,className:"select agent-role-select",value:t.role,onChange:m=>void fs(t.id,m.target.value),onKeyDown:m=>js(m,t.id),onBlur:()=>Fe(null),autoFocus:!0,children:Tt.map(m=>e.jsxs("option",{value:m.value,children:[m.icon," ",m.label]},m.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:m=>{m.stopPropagation(),Fe(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.stopPropagation(),Fe(t.id))},children:e.jsx(xt,{agent:t,size:20})}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(ms,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${u}`,children:t.state}),e.jsxs("span",{className:"badge",style:{color:l.color},title:c.title,children:[l.icon,c.label?` ${c.label}`:""]}),e.jsx("span",{className:"badge text-secondary",children:Gt(t.role)}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null,(()=>{const m=Es(t);if(m.length===0)return null;const H=m.slice(0,2),X=m.length-2;return e.jsxs(e.Fragment,{children:[H.map(B=>e.jsx("span",{className:"badge badge-skill",title:B,children:va(B)},B)),X>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",X]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.state==="error"&&t.lastError?e.jsx(la,{errorText:t.lastError,issueContext:{surface:"AgentsView list",agentId:t.id,agentName:t.name,agentState:t.state,taskId:t.taskId}}):null,t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),lt===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:Be[t.id]??"",onChange:m=>Ce(H=>({...H,[t.id]:m.target.value})),onKeyDown:m=>{m.key==="Enter"?Bt(t):m.key==="Escape"&&(Me(null),Ce(H=>{const X={...H};return delete X[t.id],X}))},disabled:Q,"aria-label":`Custom heartbeat interval in minutes for ${t.name}`}),e.jsx("span",{className:"text-secondary",children:"min"}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void Bt(t),disabled:Q,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn-sm",onClick:()=>{Me(null),Ce(m=>{const H={...m};return delete H[t.id],H})},disabled:Q,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:R,onChange:m=>{const H=m.target.value;H==="__custom__"?ys(t):Ns(t,Number(H))},disabled:Q,"aria-label":`Set heartbeat interval for ${t.name}`,children:[ae.map(m=>e.jsx("option",{value:m.value,children:m.label},m.value)),ia.some(m=>m.value===R)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),Q&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const m=new Date(t.lastHeartbeatAt),H=new Date(m.getTime()+R),X=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:m.toLocaleString(),children:["Last: ",m.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]}),X&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:H.toLocaleString(),children:["Next: ",H.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[e.jsxs("div",{className:"agent-card-actions-group agent-card-actions-group--primary",children:[t.state==="idle"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"active"),disabled:se.has(t.id),title:"Activate",children:[e.jsx(mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Start"})]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void Ss(t.id,t.name),disabled:se.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(Je,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Run Now"})]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"paused"),disabled:se.has(t.id),title:"Pause",children:[e.jsx(Ct,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Pause"})]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"active"),disabled:se.has(t.id),title:"Resume",children:[e.jsx(mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Resume"})]}),t.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>me(t.id,{initialTab:"runs",initialRunId:null,preferActiveRun:!0}),title:"View live run details","aria-label":`View live run details for ${t.name}`,children:[e.jsx(Je,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Running"})]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"paused"),disabled:se.has(t.id),title:"Pause",children:[e.jsx(Ct,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Pause"})]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void st(t.id,"active"),disabled:se.has(t.id),title:"Retry",children:[e.jsx(mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Retry"})]})]}),e.jsxs("div",{className:"agent-card-actions-group agent-card-actions-group--secondary",children:[e.jsxs("button",{className:"btn btn-sm agent-card-details-btn",onClick:()=>me(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:[e.jsx(ra,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Details"})]}),(t.state==="idle"||t.state==="paused")&&e.jsxs("button",{className:"btn btn-sm btn-danger",onClick:()=>void vs(t.id,t.name),title:"Delete",children:[e.jsx(oa,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Delete"})]})]})]})]},t.id)})})})}),e.jsx("div",{className:`agents-split-detail${d&&!F?" agents-split-detail--hidden-mobile":""}`,children:F?e.jsx(s.Suspense,{fallback:null,children:e.jsx(us,{inline:!0,showInlineBackButton:d,agentId:F,projectId:r,onClose:Ve,addToast:n,onChildClick:Wt,initialTab:ne,initialRunId:O,preferActiveRun:ge,onMutationSuccess:ws},F)}):e.jsxs("div",{className:"agents-detail-empty-state",children:[e.jsx(Lt,{size:48}),e.jsx("h3",{children:"Select an agent"}),e.jsx("p",{children:"Choose an agent from the sidebar to view details"})]})})]})]})}export{an as AgentsView};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as s,a as yn,j as t,R as wn}from"./vendor-react-K0fH_qHe.js";import{c as Sn,a9 as Ts,a7 as Is,bc as $s,bd as ls,aF as At,be as Ds,ac as Ps,bf as ts,t as Cn,bg as kn,bh as Ls,bi as jn,bj as ss,w as Nn,bk as Mn,bl as Rn,bm as An,bn as En,bo as Tn,bp as In,bq as $n,s as Dn,br as Pn,i as Ln,k as Qs,bs as Fn,bt as _n,bu as Zs,bv as zn,bw as Hn,bx as Un,p as On,by as Bn,bz as Kn,u as Gn,bA as Wn,ah as en,ai as tn,bB as Vn,bC as qn,S as Xn,_ as ns,P as dt,J as lt,av as Jn,bD as Fs,a as jt,bE as _s,bF as zs,bG as Hs,B as ut,ae as Yn,af as Qn,b1 as Et,bH as Zn,bI as ea,a_ as ta,bJ as Us,bK as sa,T as na,bL as Os,bM as aa,j as Bs,m as ra}from"./index-
|
|
1
|
+
import{r as s,a as yn,j as t,R as wn}from"./vendor-react-K0fH_qHe.js";import{c as Sn,a9 as Ts,a7 as Is,bc as $s,bd as ls,aF as At,be as Ds,ac as Ps,bf as ts,t as Cn,bg as kn,bh as Ls,bi as jn,bj as ss,w as Nn,bk as Mn,bl as Rn,bm as An,bn as En,bo as Tn,bp as In,bq as $n,s as Dn,br as Pn,i as Ln,k as Qs,bs as Fn,bt as _n,bu as Zs,bv as zn,bw as Hn,bx as Un,p as On,by as Bn,bz as Kn,u as Gn,bA as Wn,ah as en,ai as tn,bB as Vn,bC as qn,S as Xn,_ as ns,P as dt,J as lt,av as Jn,bD as Fs,a as jt,bE as _s,bF as zs,bG as Hs,B as ut,ae as Yn,af as Qn,b1 as Et,bH as Zn,bI as ea,a_ as ta,bJ as Us,bK as sa,T as na,bL as Os,bM as aa,j as Bs,m as ra}from"./index-CjuQj4qe.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{c4 as Ue,c5 as ve,c6 as tt,c7 as me,s as Me,c8 as xe,c9 as ye,ca as Se,cb as Ne,cc as rt,cd as ie,ce as st,cf as nt,cg as at,ch as it,ci as lt,aF as J,cj as le,L as te,S as ct,M as ot,ck as dt,bJ as ut,a as vt,cl as Pe,T as Te,cm as mt,Q as ft,a_ as pt,a$ as ht,af as gt,aA as bt,R as wt}from"./index-Cze5qbME.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";const fe=500,xt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function ze(e){return e.length<=fe?e:e.slice(-fe)}function ce(e,i){return ze([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function I(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function yt(e){return e?.previewUrl??null}async function ke(e){return st(e)}async function je(e,i){return nt(e,i)}async function St(e){return at(e)}async function Nt(e){return it(e)}async function Ce(e){return lt(e)}function V(e){try{return e()}catch{return null}}function oe(){return typeof V(()=>ve)=="function"&&typeof V(()=>Ue)=="function"}function q(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function kt(e){const[i,o]=r.useState(null),[g,y]=r.useState([]),[x,f]=r.useState([]),[j,A]=r.useState([]),[C,P]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,U]=r.useState(null),_=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-fe).map(I);f(s)}},[]),M=r.useCallback(async()=>{const a=n.current;try{if(oe())if(d){const s=await Ue(d,e);if(n.current!==a)return;_(s)}else{const s=await ve(e);if(n.current!==a)return;y(s),s.length>0&&(U(s[0].config.id),_(s[0]))}else{const s=await ke(e);if(n.current!==a)return;const c=q(s);y([c]),_(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[_,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),A([]),P(!0),u(null),U(null),(async()=>{try{const[c,l]=await Promise.allSettled([oe()?ve(e):ke(e).then(N=>[q(N)]),typeof V(()=>ie)=="function"?ie(e):Ce(e).then(N=>N.map(w=>({name:w.name,command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const w=N[0];oe()&&U(w.config.id),_(w)}}else v=B(c.reason);l.status==="fulfilled"&&A(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&P(!1)}})()},[_,e]),r.useEffect(()=>{const a=d?tt(d,e):typeof V(()=>me)=="function"?me(e):null;if(!a)return;const s=n.current,c=Me(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(I);f(ze(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:I(v);f(w=>ce(w,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:I(v);f(w=>ce(w,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>ce(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(w=>w&&{...w,status:N,runtime:v.pid?{...w.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:w.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=q(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&M()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,M,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{M()},xt);return()=>{clearInterval(a)}},[M,i?.status]);const E=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>xe)=="function")l=await xe(d,e);else{const v=await je({command:a,cwd:s},e);l=q(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>ye)=="function")s=await ye(d,e);else{const c=await St(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),k=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>Se)=="function")s=await Se(d,e);else{const c=await Nt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),T=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>Ne)=="function")c=await Ne(d,a,e);else{const l=await rt({url:a},e);c={url:l.manualUrl??l.previewUrl??l.detectedUrl??null,source:l.manualUrl?"manual":"auto"}}if(n.current!==s)return;o(l=>l?{...l,previewUrl:c.url??void 0}:null),u(null)}catch(c){if(n.current!==s)return;throw u(B(c)),c}},[e,d]),h=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;try{s=await ie(e)}catch{s=(await Ce(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;A(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e]),p=r.useCallback(async(a,s)=>{if(typeof a!="string"&&!d)try{const v=a,N=await je({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),w=q(N);o(w),y([w]),u(null);return}catch(v){throw u(B(v)),v}const c=typeof a=="string"?a:a.command,l=typeof a=="string"?s:a.cwd;await E(c,l)},[e,E,d]),L=r.useCallback(async()=>{await D()},[D]),R=r.useCallback(async()=>{await k()},[k]),z=r.useCallback(async a=>{await T(a)},[T]),$=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await M()},[M]),H=yt(i),b=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:g,logs:x,detectedCommands:j,previewUrl:H,isLoading:C,error:S,startServer:E,stopServer:D,restartServer:k,setPreviewUrl:T,detectCommands:h,refresh:M,candidates:j,serverState:b,loading:C,start:p,stop:L,restart:R,setManualUrl:z,detect:$,refreshStatus:O}}const Ee=500,Le=100;function Fe(e){return e.length>Ee?e.slice(-Ee):e}function $e(e){return e==="stderr"?"stderr":"stdout"}function Z(e){try{return JSON.parse(e.data)}catch{return null}}function ee(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:$e(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function jt(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function de(e,i){if(i.length===0)return e;const o=[...e],g=new Set(e.map(y=>y.id));for(const y of i)g.has(y.id)||(g.add(y.id),o.push(y));return o.sort((y,x)=>y.id-x.id),Fe(o)}function Ct(e,i){const[o,g]=r.useState([]),[y,x]=r.useState(!1),[f,j]=r.useState(!1),[A,C]=r.useState(!1),[P,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),U=r.useRef(0),_=r.useRef(e),M=r.useRef(i),E=r.useRef(0),D=r.useRef(1);(_.current!==e||M.current!==i)&&(_.current=e,M.current=i,d.current++,J({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),n.current=!0,E.current=0,D.current=1,g([]),x(!1),j(!1),C(!1),S(null),u.current&&(u.current(),u.current=null)),r.useEffect(()=>{if(!i){u.current&&(u.current(),u.current=null);return}const L=d.current,R=++U.current;n.current=!1,x(!0);const z=(b,a)=>{const s=Fe(b);g(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;E.current=c,D.current=c+1},$=b=>{if(n.current||d.current!==L||!b||typeof b!="object")return;const a=b.lines;if(!Array.isArray(a))return;if(a.length>0&&typeof a[0]=="string"){const c=a.filter(l=>typeof l=="string").map((l,v)=>jt(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>ee(c,l+1));z(s,s.length)},O=b=>{if(n.current||d.current!==L)return;const a=typeof b.text=="string"?b.text:typeof b.line=="string"?b.line:null;if(!a)return;const s=D.current,c=typeof b.id=="number"&&Number.isFinite(b.id)?b.id:s,l={id:c,text:a,stream:$e(b.stream),timestamp:typeof b.timestamp=="string"?b.timestamp:""};E.current=Math.max(E.current,c),D.current=Math.max(D.current,c+1),g(v=>de(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await le({maxLines:Le},e);if(n.current||d.current!==L||U.current!==R)return;const s=a.lines.map((c,l)=>ee(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==L||U.current!==R)return;z([],null)}finally{!n.current&&d.current===L&&U.current===R&&x(!1)}const b=me(e);u.current=Me(b,{events:{"dev-server:log":a=>{const s=Z(a);s&&O(s)},log:a=>{const s=Z(a);s&&O(s)},history:a=>{const s=Z(a);$(s)},"dev-server:history":a=>{const s=Z(a);$(s)}},onReconnect:()=>{J({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:E.current??null,sseChannel:b,reason:"history-replay"}),!(n.current||d.current!==L)&&le({lastEventId:E.current,maxLines:50},e).then(a=>{if(n.current||d.current!==L)return;const s=a.lines.map((c,l)=>ee(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;E.current=Math.max(E.current,c),D.current=Math.max(D.current,c+1)}g(c=>de(c,s)),S(a.totalLines)}).catch(()=>{})}}),J({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:b})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const T=r.useCallback(async()=>{if(!i||f)return;const L=d.current,R=o.length;j(!0);try{const z=await le({maxLines:Le,offset:R},e);if(n.current||d.current!==L)return;const $=z.lines.map((O,H)=>ee(O,H+1));g(O=>de($,O)),C(z.totalLines>R+$.length),S(z.totalLines)}catch{}finally{j(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{g([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:A,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const Et="This preview appears to block iframe embedding. Open it in a new tab instead.",Lt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Rt="Preview is taking longer than expected and may block iframe embedding.";function _t(e){return e==="blocked"?Et:e==="error"?Lt:null}function Dt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:g=null}=i,y=r.useRef(null),x=r.useRef(null),[f,j]=r.useState("unknown"),[A,C]=r.useState(null),[P]=r.useState(g),S=r.useCallback(()=>{x.current!==null&&(window.clearTimeout(x.current),x.current=null)},[]),u=r.useCallback(k=>{j(k),C(_t(k))},[]),n=r.useCallback(()=>{j("blocked"),C(Rt)},[]);r.useEffect(()=>{if(S(),!e){j("unknown"),C(null);return}j("unknown"),C(null);let k=!1;return queueMicrotask(()=>{k||(j("loading"),C(null))}),()=>{k=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const k=setTimeout(()=>{x.current=null,n()},o);return x.current=k,()=>{clearTimeout(k),x.current===k&&(x.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const k=y.current;if(!k){u("embedded");return}try{if(k.contentWindow?.location?.href==="about:blank"&&k.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),U=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){j("unknown"),C(null);return}j("unknown"),C(null)},[S]);const _=r.useCallback(()=>{S(),j("unknown"),C(null)},[S]),M=_,E=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:E,isBlocked:D,blockReason:A,detectionMethod:P,iframeRef:y,resetEmbedStatus:_,setEmbedStatus:u,retry:M,embedContext:A,handleIframeLoad:d,handleIframeError:U}}const At=/\x1b\[[0-9;]*m/g;function pe(e){return e.replace(At,"")}function Ut(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Mt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pt(e){if(e.stream==="stderr")return"error";const i=pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Tt(e,i){if(!i)return e;const o=new RegExp(`(${Mt(i)})`,"ig"),g=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:g.map((x,f)=>x.toLowerCase()===y?t.jsx("mark",{children:x},`${x}-${f}`):t.jsx("span",{children:x},`${x}-${f}`))})}function zt({entries:e,loading:i,loadingMore:o,hasMore:g,total:y,onLoadMore:x,isRunning:f}){const j=r.useRef(null),A=r.useRef(e.length),C=r.useRef(f),[P,S]=r.useState(!1),[u,n]=r.useState(!1),[d,U]=r.useState(""),[_,M]=r.useState("all"),E=r.useMemo(()=>_==="all"?e:e.filter(p=>Pt(p)===_),[e,_]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?E.filter(L=>pe(L.text).toLowerCase().includes(p)):E},[E,d]),k=D.length,T=r.useCallback(()=>{const p=j.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,L=A.current,R=e.length>L;f&&(!p||!u&&R)&&T(),C.current=f,A.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=j.current;if(!p)return;const R=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!R)},[]);return r.useEffect(()=>{i||e.length===0||!u&&f&&T()},[e,f,u,i,T]),i&&e.length===0?t.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:t.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[t.jsx(te,{size:16,className:"devserver-log-viewer__spinner"}),t.jsx("span",{children:"Loading logs…"})]})}):t.jsxs("section",{className:`devserver-log-viewer${P?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[t.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[t.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[t.jsx("span",{className:"devserver-log-viewer__title",children:"Logs"}),t.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[y!==null?`${e.length}/${y}`:`${e.length}`," lines"]})]}),t.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[t.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[t.jsx("span",{className:"visually-hidden",children:"Filter logs by severity"}),t.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:_,onChange:p=>M(p.target.value),"data-testid":"devserver-log-severity-filter","aria-label":"Filter logs by severity",children:[t.jsx("option",{value:"all",children:"All severities"}),t.jsx("option",{value:"info",children:"Info"}),t.jsx("option",{value:"warn",children:"Warn"}),t.jsx("option",{value:"error",children:"Error"})]})]}),t.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[t.jsx("span",{className:"visually-hidden",children:"Search logs"}),t.jsx(ct,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>U(p.target.value),placeholder:"Search logs","data-testid":"devserver-log-search-input","aria-label":"Search logs"})]}),d.trim().length>0&&t.jsxs("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:[k," match",k===1?"":"es"]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>S(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":P?"Exit fullscreen logs":"Enter fullscreen logs",children:P?t.jsx(ot,{size:14}):t.jsx(dt,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[g&&t.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:t.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:x,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(te,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:j,className:"devserver-log-viewer__content",onScroll:h,"data-testid":"devserver-log-content",children:[!i&&D.length===0&&t.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?"No logs yet. Start the dev server to see output.":E.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const L=pe(p.text),R=Ut(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[R&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:R}),p.stream==="stderr"&&t.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:"ERR"}),t.jsx("span",{className:"devserver-log-text",children:ut(Tt(L,d.trim()))})]},p.id)})]}),u&&f&&t.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:T,"data-testid":"devserver-log-jump-button",children:[t.jsx(vt,{size:14}),"New logs"]})]})]})}const Ft="devserver-preview-iframe";function $t({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:g,blockReason:y,onRetry:x,className:f=Ft,embedContext:j}){const A=y??j??null,[C,P]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(P(d=>d+1),o("loading"))},[i,o,e]);const S=r.useCallback(()=>{const d=g.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[g,o]),u=r.useCallback(d=>{d.stopPropagation(),o("error")},[o]),n=r.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?t.jsxs("div",{className:"devserver-preview-iframe-shell",children:[t.jsx("iframe",{src:e,ref:g,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:S,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${C}`),i==="loading"&&t.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[t.jsx(te,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading preview..."})]}),i==="blocked"&&t.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Preview cannot be embedded"}),A&&t.jsx("p",{className:"devserver-preview-blocked-context",children:A})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),x&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Te,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Unable to load preview"}),A&&t.jsx("p",{className:"devserver-preview-blocked-context",children:A})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),x&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,children:"Retry"})]})]})]}):null}const Re={stopped:{className:"dev-server-status-badge--stopped",label:"Stopped"},starting:{className:"dev-server-status-badge--starting",label:"Starting..."},running:{className:"dev-server-status-badge--running",label:"Running"},stopping:{className:"dev-server-status-badge--starting",label:"Stopping..."},failed:{className:"dev-server-status-badge--failed",label:"Failed"}};let ue=!1;function _e(e){return e instanceof Error?e.message:String(e)}function Oe(e){return e==="."?"root":e}function De(e){return e?e==="root"?".":e:null}function Ae(e,i,o){return!i||e.scriptName!==i?!1:o?Oe(e.cwd)===o:!0}function Ot(e){return e.cwd==="."?"root":e.cwd}function Bt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Xt({addToast:e,projectId:i}){r.useEffect(()=>(J({view:"DevServerView",trigger:ue?"route-active":"remount",projectId:i,replayAttempted:!1}),ue=!1,()=>{ue=!0,J({view:"DevServerView",trigger:"route-inactive",projectId:i,replayAttempted:!1})}),[i]);const{session:o,detectedCommands:g,previewUrl:y,isLoading:x,error:f,startServer:j,stopServer:A,restartServer:C,setPreviewUrl:P,detectCommands:S,refresh:u}=kt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",U=Re[n]??Re.stopped,{entries:_,loading:M,loadingMore:E,hasMore:D,total:k,loadMore:T}=Ct(i,!!i),h=y,p=o?.config?.cwd??null,[L,R]=r.useState(!0),[z,$]=r.useState(""),[O,H]=r.useState(""),[b,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:w,setEmbedStatus:Be,resetEmbedStatus:Q,iframeRef:X,isEmbedded:He,isBlocked:re,blockReason:se,retry:he}=Dt(N),[ge,W]=r.useState(!1),be=r.useRef(w);r.useEffect(()=>{const m=be.current!==w;re&&m&&W(!0),w==="embedded"&&W(!1),be.current=w},[w,re]),r.useEffect(()=>{W(!1)},[h]);const Y=r.useMemo(()=>{if(!b)return null;const m=De(p);return g.find(F=>!(F.scriptName!==b||m&&F.cwd!==m||o?.config?.command&&F.command!==o.config.command))??g.find(F=>Ae(F,b,p))??null},[g,o?.config?.command,b,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(_e(m),"error")})},[e,S]),r.useEffect(()=>{if(b){R(!1);return}R(!0)},[b]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&$(o.config.command);return}if(Y){$(Y.command);return}g.length>0&&$(m=>m.trim().length>0?m:g[0]?.command??"")},[g,Y,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const ne=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),we=r.useCallback(()=>{W(!1),he()},[he]),Ve=r.useCallback(()=>{try{const m=X.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),Q();return}}catch{}if(!(!h||!X.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),X.current.src=m.toString(),W(!1),Q()}catch{X.current.src=h,W(!1),Q()}},[h,X,Q]),K=r.useCallback(async(m,F,ae)=>{c(m);try{await F(),e(ae,"success")}catch(et){e(_e(et),"error")}finally{c(null)}},[e]),We=r.useCallback(m=>{a(m.scriptName),R(!1),$(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),qe=r.useCallback(()=>{a(null),R(!0),e("Cleared selected dev server script.","success")},[e]),Xe=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const F=De(p)??".",ae=Y?.cwd??F;K("start",()=>j(m,ae),"Dev server started.")},Ge=()=>{K("stop",A,"Dev server stopped.")},Je=()=>{K("restart",C,"Dev server restarted.")},Qe=()=>{const m=O.trim(),F=m.length>0?m:null;K("preview",()=>P(F),F?"Preview URL updated.":"Preview URL override cleared.")},Ye=r.useCallback(()=>{f&&u()},[f,u]),Ke=n==="starting"||n==="running"||s!==null,Ie=n==="stopped"||s!==null,Ze=n==="stopped"||n==="starting"||s!==null;return t.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[t.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[t.jsxs("div",{className:"dev-server-header-title",children:[t.jsx(mt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${U.className}`,"data-testid":"dev-server-status-badge",children:U.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Xe,disabled:Ke,"data-testid":"dev-server-start-button",children:[t.jsx(ft,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ge,disabled:Ie,"data-testid":"dev-server-stop-button",children:[t.jsx(pt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Je,disabled:Ze,"data-testid":"dev-server-restart-button",children:[t.jsx(ht,{size:14}),t.jsx("span",{children:s==="restart"?"Restarting...":"Restart"})]})]})]}),t.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Configuration"}),x&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),x&&!o&&g.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(te,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading dev server configuration..."})]}),f&&t.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[t.jsx("p",{children:f}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ye,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),b&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:b}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>R(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:qe,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),L&&g.length===0&&t.jsxs("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:["No dev server scripts detected. Check that your project has a ",t.jsx("code",{children:"package.json"})," with a ",t.jsx("code",{children:"dev"}),", ",t.jsx("code",{children:"start"}),", or similar script."]}),L&&g.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:g.map(m=>{const F=Ae(m,b,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${F?"dev-server-candidate--selected":""}`,onClick:()=>We(m),"data-testid":`dev-server-candidate-${m.scriptName}-${Oe(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:Bt(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:Ot(m)})]},`${m.cwd}::${m.scriptName}::${m.command}`)})})]}),t.jsxs("div",{className:"dev-server-field-group",children:[t.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:"Command"}),t.jsx("input",{id:"dev-server-command",className:"input",value:z,onChange:m=>$(m.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:n==="running"||n==="starting"})]}),(n==="running"||n==="starting")&&o&&t.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[t.jsx("span",{className:"dev-server-label",children:"Running command"}),t.jsx("code",{children:o.config?.command??z})]}),t.jsxs("div",{className:"dev-server-preview-override",children:[t.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:"Preview URL Override"}),t.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:O,onChange:m=>H(m.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Qe,disabled:s==="preview","data-testid":"dev-server-set-preview",children:"Save"})]}),h&&t.jsxs("p",{className:"dev-server-preview-hint",children:["Auto-detected: ",h]})]}),t.jsx("div",{className:"dev-server-content",children:t.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Logs"}),t.jsxs("span",{className:"dev-server-muted",children:[k??_.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(zt,{entries:_,loading:M,loadingMore:E,hasMore:D,total:k,onLoadMore:T,isRunning:d})})]})}),t.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[t.jsxs("div",{className:"devserver-preview-header",children:[t.jsxs("div",{className:"devserver-preview-title",children:[t.jsx(gt,{size:14}),t.jsx("span",{children:"Preview"})]}),t.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:h??"No preview URL","data-testid":"devserver-preview-url-badge",children:["Auto",h?` · ${h}`:" · Not available"]}),t.jsxs("div",{className:"devserver-preview-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(m=>m==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:l==="embedded"?"External only":"Embedded"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Open in new tab",onClick:ne,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(bt,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Ve,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(wt,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":w,"data-embedded":He?"true":"false",children:[!h&&!d&&t.jsx("p",{className:"devserver-preview-empty",children:"Start a dev server to see a live preview here."}),!h&&d&&t.jsx("p",{className:"devserver-preview-empty",children:"No preview URL detected. Start the dev server or set a manual URL to preview your app."}),h&&l==="external"&&t.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[t.jsx("p",{children:"Embedded preview is disabled. Open your app in a separate browser tab."}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ne,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&ge&&re&&t.jsxs("div",{className:w==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[w==="error"?t.jsx(Te,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:w==="error"?"Preview failed":"Preview blocked"}),se&&t.jsx("p",{className:"devserver-preview-blocked-context",children:se})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"Open the preview in a new tab, or retry embedded mode after checking your server settings."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:ne,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:we,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!ge&&t.jsx($t,{url:h,embedStatus:w,onEmbedStatusChange:Be,iframeRef:X,blockReason:se,onRetry:we})]})]})]})}export{Xt as DevServerView};
|
|
1
|
+
import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{c4 as Ue,c5 as ve,c6 as tt,c7 as me,s as Me,c8 as xe,c9 as ye,ca as Se,cb as Ne,cc as rt,cd as ie,ce as st,cf as nt,cg as at,ch as it,ci as lt,aF as J,cj as le,L as te,S as ct,M as ot,ck as dt,bJ as ut,a as vt,cl as Pe,T as Te,cm as mt,Q as ft,a_ as pt,a$ as ht,af as gt,aA as bt,R as wt}from"./index-CjuQj4qe.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";const fe=500,xt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function ze(e){return e.length<=fe?e:e.slice(-fe)}function ce(e,i){return ze([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function I(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function yt(e){return e?.previewUrl??null}async function ke(e){return st(e)}async function je(e,i){return nt(e,i)}async function St(e){return at(e)}async function Nt(e){return it(e)}async function Ce(e){return lt(e)}function V(e){try{return e()}catch{return null}}function oe(){return typeof V(()=>ve)=="function"&&typeof V(()=>Ue)=="function"}function q(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function kt(e){const[i,o]=r.useState(null),[g,y]=r.useState([]),[x,f]=r.useState([]),[j,A]=r.useState([]),[C,P]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,U]=r.useState(null),_=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-fe).map(I);f(s)}},[]),M=r.useCallback(async()=>{const a=n.current;try{if(oe())if(d){const s=await Ue(d,e);if(n.current!==a)return;_(s)}else{const s=await ve(e);if(n.current!==a)return;y(s),s.length>0&&(U(s[0].config.id),_(s[0]))}else{const s=await ke(e);if(n.current!==a)return;const c=q(s);y([c]),_(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[_,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),A([]),P(!0),u(null),U(null),(async()=>{try{const[c,l]=await Promise.allSettled([oe()?ve(e):ke(e).then(N=>[q(N)]),typeof V(()=>ie)=="function"?ie(e):Ce(e).then(N=>N.map(w=>({name:w.name,command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const w=N[0];oe()&&U(w.config.id),_(w)}}else v=B(c.reason);l.status==="fulfilled"&&A(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&P(!1)}})()},[_,e]),r.useEffect(()=>{const a=d?tt(d,e):typeof V(()=>me)=="function"?me(e):null;if(!a)return;const s=n.current,c=Me(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(I);f(ze(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:I(v);f(w=>ce(w,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:I(v);f(w=>ce(w,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>ce(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(w=>w&&{...w,status:N,runtime:v.pid?{...w.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:w.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=q(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&M()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,M,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{M()},xt);return()=>{clearInterval(a)}},[M,i?.status]);const E=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>xe)=="function")l=await xe(d,e);else{const v=await je({command:a,cwd:s},e);l=q(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>ye)=="function")s=await ye(d,e);else{const c=await St(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),k=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>Se)=="function")s=await Se(d,e);else{const c=await Nt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),T=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>Ne)=="function")c=await Ne(d,a,e);else{const l=await rt({url:a},e);c={url:l.manualUrl??l.previewUrl??l.detectedUrl??null,source:l.manualUrl?"manual":"auto"}}if(n.current!==s)return;o(l=>l?{...l,previewUrl:c.url??void 0}:null),u(null)}catch(c){if(n.current!==s)return;throw u(B(c)),c}},[e,d]),h=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;try{s=await ie(e)}catch{s=(await Ce(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;A(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e]),p=r.useCallback(async(a,s)=>{if(typeof a!="string"&&!d)try{const v=a,N=await je({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),w=q(N);o(w),y([w]),u(null);return}catch(v){throw u(B(v)),v}const c=typeof a=="string"?a:a.command,l=typeof a=="string"?s:a.cwd;await E(c,l)},[e,E,d]),L=r.useCallback(async()=>{await D()},[D]),R=r.useCallback(async()=>{await k()},[k]),z=r.useCallback(async a=>{await T(a)},[T]),$=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await M()},[M]),H=yt(i),b=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:g,logs:x,detectedCommands:j,previewUrl:H,isLoading:C,error:S,startServer:E,stopServer:D,restartServer:k,setPreviewUrl:T,detectCommands:h,refresh:M,candidates:j,serverState:b,loading:C,start:p,stop:L,restart:R,setManualUrl:z,detect:$,refreshStatus:O}}const Ee=500,Le=100;function Fe(e){return e.length>Ee?e.slice(-Ee):e}function $e(e){return e==="stderr"?"stderr":"stdout"}function Z(e){try{return JSON.parse(e.data)}catch{return null}}function ee(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:$e(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function jt(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function de(e,i){if(i.length===0)return e;const o=[...e],g=new Set(e.map(y=>y.id));for(const y of i)g.has(y.id)||(g.add(y.id),o.push(y));return o.sort((y,x)=>y.id-x.id),Fe(o)}function Ct(e,i){const[o,g]=r.useState([]),[y,x]=r.useState(!1),[f,j]=r.useState(!1),[A,C]=r.useState(!1),[P,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),U=r.useRef(0),_=r.useRef(e),M=r.useRef(i),E=r.useRef(0),D=r.useRef(1);(_.current!==e||M.current!==i)&&(_.current=e,M.current=i,d.current++,J({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),n.current=!0,E.current=0,D.current=1,g([]),x(!1),j(!1),C(!1),S(null),u.current&&(u.current(),u.current=null)),r.useEffect(()=>{if(!i){u.current&&(u.current(),u.current=null);return}const L=d.current,R=++U.current;n.current=!1,x(!0);const z=(b,a)=>{const s=Fe(b);g(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;E.current=c,D.current=c+1},$=b=>{if(n.current||d.current!==L||!b||typeof b!="object")return;const a=b.lines;if(!Array.isArray(a))return;if(a.length>0&&typeof a[0]=="string"){const c=a.filter(l=>typeof l=="string").map((l,v)=>jt(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>ee(c,l+1));z(s,s.length)},O=b=>{if(n.current||d.current!==L)return;const a=typeof b.text=="string"?b.text:typeof b.line=="string"?b.line:null;if(!a)return;const s=D.current,c=typeof b.id=="number"&&Number.isFinite(b.id)?b.id:s,l={id:c,text:a,stream:$e(b.stream),timestamp:typeof b.timestamp=="string"?b.timestamp:""};E.current=Math.max(E.current,c),D.current=Math.max(D.current,c+1),g(v=>de(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await le({maxLines:Le},e);if(n.current||d.current!==L||U.current!==R)return;const s=a.lines.map((c,l)=>ee(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==L||U.current!==R)return;z([],null)}finally{!n.current&&d.current===L&&U.current===R&&x(!1)}const b=me(e);u.current=Me(b,{events:{"dev-server:log":a=>{const s=Z(a);s&&O(s)},log:a=>{const s=Z(a);s&&O(s)},history:a=>{const s=Z(a);$(s)},"dev-server:history":a=>{const s=Z(a);$(s)}},onReconnect:()=>{J({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:E.current??null,sseChannel:b,reason:"history-replay"}),!(n.current||d.current!==L)&&le({lastEventId:E.current,maxLines:50},e).then(a=>{if(n.current||d.current!==L)return;const s=a.lines.map((c,l)=>ee(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;E.current=Math.max(E.current,c),D.current=Math.max(D.current,c+1)}g(c=>de(c,s)),S(a.totalLines)}).catch(()=>{})}}),J({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:b})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const T=r.useCallback(async()=>{if(!i||f)return;const L=d.current,R=o.length;j(!0);try{const z=await le({maxLines:Le,offset:R},e);if(n.current||d.current!==L)return;const $=z.lines.map((O,H)=>ee(O,H+1));g(O=>de($,O)),C(z.totalLines>R+$.length),S(z.totalLines)}catch{}finally{j(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{g([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:A,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const Et="This preview appears to block iframe embedding. Open it in a new tab instead.",Lt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Rt="Preview is taking longer than expected and may block iframe embedding.";function _t(e){return e==="blocked"?Et:e==="error"?Lt:null}function Dt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:g=null}=i,y=r.useRef(null),x=r.useRef(null),[f,j]=r.useState("unknown"),[A,C]=r.useState(null),[P]=r.useState(g),S=r.useCallback(()=>{x.current!==null&&(window.clearTimeout(x.current),x.current=null)},[]),u=r.useCallback(k=>{j(k),C(_t(k))},[]),n=r.useCallback(()=>{j("blocked"),C(Rt)},[]);r.useEffect(()=>{if(S(),!e){j("unknown"),C(null);return}j("unknown"),C(null);let k=!1;return queueMicrotask(()=>{k||(j("loading"),C(null))}),()=>{k=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const k=setTimeout(()=>{x.current=null,n()},o);return x.current=k,()=>{clearTimeout(k),x.current===k&&(x.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const k=y.current;if(!k){u("embedded");return}try{if(k.contentWindow?.location?.href==="about:blank"&&k.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),U=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){j("unknown"),C(null);return}j("unknown"),C(null)},[S]);const _=r.useCallback(()=>{S(),j("unknown"),C(null)},[S]),M=_,E=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:E,isBlocked:D,blockReason:A,detectionMethod:P,iframeRef:y,resetEmbedStatus:_,setEmbedStatus:u,retry:M,embedContext:A,handleIframeLoad:d,handleIframeError:U}}const At=/\x1b\[[0-9;]*m/g;function pe(e){return e.replace(At,"")}function Ut(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Mt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pt(e){if(e.stream==="stderr")return"error";const i=pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Tt(e,i){if(!i)return e;const o=new RegExp(`(${Mt(i)})`,"ig"),g=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:g.map((x,f)=>x.toLowerCase()===y?t.jsx("mark",{children:x},`${x}-${f}`):t.jsx("span",{children:x},`${x}-${f}`))})}function zt({entries:e,loading:i,loadingMore:o,hasMore:g,total:y,onLoadMore:x,isRunning:f}){const j=r.useRef(null),A=r.useRef(e.length),C=r.useRef(f),[P,S]=r.useState(!1),[u,n]=r.useState(!1),[d,U]=r.useState(""),[_,M]=r.useState("all"),E=r.useMemo(()=>_==="all"?e:e.filter(p=>Pt(p)===_),[e,_]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?E.filter(L=>pe(L.text).toLowerCase().includes(p)):E},[E,d]),k=D.length,T=r.useCallback(()=>{const p=j.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,L=A.current,R=e.length>L;f&&(!p||!u&&R)&&T(),C.current=f,A.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=j.current;if(!p)return;const R=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!R)},[]);return r.useEffect(()=>{i||e.length===0||!u&&f&&T()},[e,f,u,i,T]),i&&e.length===0?t.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:t.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[t.jsx(te,{size:16,className:"devserver-log-viewer__spinner"}),t.jsx("span",{children:"Loading logs…"})]})}):t.jsxs("section",{className:`devserver-log-viewer${P?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[t.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[t.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[t.jsx("span",{className:"devserver-log-viewer__title",children:"Logs"}),t.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[y!==null?`${e.length}/${y}`:`${e.length}`," lines"]})]}),t.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[t.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[t.jsx("span",{className:"visually-hidden",children:"Filter logs by severity"}),t.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:_,onChange:p=>M(p.target.value),"data-testid":"devserver-log-severity-filter","aria-label":"Filter logs by severity",children:[t.jsx("option",{value:"all",children:"All severities"}),t.jsx("option",{value:"info",children:"Info"}),t.jsx("option",{value:"warn",children:"Warn"}),t.jsx("option",{value:"error",children:"Error"})]})]}),t.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[t.jsx("span",{className:"visually-hidden",children:"Search logs"}),t.jsx(ct,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>U(p.target.value),placeholder:"Search logs","data-testid":"devserver-log-search-input","aria-label":"Search logs"})]}),d.trim().length>0&&t.jsxs("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:[k," match",k===1?"":"es"]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>S(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":P?"Exit fullscreen logs":"Enter fullscreen logs",children:P?t.jsx(ot,{size:14}):t.jsx(dt,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[g&&t.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:t.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:x,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(te,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:j,className:"devserver-log-viewer__content",onScroll:h,"data-testid":"devserver-log-content",children:[!i&&D.length===0&&t.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?"No logs yet. Start the dev server to see output.":E.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const L=pe(p.text),R=Ut(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[R&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:R}),p.stream==="stderr"&&t.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:"ERR"}),t.jsx("span",{className:"devserver-log-text",children:ut(Tt(L,d.trim()))})]},p.id)})]}),u&&f&&t.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:T,"data-testid":"devserver-log-jump-button",children:[t.jsx(vt,{size:14}),"New logs"]})]})]})}const Ft="devserver-preview-iframe";function $t({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:g,blockReason:y,onRetry:x,className:f=Ft,embedContext:j}){const A=y??j??null,[C,P]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(P(d=>d+1),o("loading"))},[i,o,e]);const S=r.useCallback(()=>{const d=g.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[g,o]),u=r.useCallback(d=>{d.stopPropagation(),o("error")},[o]),n=r.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?t.jsxs("div",{className:"devserver-preview-iframe-shell",children:[t.jsx("iframe",{src:e,ref:g,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:S,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${C}`),i==="loading"&&t.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[t.jsx(te,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading preview..."})]}),i==="blocked"&&t.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Preview cannot be embedded"}),A&&t.jsx("p",{className:"devserver-preview-blocked-context",children:A})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),x&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Te,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Unable to load preview"}),A&&t.jsx("p",{className:"devserver-preview-blocked-context",children:A})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),x&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,children:"Retry"})]})]})]}):null}const Re={stopped:{className:"dev-server-status-badge--stopped",label:"Stopped"},starting:{className:"dev-server-status-badge--starting",label:"Starting..."},running:{className:"dev-server-status-badge--running",label:"Running"},stopping:{className:"dev-server-status-badge--starting",label:"Stopping..."},failed:{className:"dev-server-status-badge--failed",label:"Failed"}};let ue=!1;function _e(e){return e instanceof Error?e.message:String(e)}function Oe(e){return e==="."?"root":e}function De(e){return e?e==="root"?".":e:null}function Ae(e,i,o){return!i||e.scriptName!==i?!1:o?Oe(e.cwd)===o:!0}function Ot(e){return e.cwd==="."?"root":e.cwd}function Bt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Xt({addToast:e,projectId:i}){r.useEffect(()=>(J({view:"DevServerView",trigger:ue?"route-active":"remount",projectId:i,replayAttempted:!1}),ue=!1,()=>{ue=!0,J({view:"DevServerView",trigger:"route-inactive",projectId:i,replayAttempted:!1})}),[i]);const{session:o,detectedCommands:g,previewUrl:y,isLoading:x,error:f,startServer:j,stopServer:A,restartServer:C,setPreviewUrl:P,detectCommands:S,refresh:u}=kt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",U=Re[n]??Re.stopped,{entries:_,loading:M,loadingMore:E,hasMore:D,total:k,loadMore:T}=Ct(i,!!i),h=y,p=o?.config?.cwd??null,[L,R]=r.useState(!0),[z,$]=r.useState(""),[O,H]=r.useState(""),[b,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:w,setEmbedStatus:Be,resetEmbedStatus:Q,iframeRef:X,isEmbedded:He,isBlocked:re,blockReason:se,retry:he}=Dt(N),[ge,W]=r.useState(!1),be=r.useRef(w);r.useEffect(()=>{const m=be.current!==w;re&&m&&W(!0),w==="embedded"&&W(!1),be.current=w},[w,re]),r.useEffect(()=>{W(!1)},[h]);const Y=r.useMemo(()=>{if(!b)return null;const m=De(p);return g.find(F=>!(F.scriptName!==b||m&&F.cwd!==m||o?.config?.command&&F.command!==o.config.command))??g.find(F=>Ae(F,b,p))??null},[g,o?.config?.command,b,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(_e(m),"error")})},[e,S]),r.useEffect(()=>{if(b){R(!1);return}R(!0)},[b]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&$(o.config.command);return}if(Y){$(Y.command);return}g.length>0&&$(m=>m.trim().length>0?m:g[0]?.command??"")},[g,Y,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const ne=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),we=r.useCallback(()=>{W(!1),he()},[he]),Ve=r.useCallback(()=>{try{const m=X.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),Q();return}}catch{}if(!(!h||!X.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),X.current.src=m.toString(),W(!1),Q()}catch{X.current.src=h,W(!1),Q()}},[h,X,Q]),K=r.useCallback(async(m,F,ae)=>{c(m);try{await F(),e(ae,"success")}catch(et){e(_e(et),"error")}finally{c(null)}},[e]),We=r.useCallback(m=>{a(m.scriptName),R(!1),$(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),qe=r.useCallback(()=>{a(null),R(!0),e("Cleared selected dev server script.","success")},[e]),Xe=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const F=De(p)??".",ae=Y?.cwd??F;K("start",()=>j(m,ae),"Dev server started.")},Ge=()=>{K("stop",A,"Dev server stopped.")},Je=()=>{K("restart",C,"Dev server restarted.")},Qe=()=>{const m=O.trim(),F=m.length>0?m:null;K("preview",()=>P(F),F?"Preview URL updated.":"Preview URL override cleared.")},Ye=r.useCallback(()=>{f&&u()},[f,u]),Ke=n==="starting"||n==="running"||s!==null,Ie=n==="stopped"||s!==null,Ze=n==="stopped"||n==="starting"||s!==null;return t.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[t.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[t.jsxs("div",{className:"dev-server-header-title",children:[t.jsx(mt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${U.className}`,"data-testid":"dev-server-status-badge",children:U.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Xe,disabled:Ke,"data-testid":"dev-server-start-button",children:[t.jsx(ft,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ge,disabled:Ie,"data-testid":"dev-server-stop-button",children:[t.jsx(pt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Je,disabled:Ze,"data-testid":"dev-server-restart-button",children:[t.jsx(ht,{size:14}),t.jsx("span",{children:s==="restart"?"Restarting...":"Restart"})]})]})]}),t.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Configuration"}),x&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),x&&!o&&g.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(te,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading dev server configuration..."})]}),f&&t.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[t.jsx("p",{children:f}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ye,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),b&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:b}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>R(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:qe,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),L&&g.length===0&&t.jsxs("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:["No dev server scripts detected. Check that your project has a ",t.jsx("code",{children:"package.json"})," with a ",t.jsx("code",{children:"dev"}),", ",t.jsx("code",{children:"start"}),", or similar script."]}),L&&g.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:g.map(m=>{const F=Ae(m,b,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${F?"dev-server-candidate--selected":""}`,onClick:()=>We(m),"data-testid":`dev-server-candidate-${m.scriptName}-${Oe(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:Bt(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:Ot(m)})]},`${m.cwd}::${m.scriptName}::${m.command}`)})})]}),t.jsxs("div",{className:"dev-server-field-group",children:[t.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:"Command"}),t.jsx("input",{id:"dev-server-command",className:"input",value:z,onChange:m=>$(m.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:n==="running"||n==="starting"})]}),(n==="running"||n==="starting")&&o&&t.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[t.jsx("span",{className:"dev-server-label",children:"Running command"}),t.jsx("code",{children:o.config?.command??z})]}),t.jsxs("div",{className:"dev-server-preview-override",children:[t.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:"Preview URL Override"}),t.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:O,onChange:m=>H(m.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Qe,disabled:s==="preview","data-testid":"dev-server-set-preview",children:"Save"})]}),h&&t.jsxs("p",{className:"dev-server-preview-hint",children:["Auto-detected: ",h]})]}),t.jsx("div",{className:"dev-server-content",children:t.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Logs"}),t.jsxs("span",{className:"dev-server-muted",children:[k??_.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(zt,{entries:_,loading:M,loadingMore:E,hasMore:D,total:k,onLoadMore:T,isRunning:d})})]})}),t.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[t.jsxs("div",{className:"devserver-preview-header",children:[t.jsxs("div",{className:"devserver-preview-title",children:[t.jsx(gt,{size:14}),t.jsx("span",{children:"Preview"})]}),t.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:h??"No preview URL","data-testid":"devserver-preview-url-badge",children:["Auto",h?` · ${h}`:" · Not available"]}),t.jsxs("div",{className:"devserver-preview-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(m=>m==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:l==="embedded"?"External only":"Embedded"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Open in new tab",onClick:ne,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(bt,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Ve,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(wt,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":w,"data-embedded":He?"true":"false",children:[!h&&!d&&t.jsx("p",{className:"devserver-preview-empty",children:"Start a dev server to see a live preview here."}),!h&&d&&t.jsx("p",{className:"devserver-preview-empty",children:"No preview URL detected. Start the dev server or set a manual URL to preview your app."}),h&&l==="external"&&t.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[t.jsx("p",{children:"Embedded preview is disabled. Open your app in a separate browser tab."}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ne,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&ge&&re&&t.jsxs("div",{className:w==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[w==="error"?t.jsx(Te,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:w==="error"?"Preview failed":"Preview blocked"}),se&&t.jsx("p",{className:"devserver-preview-blocked-context",children:se})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"Open the preview in a new tab, or retry embedded mode after checking your server settings."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:ne,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:we,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!ge&&t.jsx($t,{url:h,embedStatus:w,onEmbedStatusChange:Be,iframeRef:X,blockReason:se,onRetry:we})]})]})]})}export{Xt as DevServerView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{eV as N,eW as g,dB as b,b as y,aj as P,ae as H,af as C,L as O,ax as v}from"./index-
|
|
1
|
+
import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{eV as N,eW as g,dB as b,b as y,aj as P,ae as H,af as C,L as O,ax as v}from"./index-CjuQj4qe.js";import{F as z}from"./folder-open-iURwQbEg.js";function D({value:o,onChange:d,placeholder:m,onInputKeyDown:x,nodeId:l,localNodeId:h}){const[e,n]=i.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1}),a=i.useCallback(async(s,c=!1)=>{n(t=>({...t,loading:!0,error:null}));try{const t=await N(s,c,l,h);n(u=>({...u,loading:!1,currentPath:t.currentPath,parentPath:t.parentPath,entries:t.entries}))}catch(t){n(u=>({...u,loading:!1,error:t instanceof Error?t.message:"Failed to browse directory"}))}},[l,h]),j=i.useCallback(()=>{n(s=>s.isOpen?{...s,isOpen:!1}:{...s,isOpen:!0})},[]);i.useEffect(()=>{e.isOpen&&!e.loading&&e.entries.length===0&&!e.error&&a(o||void 0,e.showHidden)},[e.isOpen,e.loading,e.entries.length,e.error,o,e.showHidden,a,l,h]);const p=i.useCallback(s=>{a(s,e.showHidden)},[a,e.showHidden]),k=i.useCallback(()=>{d(e.currentPath),n(s=>({...s,isOpen:!1}))},[e.currentPath,d]),w=i.useCallback(()=>{n(s=>{const c=!s.showHidden;return{...s,showHidden:c}})},[]);i.useEffect(()=>{e.isOpen&&e.currentPath&&a(e.currentPath,e.showHidden)},[e.showHidden]);const f=e.currentPath?g(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:o,onChange:s=>d(s.target.value),onKeyDown:x,placeholder:m||"/path/to/your/project"}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:j,"aria-label":e.isOpen?"Close directory browser":"Browse directories",children:[e.isOpen?r.jsx(z,{size:16}):r.jsx(b,{size:16}),r.jsx("span",{children:"Browse"})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":"Directory browser",children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:f.map((s,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(y,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>p(s.path),title:s.path,children:s.label})]},s.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>p(e.parentPath),"aria-label":"Go to parent directory",title:"Parent directory",children:[r.jsx(P,{size:14}),r.jsx("span",{children:"Up"})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:w,"aria-label":e.showHidden?"Hide hidden directories":"Show hidden directories",title:e.showHidden?"Hide hidden":"Show hidden",children:[e.showHidden?r.jsx(H,{size:14}):r.jsx(C,{size:14}),r.jsx("span",{children:e.showHidden?"Hide hidden":"Show hidden"})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(O,{size:20,className:"animate-spin"}),r.jsx("span",{children:"Loading…"})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(v,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:"No subdirectories"}):e.entries.map(s=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>p(s.path),role:"treeitem",title:s.path,children:[r.jsx(b,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:s.name}),s.hasChildren&&r.jsx(y,{size:14,className:"directory-picker-entry-arrow"})]},s.path))}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:k,children:"Select"})]})]})]})}export{D};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{a7 as K,a8 as W,a9 as ie,aa as de,ab as G,ac as ue,f as me,ad as he,F as T,ae as fe,af as pe,S as je,X as xe,R as we,ag as ke,ah as X,ai as V,a as Y,b as ge,aj as be}from"./index-Cze5qbME.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";function ve(n){const{projectId:c,searchQuery:h,includeProjectFiles:a=!0}=n??{},l=c?`${ie.DOCUMENTS_PREFIX}${c}`:null,[o,m]=s.useState(()=>{if(!l)return[];const w=K(l,{maxAgeMs:W});return Array.isArray(w)?w:[]}),[d,i]=s.useState([]),[k,x]=s.useState(()=>o.length===0),[C,b]=s.useState(null),g=s.useRef(null),f=s.useRef(o.length>0),p=s.useRef(null),v=s.useCallback(async()=>{g.current&&g.current.abort();const w=new AbortController;g.current=w;const z=!f.current;z&&x(!0),b(null);const E=de(h?{q:h}:void 0,c),R=a?G(c):Promise.resolve({files:[]}),[j,M]=await Promise.allSettled([E,R]);if(w.signal.aborted)return;let A=null;if(j.status==="fulfilled"){if(m(j.value),l){const y=j.value.length>500?j.value.slice(0,500):j.value;ue(l,y,{maxBytes:5e5})}f.current=!0}else A=j.reason instanceof Error?j.reason.message:String(j.reason);if(M.status==="fulfilled"){const y=M.value.files,L=h?.trim().toLowerCase(),F=L?y.filter(P=>P.name.toLowerCase().includes(L)||P.path.toLowerCase().includes(L)):y;i(F)}b(A),z&&x(!1)},[l,a,c,h]);return s.useEffect(()=>{if(!l){f.current=!1,m([]),x(!0);return}const w=K(l,{maxAgeMs:W});Array.isArray(w)?(m(w),f.current=!0,x(!1)):(f.current=!1,m([]),x(!0))},[l]),s.useEffect(()=>(p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{v()},300),()=>{p.current&&clearTimeout(p.current)}),[v]),s.useEffect(()=>(v(),()=>{g.current&&g.current.abort()}),[]),{documents:o,projectFiles:d,loading:k,error:C,refresh:v}}function Ne(n,c){const[h,a]=s.useState([]),[l,o]=s.useState(!0),[m,d]=s.useState(null),i=s.useRef(null),k=s.useRef(!1),x=c?.showHidden??!1,C=s.useCallback(async b=>{i.current&&i.current.abort();const g=new AbortController;i.current=g;const f=!k.current;f&&o(!0),d(null);try{const p=await G(n,{showHidden:b?.showHidden??x});if(g.signal.aborted)return;a(p.files),k.current=!0}catch(p){if(g.signal.aborted)return;d(p instanceof Error?p.message:String(p))}finally{!g.signal.aborted&&f&&o(!1)}},[n,x]);return s.useEffect(()=>(k.current=!1,C({showHidden:x}),()=>{i.current&&i.current.abort()}),[C,x]),{files:h,loading:l,error:m,refresh:C}}const Se=768;function J(n){return n?new Date(n).toLocaleString():""}function Ce(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(n>=10*1024?0:1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function Fe(n,c=200){return n.length<=c?n:`${n.substring(0,c)}…`}function Ee({document:n,renderMarkdown:c,onToggleMarkdown:h}){const[a,l]=s.useState(!1),o=Fe(n.content),m=n.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(T,{size:14}),e.jsx("span",{className:"document-card-key-text",children:n.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",n.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>l(d=>!d),title:a?"Collapse":"Expand","aria-label":a?"Collapse content":"Expand content",children:a?e.jsx(be,{size:14}):e.jsx(Y,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:n.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:J(n.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${a?" document-card-content--expanded":""}`,children:[a?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:h,"aria-label":c?"Switch to plain text":"Switch to markdown","aria-pressed":c,title:c?"Switch to plain text":"Switch to markdown",children:c?"Markdown":"Plain"})}),c?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(X,{remarkPlugins:[V],children:n.content})})}):e.jsx("pre",{className:"document-card-content-text",children:n.content})]}):e.jsx("p",{className:"document-card-preview",children:o}),m&&!a&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function ye({taskId:n,taskTitle:c,documents:h,onOpenTask:a,renderMarkdownStates:l,onToggleMarkdown:o}){const[m,d]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>d(i=>!i),"aria-expanded":m,"aria-label":`${m?"Collapse":"Expand"} documents for task ${n}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:m?e.jsx(Y,{size:16}):e.jsx(ge,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:n}),e.jsx("span",{className:"documents-group-task-title",children:c||"Untitled"})]}),e.jsxs("span",{className:"documents-group-count",children:[h.length," doc",h.length!==1?"s":""]}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>a(n),"aria-label":`Open task ${n}: ${c||"Untitled"}`,children:"Open task"})]}),m&&e.jsx("div",{className:"documents-group-content",children:h.map(i=>e.jsx(Ee,{document:i,renderMarkdown:l.get(i.id)??!1,onToggleMarkdown:()=>o(i.id)},i.id))})]})}function ze({projectId:n,addToast:c,onOpenDetail:h}){const[a,l]=s.useState("project"),[o,m]=s.useState(""),[d,i]=s.useState(null),[k,x]=s.useState(!1),[C,b]=s.useState(null),[g,f]=s.useState(!1),[p,v]=s.useState(null),[w,z]=s.useState(!1),E=s.useRef(0),R=s.useRef(!1),[j,M]=s.useState(!1),[A,y]=s.useState(new Map),L=a==="tasks"?o.trim():"",{documents:F,loading:P,error:Z,refresh:B}=ve({projectId:n,searchQuery:L||void 0,includeProjectFiles:!1}),{files:S,loading:D,error:I,refresh:O}=Ne(n,{showHidden:k});s.useEffect(()=>{const t=()=>{z(window.innerWidth<=Se)};return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[]),s.useEffect(()=>{R.current=!1,l("project"),i(null),x(!1),b(null),v(null),f(!1),M(!1),y(new Map)},[n]),s.useEffect(()=>{R.current||P||D||(S.length>0?l("project"):F.length>0&&l("tasks"),R.current=!0)},[F.length,P,S.length,D]);const $=s.useMemo(()=>{const t=new Map;for(const r of F){const u=t.get(r.taskId)||[];t.set(r.taskId,[...u,r])}return Array.from(t.entries()).map(([r,u])=>{const N=[...u].sort((oe,le)=>le.updatedAt.localeCompare(oe.updatedAt));return{taskId:r,taskTitle:N[0]?.taskTitle,documents:N,latestUpdated:N[0]?.updatedAt??""}}).sort((r,u)=>u.latestUpdated.localeCompare(r.latestUpdated))},[F]),H=s.useMemo(()=>{const t=o.trim().toLowerCase();return t?S.filter(r=>{const u=r.path.toLowerCase(),N=r.name.toLowerCase();return u.includes(t)||N.includes(t)}):S},[S,o]);s.useEffect(()=>{if(!d)return;S.some(r=>r.path===d.path)||(i(null),b(null),v(null),f(!1))},[S,d]);const ee=s.useCallback(t=>{m(t.target.value)},[]),se=s.useCallback(()=>{m("")},[]),U=s.useCallback(t=>{l(t)},[]),te=s.useCallback(async t=>{try{const r=await me(t,n);h(r)}catch{c(`Failed to open task ${t}`,"error")}},[n,h,c]),ne=s.useCallback(async t=>{i(t),f(!0),v(null),b(null);const r=E.current+1;E.current=r;try{const u=await he("project",t.path,n);if(E.current!==r)return;b(u.content)}catch(u){if(E.current!==r)return;const N=u instanceof Error?u.message:`Failed to open ${t.path}`;v(N),c(N,"error")}finally{E.current===r&&f(!1)}},[n,c]),ae=s.useCallback(()=>{i(null),b(null),v(null),f(!1)},[]),re=s.useCallback(t=>{y(r=>{const u=new Map(r),N=u.get(t)??!1;return u.set(t,!N),u})},[]),_=a==="project"?I:Z,ce=s.useCallback(async()=>{if(a==="project"){await O();return}await B()},[a,O,B]),Q=a==="project"?H.length:F.length,q=a==="project"?"Search project markdown files…":"Search task documents…";return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(T,{size:20}),"Documents"]}),e.jsxs("span",{className:"documents-view-count",children:[Q," result",Q!==1?"s":""]})]}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${a==="project"?" active":""}`,role:"tab","aria-selected":a==="project","aria-label":"Show project markdown files",onClick:()=>U("project"),children:["Project Files",e.jsx("span",{className:"documents-tab-count",children:S.length})]}),e.jsxs("button",{className:`btn documents-tab${a==="tasks"?" active":""}`,role:"tab","aria-selected":a==="tasks","aria-label":"Show task documents",onClick:()=>U("tasks"),children:["Task Documents",e.jsx("span",{className:"documents-tab-count",children:$.length})]})]}),a==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>x(t=>!t),"aria-pressed":k,"aria-label":k?"Hide hidden project files":"Show hidden project files",title:k?"Hide hidden files":"Show hidden files",children:[k?e.jsx(fe,{size:14}):e.jsx(pe,{size:14}),k?"Hide Hidden":"Show Hidden"]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(je,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:q,value:o,onChange:ee,"aria-label":q}),o&&e.jsx("button",{className:"documents-search-clear",onClick:se,"aria-label":"Clear search",children:e.jsx(xe,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:_?e.jsxs("div",{className:"documents-view-error",children:[e.jsxs("p",{children:["Failed to load ",a==="project"?"project files":"task documents",": ",_]}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void ce(),"aria-label":"Retry loading documents",children:[e.jsx(we,{size:16}),"Retry"]})]}):a==="project"?D&&S.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading project markdown files…"})}):H.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsxs("p",{children:['No project markdown files match "',o.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(T,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No Markdown files found in this project."})]})}):e.jsxs("div",{className:`documents-project-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!d)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:H.map(t=>{const r=d?.path===t.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void ne(t),"aria-label":`Open ${t.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:t.name}),e.jsx("span",{className:"markdown-file-item-path",children:t.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[Ce(t.size)," · ",J(t.mtime)]})]})},t.path)})})}),(!w||d)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[w&&d&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:ae,"aria-label":"Back to project files list",children:[e.jsx(ke,{size:14}),"Back to files"]}),d?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:d.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>M(t=>!t),"aria-label":j?"Switch to plain text":"Switch to markdown","aria-pressed":j,title:j?"Switch to plain text":"Switch to markdown",children:j?"Markdown":"Plain"})]}),g?e.jsx("p",{className:"documents-content-state",children:"Loading file content…"}):p?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:p}):j?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(X,{remarkPlugins:[V],children:C??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:C??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:"Select a Markdown file to view its content."})})]})]}):P&&F.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading task documents…"})}):$.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsxs("p",{children:['No task documents match "',o.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(T,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No task documents yet."}),e.jsx("p",{className:"documents-view-empty-hint",children:"Documents are created in task detail tabs."})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:$.map(({taskId:t,taskTitle:r,documents:u})=>e.jsx(ye,{taskId:t,taskTitle:r,documents:u,onOpenTask:te,renderMarkdownStates:A,onToggleMarkdown:re},t))})})})]})}export{ze as DocumentsView};
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{a7 as K,a8 as W,a9 as ie,aa as de,ab as G,ac as ue,f as me,ad as he,F as T,ae as fe,af as pe,S as je,X as xe,R as we,ag as ke,ah as X,ai as V,a as Y,b as ge,aj as be}from"./index-CjuQj4qe.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";function ve(n){const{projectId:c,searchQuery:h,includeProjectFiles:a=!0}=n??{},l=c?`${ie.DOCUMENTS_PREFIX}${c}`:null,[o,m]=s.useState(()=>{if(!l)return[];const w=K(l,{maxAgeMs:W});return Array.isArray(w)?w:[]}),[d,i]=s.useState([]),[k,x]=s.useState(()=>o.length===0),[C,b]=s.useState(null),g=s.useRef(null),f=s.useRef(o.length>0),p=s.useRef(null),v=s.useCallback(async()=>{g.current&&g.current.abort();const w=new AbortController;g.current=w;const z=!f.current;z&&x(!0),b(null);const E=de(h?{q:h}:void 0,c),R=a?G(c):Promise.resolve({files:[]}),[j,M]=await Promise.allSettled([E,R]);if(w.signal.aborted)return;let A=null;if(j.status==="fulfilled"){if(m(j.value),l){const y=j.value.length>500?j.value.slice(0,500):j.value;ue(l,y,{maxBytes:5e5})}f.current=!0}else A=j.reason instanceof Error?j.reason.message:String(j.reason);if(M.status==="fulfilled"){const y=M.value.files,L=h?.trim().toLowerCase(),F=L?y.filter(P=>P.name.toLowerCase().includes(L)||P.path.toLowerCase().includes(L)):y;i(F)}b(A),z&&x(!1)},[l,a,c,h]);return s.useEffect(()=>{if(!l){f.current=!1,m([]),x(!0);return}const w=K(l,{maxAgeMs:W});Array.isArray(w)?(m(w),f.current=!0,x(!1)):(f.current=!1,m([]),x(!0))},[l]),s.useEffect(()=>(p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{v()},300),()=>{p.current&&clearTimeout(p.current)}),[v]),s.useEffect(()=>(v(),()=>{g.current&&g.current.abort()}),[]),{documents:o,projectFiles:d,loading:k,error:C,refresh:v}}function Ne(n,c){const[h,a]=s.useState([]),[l,o]=s.useState(!0),[m,d]=s.useState(null),i=s.useRef(null),k=s.useRef(!1),x=c?.showHidden??!1,C=s.useCallback(async b=>{i.current&&i.current.abort();const g=new AbortController;i.current=g;const f=!k.current;f&&o(!0),d(null);try{const p=await G(n,{showHidden:b?.showHidden??x});if(g.signal.aborted)return;a(p.files),k.current=!0}catch(p){if(g.signal.aborted)return;d(p instanceof Error?p.message:String(p))}finally{!g.signal.aborted&&f&&o(!1)}},[n,x]);return s.useEffect(()=>(k.current=!1,C({showHidden:x}),()=>{i.current&&i.current.abort()}),[C,x]),{files:h,loading:l,error:m,refresh:C}}const Se=768;function J(n){return n?new Date(n).toLocaleString():""}function Ce(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(n>=10*1024?0:1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function Fe(n,c=200){return n.length<=c?n:`${n.substring(0,c)}…`}function Ee({document:n,renderMarkdown:c,onToggleMarkdown:h}){const[a,l]=s.useState(!1),o=Fe(n.content),m=n.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(T,{size:14}),e.jsx("span",{className:"document-card-key-text",children:n.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",n.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>l(d=>!d),title:a?"Collapse":"Expand","aria-label":a?"Collapse content":"Expand content",children:a?e.jsx(be,{size:14}):e.jsx(Y,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:n.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:J(n.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${a?" document-card-content--expanded":""}`,children:[a?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:h,"aria-label":c?"Switch to plain text":"Switch to markdown","aria-pressed":c,title:c?"Switch to plain text":"Switch to markdown",children:c?"Markdown":"Plain"})}),c?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(X,{remarkPlugins:[V],children:n.content})})}):e.jsx("pre",{className:"document-card-content-text",children:n.content})]}):e.jsx("p",{className:"document-card-preview",children:o}),m&&!a&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function ye({taskId:n,taskTitle:c,documents:h,onOpenTask:a,renderMarkdownStates:l,onToggleMarkdown:o}){const[m,d]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>d(i=>!i),"aria-expanded":m,"aria-label":`${m?"Collapse":"Expand"} documents for task ${n}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:m?e.jsx(Y,{size:16}):e.jsx(ge,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:n}),e.jsx("span",{className:"documents-group-task-title",children:c||"Untitled"})]}),e.jsxs("span",{className:"documents-group-count",children:[h.length," doc",h.length!==1?"s":""]}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>a(n),"aria-label":`Open task ${n}: ${c||"Untitled"}`,children:"Open task"})]}),m&&e.jsx("div",{className:"documents-group-content",children:h.map(i=>e.jsx(Ee,{document:i,renderMarkdown:l.get(i.id)??!1,onToggleMarkdown:()=>o(i.id)},i.id))})]})}function ze({projectId:n,addToast:c,onOpenDetail:h}){const[a,l]=s.useState("project"),[o,m]=s.useState(""),[d,i]=s.useState(null),[k,x]=s.useState(!1),[C,b]=s.useState(null),[g,f]=s.useState(!1),[p,v]=s.useState(null),[w,z]=s.useState(!1),E=s.useRef(0),R=s.useRef(!1),[j,M]=s.useState(!1),[A,y]=s.useState(new Map),L=a==="tasks"?o.trim():"",{documents:F,loading:P,error:Z,refresh:B}=ve({projectId:n,searchQuery:L||void 0,includeProjectFiles:!1}),{files:S,loading:D,error:I,refresh:O}=Ne(n,{showHidden:k});s.useEffect(()=>{const t=()=>{z(window.innerWidth<=Se)};return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[]),s.useEffect(()=>{R.current=!1,l("project"),i(null),x(!1),b(null),v(null),f(!1),M(!1),y(new Map)},[n]),s.useEffect(()=>{R.current||P||D||(S.length>0?l("project"):F.length>0&&l("tasks"),R.current=!0)},[F.length,P,S.length,D]);const $=s.useMemo(()=>{const t=new Map;for(const r of F){const u=t.get(r.taskId)||[];t.set(r.taskId,[...u,r])}return Array.from(t.entries()).map(([r,u])=>{const N=[...u].sort((oe,le)=>le.updatedAt.localeCompare(oe.updatedAt));return{taskId:r,taskTitle:N[0]?.taskTitle,documents:N,latestUpdated:N[0]?.updatedAt??""}}).sort((r,u)=>u.latestUpdated.localeCompare(r.latestUpdated))},[F]),H=s.useMemo(()=>{const t=o.trim().toLowerCase();return t?S.filter(r=>{const u=r.path.toLowerCase(),N=r.name.toLowerCase();return u.includes(t)||N.includes(t)}):S},[S,o]);s.useEffect(()=>{if(!d)return;S.some(r=>r.path===d.path)||(i(null),b(null),v(null),f(!1))},[S,d]);const ee=s.useCallback(t=>{m(t.target.value)},[]),se=s.useCallback(()=>{m("")},[]),U=s.useCallback(t=>{l(t)},[]),te=s.useCallback(async t=>{try{const r=await me(t,n);h(r)}catch{c(`Failed to open task ${t}`,"error")}},[n,h,c]),ne=s.useCallback(async t=>{i(t),f(!0),v(null),b(null);const r=E.current+1;E.current=r;try{const u=await he("project",t.path,n);if(E.current!==r)return;b(u.content)}catch(u){if(E.current!==r)return;const N=u instanceof Error?u.message:`Failed to open ${t.path}`;v(N),c(N,"error")}finally{E.current===r&&f(!1)}},[n,c]),ae=s.useCallback(()=>{i(null),b(null),v(null),f(!1)},[]),re=s.useCallback(t=>{y(r=>{const u=new Map(r),N=u.get(t)??!1;return u.set(t,!N),u})},[]),_=a==="project"?I:Z,ce=s.useCallback(async()=>{if(a==="project"){await O();return}await B()},[a,O,B]),Q=a==="project"?H.length:F.length,q=a==="project"?"Search project markdown files…":"Search task documents…";return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(T,{size:20}),"Documents"]}),e.jsxs("span",{className:"documents-view-count",children:[Q," result",Q!==1?"s":""]})]}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${a==="project"?" active":""}`,role:"tab","aria-selected":a==="project","aria-label":"Show project markdown files",onClick:()=>U("project"),children:["Project Files",e.jsx("span",{className:"documents-tab-count",children:S.length})]}),e.jsxs("button",{className:`btn documents-tab${a==="tasks"?" active":""}`,role:"tab","aria-selected":a==="tasks","aria-label":"Show task documents",onClick:()=>U("tasks"),children:["Task Documents",e.jsx("span",{className:"documents-tab-count",children:$.length})]})]}),a==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>x(t=>!t),"aria-pressed":k,"aria-label":k?"Hide hidden project files":"Show hidden project files",title:k?"Hide hidden files":"Show hidden files",children:[k?e.jsx(fe,{size:14}):e.jsx(pe,{size:14}),k?"Hide Hidden":"Show Hidden"]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(je,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:q,value:o,onChange:ee,"aria-label":q}),o&&e.jsx("button",{className:"documents-search-clear",onClick:se,"aria-label":"Clear search",children:e.jsx(xe,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:_?e.jsxs("div",{className:"documents-view-error",children:[e.jsxs("p",{children:["Failed to load ",a==="project"?"project files":"task documents",": ",_]}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void ce(),"aria-label":"Retry loading documents",children:[e.jsx(we,{size:16}),"Retry"]})]}):a==="project"?D&&S.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading project markdown files…"})}):H.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsxs("p",{children:['No project markdown files match "',o.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(T,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No Markdown files found in this project."})]})}):e.jsxs("div",{className:`documents-project-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!d)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:H.map(t=>{const r=d?.path===t.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void ne(t),"aria-label":`Open ${t.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:t.name}),e.jsx("span",{className:"markdown-file-item-path",children:t.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[Ce(t.size)," · ",J(t.mtime)]})]})},t.path)})})}),(!w||d)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[w&&d&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:ae,"aria-label":"Back to project files list",children:[e.jsx(ke,{size:14}),"Back to files"]}),d?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:d.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>M(t=>!t),"aria-label":j?"Switch to plain text":"Switch to markdown","aria-pressed":j,title:j?"Switch to plain text":"Switch to markdown",children:j?"Markdown":"Plain"})]}),g?e.jsx("p",{className:"documents-content-state",children:"Loading file content…"}):p?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:p}):j?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(X,{remarkPlugins:[V],children:C??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:C??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:"Select a Markdown file to view its content."})})]})]}):P&&F.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading task documents…"})}):$.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsxs("p",{children:['No task documents match "',o.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(T,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No task documents yet."}),e.jsx("p",{className:"documents-view-empty-hint",children:"Documents are created in task detail tabs."})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:$.map(({taskId:t,taskTitle:r,documents:u})=>e.jsx(ye,{taskId:t,taskTitle:r,documents:u,onOpenTask:te,renderMarkdownStates:A,onToggleMarkdown:re},t))})})})]})}export{ze as DocumentsView};
|