@runfusion/fusion 0.14.3 → 0.15.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.
Files changed (34) hide show
  1. package/dist/bin.js +210 -71
  2. package/dist/client/assets/{AgentDetailView-BBCnqhqI.js → AgentDetailView-B1zViykq.js} +1 -1
  3. package/dist/client/assets/{AgentsView-BY-Yq-Te.js → AgentsView-Bl9JH5C8.js} +3 -3
  4. package/dist/client/assets/{ChatView-DkoJNxFW.js → ChatView-liNErE53.js} +1 -1
  5. package/dist/client/assets/{DevServerView-qvs6pp6c.js → DevServerView-CV_PpbnZ.js} +1 -1
  6. package/dist/client/assets/{DirectoryPicker-BkAIXNrP.js → DirectoryPicker-DPfkGnj5.js} +1 -1
  7. package/dist/client/assets/{DocumentsView-BcaUGgaL.js → DocumentsView-CESb6RI7.js} +1 -1
  8. package/dist/client/assets/{InsightsView-Dz9Ivclw.js → InsightsView-BKhvyEyQ.js} +1 -1
  9. package/dist/client/assets/{MemoryView-BsweARBT.js → MemoryView-DB-l2miV.js} +1 -1
  10. package/dist/client/assets/{NodesView-bAU-v4bJ.js → NodesView-DgTXO8mm.js} +1 -1
  11. package/dist/client/assets/{PiExtensionsManager-C_U2g7y3.js → PiExtensionsManager-C4fTzemh.js} +1 -1
  12. package/dist/client/assets/{PluginManager-pIDsTk5v.js → PluginManager-C2-dExUL.js} +1 -1
  13. package/dist/client/assets/{ResearchView-D4Eib_uR.js → ResearchView-CkVwRDVA.js} +1 -1
  14. package/dist/client/assets/{RoadmapsView-BaGwsUGS.js → RoadmapsView-Cu85_XrQ.js} +1 -1
  15. package/dist/client/assets/{SettingsModal-BiZVi3cI.js → SettingsModal-BGnSAeqa.js} +1 -1
  16. package/dist/client/assets/{SettingsModal-CRyg643t.js → SettingsModal-C0DokcId.js} +3 -3
  17. package/dist/client/assets/{SetupWizardModal-BcIGBBpA.js → SetupWizardModal-C_d9clJp.js} +1 -1
  18. package/dist/client/assets/{SkillMultiselect-DPARHJeQ.js → SkillMultiselect-DwGWYZi6.js} +1 -1
  19. package/dist/client/assets/{SkillsView-Da_d_HPu.js → SkillsView-C096TB7i.js} +1 -1
  20. package/dist/client/assets/{TodoView-5rAeqYtV.js → TodoView-CUiAt2mR.js} +1 -1
  21. package/dist/client/assets/{folder-open-CgjcFqww.js → folder-open-CKivQd8c.js} +1 -1
  22. package/dist/client/assets/index-B4StE1qN.js +662 -0
  23. package/dist/client/assets/index-DYJk0WDc.css +1 -0
  24. package/dist/client/assets/{list-checks-C9YWtF7h.js → list-checks-B3oufblU.js} +1 -1
  25. package/dist/client/assets/{star-4nUh67-U.js → star-damu_EYz.js} +1 -1
  26. package/dist/client/assets/{upload-CEt5-Bnq.js → upload-uH6CHlEw.js} +1 -1
  27. package/dist/client/assets/{users-4I0JDmgO.js → users-CUySbfji.js} +1 -1
  28. package/dist/client/index.html +2 -2
  29. package/dist/client/version.json +1 -1
  30. package/dist/extension.js +204 -69
  31. package/dist/pi-claude-cli/package.json +1 -1
  32. package/package.json +1 -1
  33. package/dist/client/assets/index-D1gTSlYB.css +0 -1
  34. package/dist/client/assets/index-DoQ5ALYY.js +0 -662
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-BBCnqhqI.js","assets/vendor-react-K0fH_qHe.js","assets/index-DoQ5ALYY.js","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/index-D1gTSlYB.css","assets/star-4nUh67-U.js","assets/SkillMultiselect-DPARHJeQ.js","assets/SkillMultiselect-DDHJnrkn.css","assets/list-checks-C9YWtF7h.js","assets/AgentDetailView-B5tq9ius.css"])))=>i.map(i=>d[i]);
2
- import{c as Ye,s as yt,A as Te,r as Je,F as Xe,f as wt,C as De,Z as jt,B as et,g as Ze,a as gt,b as Ve,d as kt,e as Nt,h as Ct,i as It,u as nt,P as St,j as At,k as Et,l as Tt,m as Mt,n as Pt,o as Rt,p as _t,q as $t,t as at,G as Ft,S as Lt,L as We,T as Ue,R as Oe,X as st,v as zt,w as Dt,x as Ot,y as Ht,z as be,D as Ke,E as qt,H as Vt,I as Wt,J as Ut,K as Kt,M as Bt,N as ht,O as Gt,Q as $e,U as it,V as Qt,W as Jt,Y as Xt,_ as Fe,$ as Zt,a0 as rt,a1 as Yt,a2 as en,a3 as tn,a4 as nn}from"./index-DoQ5ALYY.js";import{r as a,j as e,a as an}from"./vendor-react-K0fH_qHe.js";import{S as sn}from"./SkillMultiselect-DPARHJeQ.js";import{U as pt}from"./upload-CEt5-Bnq.js";import{F as rn}from"./folder-open-CgjcFqww.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-B1zViykq.js","assets/vendor-react-K0fH_qHe.js","assets/index-B4StE1qN.js","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/index-DYJk0WDc.css","assets/star-damu_EYz.js","assets/SkillMultiselect-DwGWYZi6.js","assets/SkillMultiselect-DDHJnrkn.css","assets/list-checks-B3oufblU.js","assets/AgentDetailView-B5tq9ius.css"])))=>i.map(i=>d[i]);
2
+ import{c as Ye,s as yt,A as Te,r as Je,F as Xe,f as wt,C as De,Z as jt,B as et,g as Ze,a as gt,b as Ve,d as kt,e as Nt,h as Ct,i as It,u as nt,P as St,j as At,k as Et,l as Tt,m as Mt,n as Pt,o as Rt,p as _t,q as $t,t as at,G as Ft,S as Lt,L as We,T as Ue,R as Oe,X as st,v as zt,w as Dt,x as Ot,y as Ht,z as be,D as Ke,E as qt,H as Vt,I as Wt,J as Ut,K as Kt,M as Bt,N as ht,O as Gt,Q as $e,U as it,V as Qt,W as Jt,Y as Xt,_ as Fe,$ as Zt,a0 as rt,a1 as Yt,a2 as en,a3 as tn,a4 as nn}from"./index-B4StE1qN.js";import{r as a,j as e,a as an}from"./vendor-react-K0fH_qHe.js";import{S as sn}from"./SkillMultiselect-DwGWYZi6.js";import{U as pt}from"./upload-uH6CHlEw.js";import{F as rn}from"./folder-open-CKivQd8c.js";import"./vendor-xterm-DzcZoU0P.js";/**
3
3
  * @license lucide-react v1.7.0 - ISC
4
4
  *
5
5
  * This source code is licensed under the ISC license.
@@ -519,4 +519,4 @@ reportsTo: null
519
519
  skills:
520
520
  - review
521
521
  ---
522
- Agent instructions go here...`,value:u,onChange:i=>{m("paste"),b([]),p(i.target.value),F(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",r]}),se&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(Ue,{size:14}),se]})]}),c==="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(Xe,{size:14}),e.jsxs("span",{children:[T.length," agent",T.length!==1?"s":""," found"]})]}),T.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(T.map(i=>i.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v([]),children:"Clear agents"})]}),T.length>0?e.jsx("div",{className:"agent-import-agent-list",children:T.map((i,x)=>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:A.includes(i.name),onChange:()=>Me(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?"...":""]})]})]},x))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),S.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(Xe,{size:14}),e.jsxs("span",{children:[S.length," skill",S.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>_(S.map(i=>i.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>_([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:S.map((i,x)=>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:E.includes(i.name),onChange:()=>Ie(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}-${x}`))})]}),J&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(Ue,{size:14}),J]})]}),c==="result"&&h&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(De,{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:h.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[h.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[h.created.length," created"]})}),h.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[h.skipped.length," skipped (already exist)"]})}),h.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[h.errors.length," error",h.errors.length!==1?"s":""]})})]}),h.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:h.created.map((i,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(De,{size:12}),e.jsx("span",{children:i.name})]},x))}),h.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:h.errors.map((i,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(st,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},x))}),h.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:[h.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[h.skills.imported.length," skill",h.skills.imported.length!==1?"s":""," imported"]})}),h.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[h.skills.skipped.length," skill",h.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),h.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[h.skills.errors.length," skill",h.skills.errors.length!==1?"s":""," error",h.skills.errors.length!==1?"s":""]})}),h.skills.imported.length===0&&h.skills.skipped.length===0&&h.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"})})]}),h.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:h.skills.imported.map((i,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(De,{size:12}),e.jsx("span",{children:i.name})]},x))}),h.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:h.skills.errors.map((i,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(st,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},x))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[c==="preview"&&e.jsx("button",{className:"btn",onClick:()=>o("input"),disabled:Q,children:"Back"}),e.jsx("button",{className:"btn",onClick:H,disabled:Q,children:c==="result"?"Close":"Cancel"}),c==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void re(),disabled:P||(r==="directory"?f.length===0:r==="browse"?!L:!u.trim()),children:P?e.jsxs(e.Fragment,{children:[e.jsx(We,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),c==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void ye(),disabled:Q||O===0&&z===0,children:Q?e.jsxs(e.Fragment,{children:[e.jsx(We,{size:14,className:"spin"}),le]}):`Import ${Ne}`})]})]})}):null}const Gn=a.lazy(()=>nn(()=>import("./AgentDetailView-BBCnqhqI.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(s=>({default:s.AgentDetailView}))),ze=[{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:"✦"}],Qe=[.1,.25,.5,1,2,3,5,10];function He(s){switch(s){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"terminated":return"agent-badge--terminated";case"idle":default:return"agent-badge--idle"}}function qe(s,l){switch(l){case"running":return`${s}--running`;case"active":return`${s}--active`;case"paused":return`${s}--paused`;case"error":return`${s}--error`;case"terminated":return`${s}--terminated`;case"idle":default:return`${s}--idle`}}function vt({node:s,onSelect:l,onToggle:y,isExpanded:g,getChildCount:c,getHealthStatus:o,getRoleIcon:r,getSkillBadges:m}){const{agent:u,children:p,depth:f}=s,b=c(u.id),w=g(u.id),C=o(u),T=He(u.state),M=qe("agent-tree__node",u.state);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`${M}${u.reportsTo?" agent-is-child":""} agent-tree__indent--${Math.min(f,4)}`,children:[e.jsx("button",{className:`agent-tree__toggle${b===0?" agent-tree__toggle--leaf":""}`,onClick:()=>b>0&&y(u.id),title:b>0?w?"Collapse":"Expand":"No employees","aria-label":b>0?w?"Collapse":"Expand":"No employees",children:b>0?w?e.jsx(Jt,{size:16}):e.jsx(ht,{size:16}):e.jsx(et,{size:14})}),e.jsxs("div",{className:"agent-tree__content",onClick:()=>l(u.id),role:"button",tabIndex:0,onKeyDown:S=>S.key==="Enter"&&l(u.id),children:[e.jsx("span",{className:"agent-tree__icon",children:r(u.role)}),e.jsx("span",{className:"agent-tree__name",children:u.name}),e.jsx("span",{className:`agent-tree__badge ${T}`,children:u.state}),e.jsx("span",{className:"agent-tree__health",style:{color:C.color},title:C.label,children:C.icon}),b>0&&e.jsxs("span",{className:"agent-tree__count text-secondary",children:["(",b,")"]}),(()=>{const S=m(u);return S.length===0?null:e.jsxs("span",{className:"agent-tree__skill",title:S.join(", "),children:[S[0],S.length>1&&` +${S.length-1}`]})})()]})]}),w&&p.length>0&&e.jsx("div",{className:"agent-tree__children",children:p.map(S=>e.jsx(vt,{node:S,onSelect:l,onToggle:y,isExpanded:g,getChildCount:c,getHealthStatus:o,getRoleIcon:r,getSkillBadges:m},S.agent.id))})]})}function xt({node:s,onSelect:l,getHealthStatus:y,getRoleIcon:g,getSkillBadges:c}){const{agent:o,children:r}=s,m=y(o),u=He(o.state),p=qe("org-chart-node-card",o.state);return e.jsxs("div",{className:`org-chart-node${r.length>0?" org-chart-node--has-children":""}`,children:[e.jsxs("div",{className:p,onClick:()=>l(o.id),role:"button",tabIndex:0,onKeyDown:f=>f.key==="Enter"&&l(o.id),children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:g(o.role)}),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 ${u}`,children:o.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:m.color},title:m.label,children:[m.icon,!m.stateDerived&&e.jsx("span",{className:"text-secondary",children:m.label})]}),(()=>{const f=c(o);if(f.length===0)return null;const b=f.slice(0,2),w=f.length-2;return e.jsxs(e.Fragment,{children:[b.map(C=>e.jsx("span",{className:"org-chart-node__skill",children:C},C)),w>0&&e.jsxs("span",{className:"org-chart-node__skill",children:["+",w]})]})})()]})]}),r.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${o.name} employees`,children:r.map(f=>e.jsx(xt,{node:f,onSelect:l,getHealthStatus:y,getRoleIcon:g,getSkillBadges:c},f.agent.id))})]})}function ta({addToast:s,projectId:l,onOpenTaskLogs:y,agentOnboardingEnabled:g=!1}){const[c,o]=a.useState(!1),[r,m]=a.useState("all"),{agents:u,stats:p,isLoading:f,loadAgents:b}=zt(l,{filterState:r,showSystemAgents:c}),[w,C]=a.useState(!1),[T,M]=a.useState(!1),[S,j]=a.useState(null),[A,v]=a.useState(!1),[E,_]=a.useState(null),[P,D]=a.useState(()=>{if(typeof window>"u")return"list";const n=Ze("fn-agent-view",l);return n==="list"||n==="board"||n==="tree"||n==="org"?n:"list"}),[Q,q]=a.useState([]),[se,F]=a.useState(!1),[h,I]=a.useState(!1),J=a.useRef(null),{confirm:V}=Dt(),X=a.useRef(null),ie=a.useId();a.useEffect(()=>{const n=Ze("fn-agent-view",l);if(n==="list"||n==="board"||n==="tree"||n==="org"){D(n);return}D("list")},[l]),a.useEffect(()=>{gt("fn-agent-view",P,l)},[P,l]);const[ve,W]=a.useState(null),ne=a.useRef(null),[ke,L]=a.useState(null),[oe,U]=a.useState(null),[ce,ae]=a.useState({}),[K,ue]=a.useState(1),[me,ge]=a.useState(!1),[H,xe]=a.useState(new Set),[Z,he]=a.useState(new Map),re=a.useRef(!0);a.useEffect(()=>(re.current=!0,()=>{re.current=!1}),[]),a.useEffect(()=>{Ot(l).then(n=>{re.current&&ue(n.heartbeatMultiplier??1)}).catch(()=>{})},[l]);const ye=a.useCallback(async n=>{const t=Number.isFinite(n)&&n>0?n:1;ue(t),ge(!0);try{await Ht({heartbeatMultiplier:t},l),s(`Heartbeat speed set to ×${t.toFixed(1)}`,"success")}catch(d){s(`Failed to save heartbeat multiplier: ${be(d)}`,"error")}finally{re.current&&ge(!1)}},[l,s]),O=a.useMemo(()=>Z.size===0?u:u.map(n=>{const t=Z.get(n.id);return t?{...n,state:t}:n}),[u,Z]),z=jn(O,l),de=a.useMemo(()=>O.filter(n=>c||!Ke(n)),[O,c]),we=a.useMemo(()=>O.filter(n=>n.state!=="active"&&n.state!=="running"?!1:c||!Ke(n)),[O,c]),Ne=a.useMemo(()=>{if(c)return Q;const n=t=>Ke(t.agent)?null:{...t,children:t.children.map(n).filter(d=>d!==null)};return Q.map(n).filter(t=>t!==null)},[Q,c]);a.useEffect(()=>{if(P!=="org")return;let n=!1;return F(!0),qt(l,{includeEphemeral:c}).then(t=>{n||q(t)}).catch(t=>{n||(s(`Failed to load org chart: ${be(t)}`,"error"),q([]))}).finally(()=>{n||F(!1)}),()=>{n=!0}},[P,l,c,s]),a.useEffect(()=>{const n=setInterval(()=>{b()},3e4);return()=>{clearInterval(n)}},[b]),a.useEffect(()=>{if(!h)return;const n=d=>{const k=d.target;k&&(J.current?.contains(k)||X.current?.contains(k)||I(!1))},t=d=>{d.key==="Escape"&&(I(!1),X.current?.focus())};return document.addEventListener("mousedown",n),document.addEventListener("touchstart",n),document.addEventListener("keydown",t),()=>{document.removeEventListener("mousedown",n),document.removeEventListener("touchstart",n),document.removeEventListener("keydown",t)}},[h]);const le=async(n,t)=>{if(!H.has(n)){xe(d=>new Set(d).add(n)),he(d=>{const k=new Map(d);return k.set(n,t),k});try{await Yt(n,t,l),s(`Agent state updated to ${t}`,"success"),await b(),he(d=>{const k=new Map(d);return k.delete(n),k})}catch(d){he(k=>{const $=new Map(k);return $.delete(n),$}),s(`Failed to update state: ${be(d)}`,"error")}finally{xe(d=>{const k=new Set(d);return k.delete(n),k})}}},Me=async(n,t)=>{if(await V({title:"Delete Agent",message:`Delete agent "${t}"? This cannot be undone.`,danger:!0}))try{await tn(n,l),s(`Agent "${t}" deleted`,"success"),b()}catch(k){s(`Failed to delete agent: ${be(k)}`,"error")}},Ie=async(n,t)=>{const d=u.find(k=>k.id===n);if(d){if(d.role===t){W(null);return}try{await Fe(n,{role:t},l),s(`Agent role updated to ${ze.find(k=>k.value===t)?.label??t}`,"success"),W(null),b()}catch(k){s(`Failed to update role: ${be(k)}`,"error")}}},i=(n,t)=>{n.key==="Escape"&&W(null)},x=async(n,t)=>{oe===n.id&&(U(null),ae(d=>{const k={...d};return delete k[n.id],k})),L(n.id);try{await Fe(n.id,{runtimeConfig:{...n.runtimeConfig??{},heartbeatIntervalMs:t}},l),s(`Heartbeat interval updated to ${rt(t)} for ${n.name}`,"success"),b()}catch(d){s(`Failed to update heartbeat interval: ${be(d)}`,"error")}finally{L(null)}},R=async n=>{const t=ce[n.id]??"";if(t.trim()===""){s("Please enter a heartbeat interval in minutes","error");return}const d=Number(t);if(isNaN(d)){s("Heartbeat interval must be a valid number","error");return}if(d<=0){s("Heartbeat interval must be greater than 0","error");return}if(d>=1&&d<5){L(n.id);try{await Fe(n.id,{runtimeConfig:{...n.runtimeConfig??{},heartbeatIntervalMs:Zt}},l),s(`Heartbeat interval set to 5 minutes (minimum). ${d} minute${d!==1?"s":""} was below the 5-minute minimum.`,"success"),U(null),ae($=>{const ee={...$};return delete ee[n.id],ee}),b()}catch($){s(`Failed to update heartbeat interval: ${be($)}`,"error")}finally{L(null)}return}const k=Math.round(d*6e4);L(n.id);try{await Fe(n.id,{runtimeConfig:{...n.runtimeConfig??{},heartbeatIntervalMs:k}},l),s(`Heartbeat interval updated to ${rt(k)} for ${n.name}`,"success"),U(null),ae($=>{const ee={...$};return delete ee[n.id],ee}),b()}catch($){s(`Failed to update heartbeat interval: ${be($)}`,"error")}finally{L(null)}},Y=n=>{const t=Je(n.runtimeConfig?.heartbeatIntervalMs),d=Math.round(t/6e4);U(n.id),ae(k=>({...k,[n.id]:String(d)}))},B=a.useCallback(()=>{_(null)},[]),G=a.useCallback(n=>{_(n)},[]),Pe=async(n,t)=>{try{await en(n,l,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),s(`Heartbeat run started for ${t}`,"success"),b()}catch(d){s(`Failed to start heartbeat run: ${be(d)}`,"error")}},pe=n=>ze.find(t=>t.value===n)?.label??n,Se=n=>ze.find(t=>t.value===n)?.icon??"◆",Ae=n=>Array.isArray(n.metadata?.skills)?n.metadata.skills:[],fe=n=>Xt(n),Re=f&&u.length===0,je=a.useCallback(()=>{if(g){M(!0);return}C(!0)},[g]);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(et,{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${P==="list"?" active":""}`,onClick:()=>D("list"),title:"List view","aria-label":"List view","aria-pressed":P==="list",children:e.jsx(Vt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="board"?" active":""}`,onClick:()=>D("board"),title:"Board view","aria-label":"Board view","aria-pressed":P==="board",children:e.jsx(Te,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="tree"?" active":""}`,onClick:()=>D("tree"),title:"Tree view","aria-label":"Tree view","aria-pressed":P==="tree",children:e.jsx(Wt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="org"?" active":""}`,onClick:()=>D("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":P==="org",children:e.jsx(dn,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:X,className:`btn-icon agent-controls-trigger${h?" agent-controls-trigger--active":""}`,onClick:()=>I(n=>!n),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":h,"aria-controls":ie,children:e.jsx(mn,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void b(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Oe,{size:16,className:f?"spin":void 0})}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{je(),I(!1)},children:[e.jsx(Ut,{size:16}),"New Agent"]})]})]})]}),h&&e.jsxs("div",{ref:J,id:ie,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsxs("div",{className:"agent-controls",children:[e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(Kt,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:r,onChange:n=>m(n.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.jsx("option",{value:"terminated",children:"Terminated"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:c,onChange:n=>o(n.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]}),e.jsx("div",{className:"agent-controls-actions",children:e.jsxs("button",{className:"btn",onClick:()=>{v(!0),I(!1)},children:[e.jsx(pt,{size:16}),"Import"]})})]}),e.jsx("div",{className:"agent-global-controls",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:K,onChange:n=>{const t=Number(n.target.value);ye(Number.isFinite(t)&&t>0?t:1)},disabled:me}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",K.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(Qe.reduce((n,t)=>Math.abs(t-K)<Math.abs(n-K)?t:n,Qe[0])),onChange:n=>{const t=Number(n.target.value);ye(Number.isFinite(t)&&t>0?t:1)},disabled:me,"aria-label":"Heartbeat speed preset",children:Qe.map(n=>e.jsxs("option",{value:String(n),children:["×",n]},n))})]}),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(xn,{agents:de})]}),e.jsxs("div",{className:"agents-view-content",children:[e.jsx(vn,{stats:p}),e.jsx(fn,{agents:we,projectId:l,onAgentSelect:_,onOpenTaskLogs:y}),e.jsx(Wn,{isOpen:w,onClose:()=>{C(!1),j(null)},onCreated:()=>{C(!1),j(null),b()},projectId:l,prefillDraft:S}),e.jsx(Un,{isOpen:T,onClose:()=>M(!1),onUseDraft:n=>{j(n),M(!1),C(!0)},projectId:l,existingAgents:u}),e.jsx(Bn,{isOpen:A,onClose:()=>v(!1),onImported:()=>void b(),projectId:l}),Re?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Oe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):P==="tree"?e.jsx("div",{className:"agent-tree__view",children:de.length===0?e.jsx(Le,{onCtaClick:je}):z.rootNodes.map(n=>e.jsx(vt,{node:n,onSelect:_,onToggle:z.toggleExpand,isExpanded:z.isExpanded,getChildCount:t=>z.getChildren(t).length,getHealthStatus:fe,getRoleIcon:Se,getSkillBadges:Ae},n.agent.id))}):P==="org"?e.jsx("div",{className:"agent-org-chart","data-testid":"agent-org-chart",children:se?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Oe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):Ne.length===0?e.jsx(Le,{onCtaClick:je}):Ne.map(n=>e.jsx(xt,{node:n,onSelect:_,getHealthStatus:fe,getRoleIcon:Se,getSkillBadges:Ae},n.agent.id))}):P==="board"?e.jsx("div",{className:"agent-board",children:de.length===0?e.jsx(Le,{onCtaClick:je}):de.map(n=>{const t=fe(n),d=He(n.state),k=qe("agent-board-card",n.state);return e.jsx("div",{className:`agent-board-card ${k}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>_(n.id),role:"button",tabIndex:0,onKeyDown:$=>$.key==="Enter"&&_(n.id),children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:Se(n.role)}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:pe(n.role)}),e.jsx("span",{className:`agent-board-badge badge ${d}`,children:n.state})]}),e.jsx("div",{className:"agent-board-name",children:n.name}),e.jsx("div",{className:"agent-board-id",children:n.id}),e.jsxs("div",{className:"agent-board-health",style:{color:t.color},title:t.label,children:[t.icon,!t.stateDerived&&` ${t.label}`]})]})},n.id)})}):e.jsx("div",{className:"agent-list",children:de.length===0?e.jsx(Le,{onCtaClick:je}):de.map(n=>{const t=fe(n),d=He(n.state),k=qe("agent-card",n.state),$=Je(n.runtimeConfig?.heartbeatIntervalMs),ee=Bt($),_e=ke===n.id;return e.jsxs("div",{className:`agent-card ${k}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info agent-info--clickable",onClick:()=>_(n.id),role:"button",tabIndex:0,onKeyDown:N=>N.key==="Enter"&&_(n.id),children:[ve===n.id?e.jsx("select",{ref:ne,className:"select agent-role-select",value:n.role,onChange:N=>void Ie(n.id,N.target.value),onKeyDown:N=>i(N,n.id),onBlur:()=>W(null),autoFocus:!0,children:ze.map(N=>e.jsxs("option",{value:N.value,children:[N.icon," ",N.label]},N.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:N=>{N.stopPropagation(),W(n.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.stopPropagation(),W(n.id))},children:Se(n.role)}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:n.name}),e.jsx("span",{className:"agent-id text-secondary",children:n.id})]}),e.jsx(ht,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${d}`,children:n.state}),e.jsxs("span",{className:"badge",style:{color:t.color},title:t.label,children:[t.icon,!t.stateDerived&&` ${t.label}`]}),e.jsx("span",{className:"badge text-secondary",children:pe(n.role)}),(()=>{const N=Ae(n);if(N.length===0)return null;const te=N.slice(0,2),Ce=N.length-2;return e.jsxs(e.Fragment,{children:[te.map(tt=>e.jsx("span",{className:"badge badge-skill",children:tt},tt)),Ce>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",Ce]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[n.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:n.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),oe===n.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:ce[n.id]??"",onChange:N=>ae(te=>({...te,[n.id]:N.target.value})),onKeyDown:N=>{N.key==="Enter"?R(n):N.key==="Escape"&&(U(null),ae(te=>{const Ce={...te};return delete Ce[n.id],Ce}))},disabled:_e,"aria-label":`Custom heartbeat interval in minutes for ${n.name}`}),e.jsx("span",{className:"text-secondary",children:"min"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>void R(n),disabled:_e,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>{U(null),ae(N=>{const te={...N};return delete te[n.id],te})},disabled:_e,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:$,onChange:N=>{const te=N.target.value;te==="__custom__"?Y(n):x(n,Number(te))},disabled:_e,"aria-label":`Set heartbeat interval for ${n.name}`,children:[ee.map(N=>e.jsx("option",{value:N.value,children:N.label},N.value)),Gt.some(N=>N.value===$)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),_e&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),n.lastHeartbeatAt&&(()=>{const N=new Date(n.lastHeartbeatAt),te=new Date(N.getTime()+$),Ce=n.state==="active"||n.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:N.toLocaleString(),children:["Last: ",N.toLocaleTimeString()]}),Ce&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:te.toLocaleString(),children:["Next: ",te.toLocaleTimeString()]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[n.state==="idle"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"active"),disabled:H.has(n.id),title:"Activate",children:[e.jsx($e,{size:14})," Start"]}),n.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void Pe(n.id,n.name),disabled:H.has(n.id),title:"Run Now","aria-label":`Run now for ${n.name}`,children:[e.jsx(Te,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"paused"),disabled:H.has(n.id),title:"Pause",children:[e.jsx(it,{size:14})," Pause"]})]}),n.state==="paused"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"active"),disabled:H.has(n.id),title:"Resume",children:[e.jsx($e,{size:14})," Resume"]}),n.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",disabled:!0,title:"Run in progress","aria-label":`Heartbeat run in progress for ${n.name}`,children:[e.jsx(Te,{size:14})," Running"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"paused"),disabled:H.has(n.id),title:"Pause",children:[e.jsx(it,{size:14})," Pause"]})]}),n.state==="error"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"active"),disabled:H.has(n.id),title:"Retry",children:[e.jsx($e,{size:14})," Retry"]}),n.state==="terminated"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"active"),disabled:H.has(n.id),title:"Start",children:[e.jsx($e,{size:14})," Start"]}),e.jsx("button",{className:"btn btn--sm agent-card-details-btn",onClick:()=>_(n.id),title:`View details for ${n.name}`,"aria-label":`View details for ${n.name}`,children:"View Details"}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void Me(n.id,n.name),title:"Delete",children:[e.jsx(Qt,{size:14})," Delete"]})]})]},n.id)})})]}),E&&e.jsx(a.Suspense,{fallback:null,children:e.jsx(Gn,{agentId:E,projectId:l,onClose:B,addToast:s,onChildClick:G})})]})}export{ta as AgentsView};
522
+ Agent instructions go here...`,value:u,onChange:i=>{m("paste"),b([]),p(i.target.value),F(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",r]}),se&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(Ue,{size:14}),se]})]}),c==="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(Xe,{size:14}),e.jsxs("span",{children:[T.length," agent",T.length!==1?"s":""," found"]})]}),T.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(T.map(i=>i.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v([]),children:"Clear agents"})]}),T.length>0?e.jsx("div",{className:"agent-import-agent-list",children:T.map((i,x)=>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:A.includes(i.name),onChange:()=>Me(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?"...":""]})]})]},x))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),S.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(Xe,{size:14}),e.jsxs("span",{children:[S.length," skill",S.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>_(S.map(i=>i.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>_([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:S.map((i,x)=>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:E.includes(i.name),onChange:()=>Ie(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}-${x}`))})]}),J&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(Ue,{size:14}),J]})]}),c==="result"&&h&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(De,{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:h.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[h.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[h.created.length," created"]})}),h.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[h.skipped.length," skipped (already exist)"]})}),h.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[h.errors.length," error",h.errors.length!==1?"s":""]})})]}),h.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:h.created.map((i,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(De,{size:12}),e.jsx("span",{children:i.name})]},x))}),h.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:h.errors.map((i,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(st,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},x))}),h.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:[h.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[h.skills.imported.length," skill",h.skills.imported.length!==1?"s":""," imported"]})}),h.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[h.skills.skipped.length," skill",h.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),h.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[h.skills.errors.length," skill",h.skills.errors.length!==1?"s":""," error",h.skills.errors.length!==1?"s":""]})}),h.skills.imported.length===0&&h.skills.skipped.length===0&&h.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"})})]}),h.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:h.skills.imported.map((i,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(De,{size:12}),e.jsx("span",{children:i.name})]},x))}),h.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:h.skills.errors.map((i,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(st,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},x))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[c==="preview"&&e.jsx("button",{className:"btn",onClick:()=>o("input"),disabled:Q,children:"Back"}),e.jsx("button",{className:"btn",onClick:H,disabled:Q,children:c==="result"?"Close":"Cancel"}),c==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void re(),disabled:P||(r==="directory"?f.length===0:r==="browse"?!L:!u.trim()),children:P?e.jsxs(e.Fragment,{children:[e.jsx(We,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),c==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void ye(),disabled:Q||O===0&&z===0,children:Q?e.jsxs(e.Fragment,{children:[e.jsx(We,{size:14,className:"spin"}),le]}):`Import ${Ne}`})]})]})}):null}const Gn=a.lazy(()=>nn(()=>import("./AgentDetailView-B1zViykq.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(s=>({default:s.AgentDetailView}))),ze=[{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:"✦"}],Qe=[.1,.25,.5,1,2,3,5,10];function He(s){switch(s){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"terminated":return"agent-badge--terminated";case"idle":default:return"agent-badge--idle"}}function qe(s,l){switch(l){case"running":return`${s}--running`;case"active":return`${s}--active`;case"paused":return`${s}--paused`;case"error":return`${s}--error`;case"terminated":return`${s}--terminated`;case"idle":default:return`${s}--idle`}}function vt({node:s,onSelect:l,onToggle:y,isExpanded:g,getChildCount:c,getHealthStatus:o,getRoleIcon:r,getSkillBadges:m}){const{agent:u,children:p,depth:f}=s,b=c(u.id),w=g(u.id),C=o(u),T=He(u.state),M=qe("agent-tree__node",u.state);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`${M}${u.reportsTo?" agent-is-child":""} agent-tree__indent--${Math.min(f,4)}`,children:[e.jsx("button",{className:`agent-tree__toggle${b===0?" agent-tree__toggle--leaf":""}`,onClick:()=>b>0&&y(u.id),title:b>0?w?"Collapse":"Expand":"No employees","aria-label":b>0?w?"Collapse":"Expand":"No employees",children:b>0?w?e.jsx(Jt,{size:16}):e.jsx(ht,{size:16}):e.jsx(et,{size:14})}),e.jsxs("div",{className:"agent-tree__content",onClick:()=>l(u.id),role:"button",tabIndex:0,onKeyDown:S=>S.key==="Enter"&&l(u.id),children:[e.jsx("span",{className:"agent-tree__icon",children:r(u.role)}),e.jsx("span",{className:"agent-tree__name",children:u.name}),e.jsx("span",{className:`agent-tree__badge ${T}`,children:u.state}),e.jsx("span",{className:"agent-tree__health",style:{color:C.color},title:C.label,children:C.icon}),b>0&&e.jsxs("span",{className:"agent-tree__count text-secondary",children:["(",b,")"]}),(()=>{const S=m(u);return S.length===0?null:e.jsxs("span",{className:"agent-tree__skill",title:S.join(", "),children:[S[0],S.length>1&&` +${S.length-1}`]})})()]})]}),w&&p.length>0&&e.jsx("div",{className:"agent-tree__children",children:p.map(S=>e.jsx(vt,{node:S,onSelect:l,onToggle:y,isExpanded:g,getChildCount:c,getHealthStatus:o,getRoleIcon:r,getSkillBadges:m},S.agent.id))})]})}function xt({node:s,onSelect:l,getHealthStatus:y,getRoleIcon:g,getSkillBadges:c}){const{agent:o,children:r}=s,m=y(o),u=He(o.state),p=qe("org-chart-node-card",o.state);return e.jsxs("div",{className:`org-chart-node${r.length>0?" org-chart-node--has-children":""}`,children:[e.jsxs("div",{className:p,onClick:()=>l(o.id),role:"button",tabIndex:0,onKeyDown:f=>f.key==="Enter"&&l(o.id),children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:g(o.role)}),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 ${u}`,children:o.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:m.color},title:m.label,children:[m.icon,!m.stateDerived&&e.jsx("span",{className:"text-secondary",children:m.label})]}),(()=>{const f=c(o);if(f.length===0)return null;const b=f.slice(0,2),w=f.length-2;return e.jsxs(e.Fragment,{children:[b.map(C=>e.jsx("span",{className:"org-chart-node__skill",children:C},C)),w>0&&e.jsxs("span",{className:"org-chart-node__skill",children:["+",w]})]})})()]})]}),r.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${o.name} employees`,children:r.map(f=>e.jsx(xt,{node:f,onSelect:l,getHealthStatus:y,getRoleIcon:g,getSkillBadges:c},f.agent.id))})]})}function ta({addToast:s,projectId:l,onOpenTaskLogs:y,agentOnboardingEnabled:g=!1}){const[c,o]=a.useState(!1),[r,m]=a.useState("all"),{agents:u,stats:p,isLoading:f,loadAgents:b}=zt(l,{filterState:r,showSystemAgents:c}),[w,C]=a.useState(!1),[T,M]=a.useState(!1),[S,j]=a.useState(null),[A,v]=a.useState(!1),[E,_]=a.useState(null),[P,D]=a.useState(()=>{if(typeof window>"u")return"list";const n=Ze("fn-agent-view",l);return n==="list"||n==="board"||n==="tree"||n==="org"?n:"list"}),[Q,q]=a.useState([]),[se,F]=a.useState(!1),[h,I]=a.useState(!1),J=a.useRef(null),{confirm:V}=Dt(),X=a.useRef(null),ie=a.useId();a.useEffect(()=>{const n=Ze("fn-agent-view",l);if(n==="list"||n==="board"||n==="tree"||n==="org"){D(n);return}D("list")},[l]),a.useEffect(()=>{gt("fn-agent-view",P,l)},[P,l]);const[ve,W]=a.useState(null),ne=a.useRef(null),[ke,L]=a.useState(null),[oe,U]=a.useState(null),[ce,ae]=a.useState({}),[K,ue]=a.useState(1),[me,ge]=a.useState(!1),[H,xe]=a.useState(new Set),[Z,he]=a.useState(new Map),re=a.useRef(!0);a.useEffect(()=>(re.current=!0,()=>{re.current=!1}),[]),a.useEffect(()=>{Ot(l).then(n=>{re.current&&ue(n.heartbeatMultiplier??1)}).catch(()=>{})},[l]);const ye=a.useCallback(async n=>{const t=Number.isFinite(n)&&n>0?n:1;ue(t),ge(!0);try{await Ht({heartbeatMultiplier:t},l),s(`Heartbeat speed set to ×${t.toFixed(1)}`,"success")}catch(d){s(`Failed to save heartbeat multiplier: ${be(d)}`,"error")}finally{re.current&&ge(!1)}},[l,s]),O=a.useMemo(()=>Z.size===0?u:u.map(n=>{const t=Z.get(n.id);return t?{...n,state:t}:n}),[u,Z]),z=jn(O,l),de=a.useMemo(()=>O.filter(n=>c||!Ke(n)),[O,c]),we=a.useMemo(()=>O.filter(n=>n.state!=="active"&&n.state!=="running"?!1:c||!Ke(n)),[O,c]),Ne=a.useMemo(()=>{if(c)return Q;const n=t=>Ke(t.agent)?null:{...t,children:t.children.map(n).filter(d=>d!==null)};return Q.map(n).filter(t=>t!==null)},[Q,c]);a.useEffect(()=>{if(P!=="org")return;let n=!1;return F(!0),qt(l,{includeEphemeral:c}).then(t=>{n||q(t)}).catch(t=>{n||(s(`Failed to load org chart: ${be(t)}`,"error"),q([]))}).finally(()=>{n||F(!1)}),()=>{n=!0}},[P,l,c,s]),a.useEffect(()=>{const n=setInterval(()=>{b()},3e4);return()=>{clearInterval(n)}},[b]),a.useEffect(()=>{if(!h)return;const n=d=>{const k=d.target;k&&(J.current?.contains(k)||X.current?.contains(k)||I(!1))},t=d=>{d.key==="Escape"&&(I(!1),X.current?.focus())};return document.addEventListener("mousedown",n),document.addEventListener("touchstart",n),document.addEventListener("keydown",t),()=>{document.removeEventListener("mousedown",n),document.removeEventListener("touchstart",n),document.removeEventListener("keydown",t)}},[h]);const le=async(n,t)=>{if(!H.has(n)){xe(d=>new Set(d).add(n)),he(d=>{const k=new Map(d);return k.set(n,t),k});try{await Yt(n,t,l),s(`Agent state updated to ${t}`,"success"),await b(),he(d=>{const k=new Map(d);return k.delete(n),k})}catch(d){he(k=>{const $=new Map(k);return $.delete(n),$}),s(`Failed to update state: ${be(d)}`,"error")}finally{xe(d=>{const k=new Set(d);return k.delete(n),k})}}},Me=async(n,t)=>{if(await V({title:"Delete Agent",message:`Delete agent "${t}"? This cannot be undone.`,danger:!0}))try{await tn(n,l),s(`Agent "${t}" deleted`,"success"),b()}catch(k){s(`Failed to delete agent: ${be(k)}`,"error")}},Ie=async(n,t)=>{const d=u.find(k=>k.id===n);if(d){if(d.role===t){W(null);return}try{await Fe(n,{role:t},l),s(`Agent role updated to ${ze.find(k=>k.value===t)?.label??t}`,"success"),W(null),b()}catch(k){s(`Failed to update role: ${be(k)}`,"error")}}},i=(n,t)=>{n.key==="Escape"&&W(null)},x=async(n,t)=>{oe===n.id&&(U(null),ae(d=>{const k={...d};return delete k[n.id],k})),L(n.id);try{await Fe(n.id,{runtimeConfig:{...n.runtimeConfig??{},heartbeatIntervalMs:t}},l),s(`Heartbeat interval updated to ${rt(t)} for ${n.name}`,"success"),b()}catch(d){s(`Failed to update heartbeat interval: ${be(d)}`,"error")}finally{L(null)}},R=async n=>{const t=ce[n.id]??"";if(t.trim()===""){s("Please enter a heartbeat interval in minutes","error");return}const d=Number(t);if(isNaN(d)){s("Heartbeat interval must be a valid number","error");return}if(d<=0){s("Heartbeat interval must be greater than 0","error");return}if(d>=1&&d<5){L(n.id);try{await Fe(n.id,{runtimeConfig:{...n.runtimeConfig??{},heartbeatIntervalMs:Zt}},l),s(`Heartbeat interval set to 5 minutes (minimum). ${d} minute${d!==1?"s":""} was below the 5-minute minimum.`,"success"),U(null),ae($=>{const ee={...$};return delete ee[n.id],ee}),b()}catch($){s(`Failed to update heartbeat interval: ${be($)}`,"error")}finally{L(null)}return}const k=Math.round(d*6e4);L(n.id);try{await Fe(n.id,{runtimeConfig:{...n.runtimeConfig??{},heartbeatIntervalMs:k}},l),s(`Heartbeat interval updated to ${rt(k)} for ${n.name}`,"success"),U(null),ae($=>{const ee={...$};return delete ee[n.id],ee}),b()}catch($){s(`Failed to update heartbeat interval: ${be($)}`,"error")}finally{L(null)}},Y=n=>{const t=Je(n.runtimeConfig?.heartbeatIntervalMs),d=Math.round(t/6e4);U(n.id),ae(k=>({...k,[n.id]:String(d)}))},B=a.useCallback(()=>{_(null)},[]),G=a.useCallback(n=>{_(n)},[]),Pe=async(n,t)=>{try{await en(n,l,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),s(`Heartbeat run started for ${t}`,"success"),b()}catch(d){s(`Failed to start heartbeat run: ${be(d)}`,"error")}},pe=n=>ze.find(t=>t.value===n)?.label??n,Se=n=>ze.find(t=>t.value===n)?.icon??"◆",Ae=n=>Array.isArray(n.metadata?.skills)?n.metadata.skills:[],fe=n=>Xt(n),Re=f&&u.length===0,je=a.useCallback(()=>{if(g){M(!0);return}C(!0)},[g]);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(et,{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${P==="list"?" active":""}`,onClick:()=>D("list"),title:"List view","aria-label":"List view","aria-pressed":P==="list",children:e.jsx(Vt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="board"?" active":""}`,onClick:()=>D("board"),title:"Board view","aria-label":"Board view","aria-pressed":P==="board",children:e.jsx(Te,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="tree"?" active":""}`,onClick:()=>D("tree"),title:"Tree view","aria-label":"Tree view","aria-pressed":P==="tree",children:e.jsx(Wt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="org"?" active":""}`,onClick:()=>D("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":P==="org",children:e.jsx(dn,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:X,className:`btn-icon agent-controls-trigger${h?" agent-controls-trigger--active":""}`,onClick:()=>I(n=>!n),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":h,"aria-controls":ie,children:e.jsx(mn,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void b(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Oe,{size:16,className:f?"spin":void 0})}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{je(),I(!1)},children:[e.jsx(Ut,{size:16}),"New Agent"]})]})]})]}),h&&e.jsxs("div",{ref:J,id:ie,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsxs("div",{className:"agent-controls",children:[e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(Kt,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:r,onChange:n=>m(n.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.jsx("option",{value:"terminated",children:"Terminated"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:c,onChange:n=>o(n.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]}),e.jsx("div",{className:"agent-controls-actions",children:e.jsxs("button",{className:"btn",onClick:()=>{v(!0),I(!1)},children:[e.jsx(pt,{size:16}),"Import"]})})]}),e.jsx("div",{className:"agent-global-controls",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:K,onChange:n=>{const t=Number(n.target.value);ye(Number.isFinite(t)&&t>0?t:1)},disabled:me}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",K.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(Qe.reduce((n,t)=>Math.abs(t-K)<Math.abs(n-K)?t:n,Qe[0])),onChange:n=>{const t=Number(n.target.value);ye(Number.isFinite(t)&&t>0?t:1)},disabled:me,"aria-label":"Heartbeat speed preset",children:Qe.map(n=>e.jsxs("option",{value:String(n),children:["×",n]},n))})]}),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(xn,{agents:de})]}),e.jsxs("div",{className:"agents-view-content",children:[e.jsx(vn,{stats:p}),e.jsx(fn,{agents:we,projectId:l,onAgentSelect:_,onOpenTaskLogs:y}),e.jsx(Wn,{isOpen:w,onClose:()=>{C(!1),j(null)},onCreated:()=>{C(!1),j(null),b()},projectId:l,prefillDraft:S}),e.jsx(Un,{isOpen:T,onClose:()=>M(!1),onUseDraft:n=>{j(n),M(!1),C(!0)},projectId:l,existingAgents:u}),e.jsx(Bn,{isOpen:A,onClose:()=>v(!1),onImported:()=>void b(),projectId:l}),Re?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Oe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):P==="tree"?e.jsx("div",{className:"agent-tree__view",children:de.length===0?e.jsx(Le,{onCtaClick:je}):z.rootNodes.map(n=>e.jsx(vt,{node:n,onSelect:_,onToggle:z.toggleExpand,isExpanded:z.isExpanded,getChildCount:t=>z.getChildren(t).length,getHealthStatus:fe,getRoleIcon:Se,getSkillBadges:Ae},n.agent.id))}):P==="org"?e.jsx("div",{className:"agent-org-chart","data-testid":"agent-org-chart",children:se?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Oe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):Ne.length===0?e.jsx(Le,{onCtaClick:je}):Ne.map(n=>e.jsx(xt,{node:n,onSelect:_,getHealthStatus:fe,getRoleIcon:Se,getSkillBadges:Ae},n.agent.id))}):P==="board"?e.jsx("div",{className:"agent-board",children:de.length===0?e.jsx(Le,{onCtaClick:je}):de.map(n=>{const t=fe(n),d=He(n.state),k=qe("agent-board-card",n.state);return e.jsx("div",{className:`agent-board-card ${k}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>_(n.id),role:"button",tabIndex:0,onKeyDown:$=>$.key==="Enter"&&_(n.id),children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:Se(n.role)}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:pe(n.role)}),e.jsx("span",{className:`agent-board-badge badge ${d}`,children:n.state})]}),e.jsx("div",{className:"agent-board-name",children:n.name}),e.jsx("div",{className:"agent-board-id",children:n.id}),e.jsxs("div",{className:"agent-board-health",style:{color:t.color},title:t.label,children:[t.icon,!t.stateDerived&&` ${t.label}`]})]})},n.id)})}):e.jsx("div",{className:"agent-list",children:de.length===0?e.jsx(Le,{onCtaClick:je}):de.map(n=>{const t=fe(n),d=He(n.state),k=qe("agent-card",n.state),$=Je(n.runtimeConfig?.heartbeatIntervalMs),ee=Bt($),_e=ke===n.id;return e.jsxs("div",{className:`agent-card ${k}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info agent-info--clickable",onClick:()=>_(n.id),role:"button",tabIndex:0,onKeyDown:N=>N.key==="Enter"&&_(n.id),children:[ve===n.id?e.jsx("select",{ref:ne,className:"select agent-role-select",value:n.role,onChange:N=>void Ie(n.id,N.target.value),onKeyDown:N=>i(N,n.id),onBlur:()=>W(null),autoFocus:!0,children:ze.map(N=>e.jsxs("option",{value:N.value,children:[N.icon," ",N.label]},N.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:N=>{N.stopPropagation(),W(n.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.stopPropagation(),W(n.id))},children:Se(n.role)}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:n.name}),e.jsx("span",{className:"agent-id text-secondary",children:n.id})]}),e.jsx(ht,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${d}`,children:n.state}),e.jsxs("span",{className:"badge",style:{color:t.color},title:t.label,children:[t.icon,!t.stateDerived&&` ${t.label}`]}),e.jsx("span",{className:"badge text-secondary",children:pe(n.role)}),(()=>{const N=Ae(n);if(N.length===0)return null;const te=N.slice(0,2),Ce=N.length-2;return e.jsxs(e.Fragment,{children:[te.map(tt=>e.jsx("span",{className:"badge badge-skill",children:tt},tt)),Ce>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",Ce]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[n.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:n.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),oe===n.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:ce[n.id]??"",onChange:N=>ae(te=>({...te,[n.id]:N.target.value})),onKeyDown:N=>{N.key==="Enter"?R(n):N.key==="Escape"&&(U(null),ae(te=>{const Ce={...te};return delete Ce[n.id],Ce}))},disabled:_e,"aria-label":`Custom heartbeat interval in minutes for ${n.name}`}),e.jsx("span",{className:"text-secondary",children:"min"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>void R(n),disabled:_e,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>{U(null),ae(N=>{const te={...N};return delete te[n.id],te})},disabled:_e,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:$,onChange:N=>{const te=N.target.value;te==="__custom__"?Y(n):x(n,Number(te))},disabled:_e,"aria-label":`Set heartbeat interval for ${n.name}`,children:[ee.map(N=>e.jsx("option",{value:N.value,children:N.label},N.value)),Gt.some(N=>N.value===$)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),_e&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),n.lastHeartbeatAt&&(()=>{const N=new Date(n.lastHeartbeatAt),te=new Date(N.getTime()+$),Ce=n.state==="active"||n.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:N.toLocaleString(),children:["Last: ",N.toLocaleTimeString()]}),Ce&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:te.toLocaleString(),children:["Next: ",te.toLocaleTimeString()]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[n.state==="idle"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"active"),disabled:H.has(n.id),title:"Activate",children:[e.jsx($e,{size:14})," Start"]}),n.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void Pe(n.id,n.name),disabled:H.has(n.id),title:"Run Now","aria-label":`Run now for ${n.name}`,children:[e.jsx(Te,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"paused"),disabled:H.has(n.id),title:"Pause",children:[e.jsx(it,{size:14})," Pause"]})]}),n.state==="paused"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"active"),disabled:H.has(n.id),title:"Resume",children:[e.jsx($e,{size:14})," Resume"]}),n.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",disabled:!0,title:"Run in progress","aria-label":`Heartbeat run in progress for ${n.name}`,children:[e.jsx(Te,{size:14})," Running"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"paused"),disabled:H.has(n.id),title:"Pause",children:[e.jsx(it,{size:14})," Pause"]})]}),n.state==="error"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"active"),disabled:H.has(n.id),title:"Retry",children:[e.jsx($e,{size:14})," Retry"]}),n.state==="terminated"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void le(n.id,"active"),disabled:H.has(n.id),title:"Start",children:[e.jsx($e,{size:14})," Start"]}),e.jsx("button",{className:"btn btn--sm agent-card-details-btn",onClick:()=>_(n.id),title:`View details for ${n.name}`,"aria-label":`View details for ${n.name}`,children:"View Details"}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void Me(n.id,n.name),title:"Delete",children:[e.jsx(Qt,{size:14})," Delete"]})]})]},n.id)})})]}),E&&e.jsx(a.Suspense,{fallback:null,children:e.jsx(Gn,{agentId:E,projectId:l,onClose:B,addToast:s,onChildClick:G})})]})}export{ta as AgentsView};
@@ -1 +1 @@
1
- import{r as s,j as t}from"./vendor-react-K0fH_qHe.js";import{i as Be,aL as Et,g as Ft,aM as Lt,a as _t,aN as It,aO as Ot,aP as Ut,aQ as zt,aR as Ht,aS as Vt,s as Bt,aT as qt,aU as Gt,aV as Wt,aW as Kt,ab as ot,ac as ct,S as Jt,V as et,J as tt,ao as Yt,aX as Qt,B as Ee,a8 as dt,a9 as ut,aY as Xt,aZ as Zt,a_ as es,a$ as ts,b0 as ss,b1 as ns,b2 as st,b3 as as,h as is,u as nt,k as rs}from"./index-DoQ5ALYY.js";import"./vendor-xterm-DzcZoU0P.js";const Ve="kb-chat-active-session";function ls(a){const i=a?.toolCalls;if(!Array.isArray(i))return;const r=i.map(l=>{if(!l||typeof l!="object")return null;const c=l,N=typeof c.toolName=="string"?c.toolName:"";if(!N)return null;const y=c.args;return{toolName:N,...y&&typeof y=="object"?{args:y}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(l=>l!==null);return r.length>0?r:void 0}function at(a){return{id:a.id,sessionId:a.sessionId,role:a.role,content:a.content,thinkingOutput:a.thinkingOutput,toolCalls:ls(a.metadata),attachments:a.attachments,createdAt:a.createdAt}}function os(a){const[i,r]=s.useState([]),[l,c]=s.useState(null),[N,y]=s.useState(!0),[R,S]=s.useState([]),[P,I]=s.useState(!1),[x,F]=s.useState(!1),[T,$]=s.useState(""),[g,v]=s.useState(""),[C,j]=s.useState([]),[B,E]=s.useState(""),[X,W]=s.useState(""),[L,Y]=s.useState(!0),[h,M]=s.useState(new Map),w=s.useRef(null),_=s.useRef(!1),z=s.useRef(""),se=s.useRef(null),he=s.useRef(i),xe=s.useRef(l),ve=s.useRef(x);he.current=i,xe.current=l,ve.current=x,s.useEffect(()=>{z.current=B},[B]);const we=s.useRef(new Set),me=s.useRef(0),ke=s.useRef(a);ke.current!==a&&(ke.current=a,me.current++),s.useEffect(()=>{const d=me.current;Be(void 0,a).then(m=>{if(me.current!==d)return;const p=new Map;for(const b of m)p.set(b.id,b);M(p)}).catch(()=>{})},[a]);const K=s.useCallback(async()=>{y(!0);try{const m=[...(await Et(a)).sessions].sort((p,b)=>new Date(b.updatedAt).getTime()-new Date(p.updatedAt).getTime());r(m)}catch{}finally{y(!1)}},[a]);s.useEffect(()=>{K()},[K]);const ne=s.useRef(()=>{});s.useEffect(()=>{if(N)return;const d=Ft(Ve,a);d&&i.find(p=>p.id===d)&&ne.current(d)},[N,i,a]);const oe=s.useCallback(async(d,m)=>{I(!0);try{const p=await Lt(d,{limit:50,...m},a),b=p.messages.map(at);m?.offset&&m.offset>0?S(q=>[...b,...q]):S(b),Y(p.messages.length>=50)}catch{}finally{I(!1)}},[a]),ae=s.useCallback(()=>{se.current?.(),se.current=null,z.current="",E(""),$(""),v(""),j([]),F(!1)},[]),ie=s.useCallback((d,m)=>{w.current&&(w.current.close(),w.current=null);const p=m??i.find(b=>b.id===d);c(p||null),ae(),Y(!0),d?oe(d):S([]),d?_t(Ve,d,a):It(Ve,a)},[i,oe,a,ae]);ne.current=ie;const fe=s.useCallback(async d=>{const m=await Ot(d,a);w.current&&(w.current.close(),w.current=null);const p={id:m.session.id,title:m.session.title,agentId:m.session.agentId,status:m.session.status,modelProvider:m.session.modelProvider,modelId:m.session.modelId,createdAt:m.session.createdAt,updatedAt:m.session.updatedAt};return r(b=>b.some(q=>q.id===p.id)?b:[p,...b]),ae(),ie(p.id,p),S([]),p},[a,ae,ie]),Se=s.useCallback(async d=>{await Ut(d,{status:"archived"},a),r(m=>m.filter(p=>p.id!==d)),l?.id===d&&(c(null),S([]))},[l,a]),ce=s.useCallback(async d=>{l?.id===d&&w.current&&(w.current.close(),w.current=null),await zt(d,a),r(m=>m.filter(p=>p.id!==d)),l?.id===d&&(c(null),S([]))},[l,a]),Z=s.useCallback(async()=>{!l||!L||await oe(l.id,{offset:R.length})},[l,L,oe,R.length]),de=s.useCallback(()=>{l&&(_.current=!0,se.current?.(),se.current=null,w.current?.close(),w.current=null,Ht(l.id,a).catch(()=>{}),F(!1),$(""),v(""),j([]))},[l,a]),ye=s.useCallback(()=>{z.current="",E("")},[]),ue=s.useCallback((d,m)=>{if(!l)return;if(x){z.current=d,E(d);return}_.current=!1,w.current&&(w.current.close(),w.current=null);const p=`temp-${Date.now()}`,b={id:p,sessionId:l.id,role:"user",content:d,createdAt:new Date().toISOString()};S(f=>[...f,b]),$(""),v(""),j([]),F(!0);let q="",ge="",O=[],H=null,re=null;const G=()=>{H=null,$(q)},u=()=>{re=null,v(ge)},A=()=>{H!==null&&(cancelAnimationFrame(H),H=null),re!==null&&(cancelAnimationFrame(re),re=null)};se.current=A;const V={onThinking:f=>{ge+=f,re===null&&(re=requestAnimationFrame(u))},onText:f=>{q+=f,H===null&&(H=requestAnimationFrame(G))},onToolStart:f=>{O=[...O,{toolName:f.toolName,args:f.args,isError:!1,status:"running"}],j(O)},onToolEnd:f=>{const D=[...O];for(let k=D.length-1;k>=0;k--){const ee=D[k];if(ee?.toolName===f.toolName&&ee.status==="running"){D[k]={...ee,status:"completed",isError:f.isError,result:f.result},O=D,j(D);return}}O=[...D,{toolName:f.toolName,isError:f.isError,result:f.result,status:"completed"}],j(O)},onDone:f=>{A();const D={id:f.messageId||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:q,thinkingOutput:ge,toolCalls:O.length>0?O:void 0,createdAt:new Date().toISOString()};we.current.add(D.id),S(ee=>[...ee,D]),$(""),v(""),j([]),F(!1),w.current=null,setTimeout(()=>{we.current.delete(D.id)},1e3),K();const k=z.current.trim();k&&(z.current="",E(""),ue(k))},onError:f=>{if(A(),S(D=>D.filter(k=>k.id!==p)),$(""),v(""),j([]),F(!1),w.current=null,console.error("[useChat] Stream error:",f),!_.current){const D=z.current.trim();D&&(z.current="",E(""),ue(D))}}};w.current=Vt(l.id,d,V,m,a)},[l,x,a,K]),je=X?i.filter(d=>d.title?.toLowerCase().includes(X.toLowerCase())||d.agentId.toLowerCase().includes(X.toLowerCase())):i;return s.useEffect(()=>{const d=me.current,m=a?`?projectId=${encodeURIComponent(a)}`:"",p=()=>me.current!==d,b=G=>{if(p())return;const u=JSON.parse(G.data);r(A=>A.some(V=>V.id===u.id)?A:[u,...A])},q=G=>{if(p())return;const u=JSON.parse(G.data);r(A=>[...A.map(f=>f.id===u.id?u:f)]),xe.current?.id===u.id&&c(u)},ge=G=>{if(p())return;const{id:u}=JSON.parse(G.data);r(A=>A.filter(V=>V.id!==u)),xe.current?.id===u&&(c(null),S([]))},O=G=>{if(p())return;const u=JSON.parse(G.data),A=at(u);we.current.has(A.id)||xe.current?.id===A.sessionId&&!ve.current&&S(V=>V.some(f=>f.id===A.id)?V:[...V,A])},H=G=>{if(p())return;const{id:u}=JSON.parse(G.data);S(A=>A.filter(V=>V.id!==u))};return Bt(`/api/events${m}`,{events:{"chat:session:created":b,"chat:session:updated":q,"chat:session:deleted":ge,"chat:message:added":O,"chat:message:deleted":H}})},[a]),s.useEffect(()=>()=>{w.current&&(w.current.close(),w.current=null)},[]),{sessions:i,activeSession:l,sessionsLoading:N,messages:R,messagesLoading:P,isStreaming:x,streamingText:T,streamingThinking:g,streamingToolCalls:C,pendingMessage:B,selectSession:ie,createSession:fe,archiveSession:Se,deleteSession:ce,sendMessage:ue,stopStreaming:de,clearPendingMessage:ye,loadMoreMessages:Z,hasMoreMessages:L,searchQuery:X,setSearchQuery:W,filteredSessions:je,refreshSessions:K,agentsMap:h}}function ht(a){const i=new Date(a),l=new Date().getTime()-i.getTime(),c=Math.floor(l/1e3),N=Math.floor(c/60),y=Math.floor(N/60),R=Math.floor(y/24);return c<60?"just now":N<60?`${N}m ago`:y<24?`${y}h ago`:R<7?`${R}d ago`:i.toLocaleDateString()}function it(a,i){if(!a||!i)return null;const r=i.toLowerCase();if(r.includes("claude")){let c=i.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return c=c.replace(/\s+/g," "),c.length>30?c.slice(0,30)+"…":c}if(r.includes("gpt")||r.includes("openai")){const c=i.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return c.length>30?c.slice(0,30)+"…":c}if(r.includes("gemini")){const c=i.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return c.length>30?c.slice(0,30)+"…":c}const l=i.replace(/-/g," ").replace(/^\w/,c=>c.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function De(a,i){return a.length<=i?a:`${a.slice(0,i)}…`}function cs(a){if(!a)return null;const i=Object.entries(a);return i.length===0?null:i.map(([r,l])=>{const c=typeof l=="string"?l:(()=>{try{return JSON.stringify(l)}catch{return String(l)}})();return`${r}=${De(c,50)}`}).join(", ")}function ds(a){if(a===void 0)return null;if(typeof a=="string")return De(a,200);try{return De(JSON.stringify(a),200)}catch{return De(String(a),200)}}function mt(a){if(!a||a.length===0)return null;const i=(x,F)=>{const T=x.status==="running",$=x.status==="completed"&&x.isError,g=cs(x.args),v=ds(x.result),C=T?g:v?`result: ${v}`:g?`args: ${g}`:null,j=T?"running":$?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${T?" chat-tool-call--running":""}${$?" chat-tool-call--error":""}`,open:T,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",children:x.toolName}),C&&t.jsx("span",{className:"chat-tool-call-preview",title:C,children:C}),t.jsx("span",{className:"chat-tool-call-status-text",children:j})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[g&&t.jsxs("div",{className:"chat-tool-call-row",children:[t.jsx("span",{className:"chat-tool-call-label",children:"args"}),t.jsx("span",{className:"chat-tool-call-value",children:g})]}),v&&t.jsxs("div",{className:`chat-tool-call-row${$?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:"result"}),t.jsx("span",{className:"chat-tool-call-value",children:v})]})]})]},`${x.toolName}-${F}`)},r="chat-tool-calls";if(a.length===1)return t.jsxs("div",{className:r,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(st,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),i(a[0],0)]});const l=a.filter(x=>x.status==="running").length,c=a.filter(x=>x.status==="completed"&&x.isError).length,N=l>0,y=Array.from(new Set(a.map(x=>x.toolName))),R=y.slice(0,5),S=Math.max(0,y.length-R.length),P=S>0?`${R.join(", ")}, +${S} more`:R.join(", "),I=N?`(${l} running)`:c>0?`(${c} ${c===1?"error":"errors"})`:null;return t.jsx("div",{className:r,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:N,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(st,{size:12,"aria-hidden":"true"}),t.jsxs("span",{children:[a.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:P,children:P}),I&&t.jsx("span",{className:"chat-tool-calls-group-status",children:I})]}),a.map((x,F)=>i(x,F))]})})}const ft={pre:({children:a,...i})=>t.jsx("pre",{...i,className:"chat-markdown-pre",children:a}),table:({children:a,...i})=>t.jsx("table",{...i,className:"chat-markdown-table",children:a})},Pe="__fn_agent__",us=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function rt(a){const i=/(^|[\s])\/([^\s]*)$/.exec(a);if(!i)return null;const r=i[1]??"",l=i[2]??"",c=i.index+r.length;return{filter:l,start:c,end:a.length}}function hs(a,i){const r=a.slice(0,i),l=/(^|[\s\n])@([\w-]*)$/.exec(r);if(!l)return null;const c=l[2]??"",N=r.length-c.length-1;return{filter:c,start:N,end:i}}function ms({projectId:a,onClose:i,onCreate:r}){const[l,c]=s.useState("agent"),[N,y]=s.useState([]),[R,S]=s.useState(!0),[P,I]=s.useState(""),[x,F]=s.useState([]),[T,$]=s.useState(!0),[g,v]=s.useState(""),[C,j]=s.useState([]),[B,E]=s.useState([]);s.useEffect(()=>{let h=!1;return S(!0),Be(void 0,a).then(M=>{h||y(M)}).catch(()=>{h||y([])}).finally(()=>{h||S(!1)}),()=>{h=!0}},[a]),s.useEffect(()=>{$(!0),is().then(h=>{F(h.models),j(h.favoriteProviders),E(h.favoriteModels)}).catch(()=>{F([]),j([]),E([])}).finally(()=>{$(!1)})},[]);const X=s.useCallback(async h=>{const M=C,_=M.includes(h)?M.filter(z=>z!==h):[h,...M];j(_);try{await nt({favoriteProviders:_,favoriteModels:B})}catch{j(M)}},[C,B]),W=s.useCallback(async h=>{const M=B,_=M.includes(h)?M.filter(z=>z!==h):[h,...M];E(_);try{await nt({favoriteProviders:C,favoriteModels:_})}catch{E(M)}},[B,C]),L=h=>{if(h.preventDefault(),l==="agent"){if(!P)return;r({agentId:P});return}if(!g)return;const M=g.indexOf("/");if(M<=0)return;const w=g.slice(0,M),_=g.slice(M+1);r({agentId:Pe,modelProvider:w,modelId:_})},Y=l==="agent"?!P:!g;return t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:i,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog",onClick:h=>h.stopPropagation(),children:[t.jsx("h3",{children:"New Chat"}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{c("agent"),v("")},children:"Agent"}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{c("model"),I("")},children:"Model"})]}),t.jsxs("form",{onSubmit:L,children:[l==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",R?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):N.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:N.map(h=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${P===h.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>I(h.id),"data-testid":`agent-option-${h.id}`,children:[t.jsx(Ee,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:h.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:h.role})]},h.id))})]}),l==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:T?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(rs,{models:x,value:g,onChange:v,label:"Model",placeholder:"Select a model",favoriteProviders:C,onToggleFavorite:X,favoriteModels:B,onToggleModelFavorite:W})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:i,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:Y,children:"Create"})]})]})]})})}const lt=s.memo(function({message:i,forcePlain:r,agentName:l,showAssistantModelTag:c,activeModelTag:N,activeSessionId:y,mentionAgentsByName:R,onToggleRender:S}){const P=i.role==="assistant",I=s.useMemo(()=>{if(P)return null;const T=i.content,$=/@([\w-]+)/g,g=[];let v=0,C=$.exec(T);for(;C;){const[j,B=""]=C,E=C.index;E>v&&g.push(T.slice(v,E));const X=B.replace(/_/g," ").toLowerCase(),W=R.get(X);W?g.push(t.jsxs("span",{className:"chat-mention-chip",children:["@",W.name.replace(/\s+/g,"_")]},`${W.id}-${E}`)):g.push(j),v=E+j.length,C=$.exec(T)}return v<T.length&&g.push(T.slice(v)),g.length===0?T:g},[P,i.content,R]),x=s.useMemo(()=>{const T=i.attachments;if(!T||T.length===0||!y)return null;const $=`/api/chat/sessions/${encodeURIComponent(y)}/attachments/`;return t.jsx("div",{className:"chat-message-attachments",children:T.map(g=>{const v=g.mimeType.startsWith("image/"),C=g.id||g.filename,j=`${$}${encodeURIComponent(g.filename)}`;return v?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:j,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:j,alt:g.originalName})},C):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:j,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(ns,{size:14}),t.jsx("span",{children:g.originalName})]},C)})})},[i.attachments,y]),F=s.useMemo(()=>P?r?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:i.content}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(ot,{remarkPlugins:[ct],components:ft,children:i.content})}):null,[P,r,i.content]);return t.jsxs("div",{className:`chat-message chat-message--${i.role}`,"data-testid":`chat-message-${i.id}`,children:[P&&t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ee,{size:14}),t.jsx("span",{children:l}),c&&N&&t.jsx("span",{className:"chat-model-tag",children:N}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${r?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":r?"Show rendered markdown":"Show plain text",onClick:()=>S(i.id),children:r?t.jsx(dt,{size:14}):t.jsx(ut,{size:14})})]}),P?F:t.jsx("div",{className:"chat-message-content",children:I}),mt(i.toolCalls),i.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:i.thinkingOutput})]}),x,t.jsx("div",{className:"chat-message-time",children:ht(i.createdAt)})]})});function ws({projectId:a,addToast:i}){const{activeSession:r,sessionsLoading:l,messages:c,messagesLoading:N,isStreaming:y,streamingText:R,streamingThinking:S,streamingToolCalls:P,selectSession:I,createSession:x,archiveSession:F,deleteSession:T,sendMessage:$,stopStreaming:g,pendingMessage:v,clearPendingMessage:C,searchQuery:j,setSearchQuery:B,filteredSessions:E}=os(a),[X,W]=s.useState(!1),[L,Y]=s.useState(""),[h,M]=s.useState(null),[w,_]=s.useState(null),[z,se]=s.useState(!0),[he,xe]=s.useState(new Map),[ve,we]=s.useState([]),[me,ke]=s.useState(!0),[K,ne]=s.useState(!1),[oe,ae]=s.useState(""),[ie,fe]=s.useState(0),[Se,ce]=s.useState(""),[Z,de]=s.useState(!1),[ye,ue]=s.useState(0),[je,d]=s.useState(-1),[m,p]=s.useState(()=>new Set),[b,q]=s.useState([]),[ge,O]=s.useState(!1),[,H]=s.useState(!1),[re,G]=s.useState({top:0,left:0}),u=qt({projectId:a}),A=s.useCallback(e=>{if(!e||!u.mentionActive)return;const n=e.getBoundingClientRect();G({top:n.top-260,left:n.left+8})},[u.mentionActive]),V=s.useRef(null),f=s.useRef(null),D=s.useRef(null),k=s.useRef(null),ee=s.useRef(!1),Me=s.useRef(!1),qe=s.useRef(null),Ge=s.useRef([]),Ne=s.useRef(0),le=Gt()==="mobile",{keyboardOverlap:Fe,viewportHeight:We,viewportOffsetTop:gt,keyboardOpen:Le}=Wt({enabled:le&&!!r}),pt=Le?{"--keyboard-overlap":`${Fe}px`,"--vv-offset-top":`${gt}px`,...We!==null?{"--vv-height":`${We}px`}:{}}:{},Q=s.useMemo(()=>{const e=oe.trim().toLowerCase();return(e?ve.filter(o=>o.name.toLowerCase().includes(e)):ve).slice(0,10)},[ve,oe]),be=s.useMemo(()=>Array.from(he.values()),[he]),pe=s.useMemo(()=>{const e=Se.trim().toLowerCase();return e?be.filter(n=>n.name.toLowerCase().includes(e)):be},[be,Se]),Ke=s.useMemo(()=>{const e=new Map;for(const n of be)e.set(n.name.toLowerCase(),n);return e},[be]);s.useEffect(()=>{fe(0)},[Q]),s.useEffect(()=>{ue(0)},[Se,Z]),s.useEffect(()=>()=>{f.current!==null&&window.clearTimeout(f.current)},[]),s.useEffect(()=>{const e=D.current;e&&(e.scrollTop=e.scrollHeight)},[c,R,S,y]),s.useEffect(()=>{if(Fe<=0)return;const e=D.current;e&&(e.scrollTop=e.scrollHeight)},[Fe]),s.useEffect(()=>{if(!le||!Le)return;const e=document.documentElement,n=document.body,o={htmlOverflow:e.style.overflow,bodyOverflow:n.style.overflow};return e.style.overflow="hidden",n.style.overflow="hidden",()=>{e.style.overflow=o.htmlOverflow,n.style.overflow=o.bodyOverflow}},[le,Le]),s.useEffect(()=>{const e=()=>M(null);if(h)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[h]),s.useEffect(()=>{let e=!1;const n=a;return Be(void 0,a).then(o=>{if(e||n!==a)return;const U=new Map;for(const J of o)U.set(J.id,J);xe(U)}).catch(()=>{}),()=>{e=!0}},[a]),s.useEffect(()=>{let e=!1;return ke(!0),Kt(a).then(n=>{e||we(n)}).catch(()=>{e||we([])}).finally(()=>{e||ke(!1)}),()=>{e=!0}},[a]),s.useEffect(()=>{Ge.current=b},[b]),s.useEffect(()=>()=>{for(const e of Ge.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl)},[]);const Te=s.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const o of Array.from(e)){if(!us.includes(o.type))continue;const U=o.type.startsWith("image/");n.push({file:o,previewUrl:U?URL.createObjectURL(o):""})}n.length>0&&q(o=>[...o,...n])},[]),xt=s.useCallback(e=>{q(n=>{const o=n[e];return o?.previewUrl&&URL.revokeObjectURL(o.previewUrl),n.filter((U,J)=>J!==e)})},[]),vt=s.useCallback(e=>{const n=e.clipboardData?.files;if(!n||n.length===0)return;const o=Array.from(n).filter(U=>U.type.startsWith("image/"));o.length!==0&&Te(o)},[Te]),wt=s.useCallback(async e=>{try{await x(e),W(!1),le&&se(!1)}catch{i("Failed to create chat session","error")}},[x,i,le]),_e=s.useCallback(()=>{Y(""),ne(!1),ae(""),de(!1),ce(""),d(-1),q(e=>{for(const n of e)n.previewUrl&&URL.revokeObjectURL(n.previewUrl);return[]})},[]),Ce=s.useCallback(()=>{const e=L.trim(),n=b.map(o=>o.file);if(!(!e&&n.length===0||!r)){if(e==="/clear"){_e(),g(),C(),x({agentId:r.agentId,modelProvider:r.modelProvider??void 0,modelId:r.modelId??void 0}).catch(()=>{i("Failed to clear conversation","error")});return}_e(),$(e,n)}},[L,b,r,_e,g,C,x,i,$]),Ae=s.useCallback(()=>{if(typeof window>"u"||window.innerWidth>768)return;const e=k.current;if(!e||e.disabled)return;const n=window.scrollX,o=window.scrollY;e.focus({preventScroll:!0}),window.requestAnimationFrame(()=>{(window.scrollX!==n||window.scrollY!==o)&&window.scrollTo(n,o)})},[]),Je=s.useCallback(()=>{typeof window>"u"||window.innerWidth>768||(ee.current=!0)},[]),Ie=s.useCallback(e=>{Y(n=>{const o=rt(n);if(!o)return n;const U=`/skill:${e.name} `,J=n.slice(0,o.start)+U+n.slice(o.end);return window.requestAnimationFrame(()=>{k.current&&(k.current.style.height="auto",k.current.style.height=`${Math.min(k.current.scrollHeight,120)}px`,k.current.focus())}),J}),ne(!1),ae(""),fe(0)},[]),Oe=s.useCallback(e=>{const n=k.current;if(!n||je<0)return;const o=n.selectionStart??Ne.current,U=n.selectionEnd??o,J=Math.max(o,U),Qe=Math.min(je,J),Xe=`${`@${e.name.replace(/\s+/g,"_")}`} `,Pt=L.slice(0,Qe)+Xe+L.slice(J),Ze=Qe+Xe.length;Y(Pt),de(!1),ce(""),ue(0),d(-1),window.requestAnimationFrame(()=>{k.current&&(k.current.style.height="auto",k.current.style.height=`${Math.min(k.current.scrollHeight,120)}px`,k.current.focus(),k.current.setSelectionRange(Ze,Ze))})},[je,L]),St=s.useCallback(e=>{if(Ne.current=e.currentTarget.selectionStart??Ne.current,u.mentionActive&&u.files.length>0){if(u.handleKeyDown(e,L),e.key==="Enter"||e.key==="Tab"){const n=u.files[u.selectedIndex];if(n){const o=u.selectFile(n,L);Y(o),u.dismissMention(),H(!1)}}return}if(Z&&e.key==="ArrowDown"){e.preventDefault(),pe.length>0&&ue(n=>(n+1)%pe.length);return}if(Z&&e.key==="ArrowUp"){e.preventDefault(),pe.length>0&&ue(n=>n===0?pe.length-1:n-1);return}if(Z&&e.key==="Enter"){e.preventDefault();const n=pe[ye]??pe[0];n&&Oe(n);return}if(Z&&e.key==="Escape"){e.preventDefault(),de(!1),ce(""),d(-1);return}if(K&&e.key==="ArrowDown"){e.preventDefault(),Q.length>0&&fe(n=>(n+1)%Q.length);return}if(K&&e.key==="ArrowUp"){e.preventDefault(),Q.length>0&&fe(n=>n===0?Q.length-1:n-1);return}if(K&&(e.key==="Enter"||e.key==="Tab")&&Q.length>0){e.preventDefault();const n=Q[ie]??Q[0];n&&Ie(n);return}if(K&&e.key==="Escape"){e.preventDefault(),ne(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Ce())},[Z,pe,ye,Oe,K,Q,ie,Ie,Ce,u,L]),$e=s.useCallback((e,n)=>{const o=hs(e,n);if(o){de(!0),ce(o.filter),d(o.start);return}de(!1),ce(""),d(-1)},[]),bt=s.useCallback(e=>{const n=e.target,o=n.value,U=n.selectionStart??o.length;Ne.current=U,Y(o);const J=rt(o);J?(ne(!0),ae(J.filter)):(ne(!1),ae("")),$e(o,U),u.detectMention(o,U),H(u.mentionActive),u.mentionActive&&A(n),n.style.height="auto",n.style.height=`${Math.min(n.scrollHeight,120)}px`},[$e]),Ue=s.useCallback(e=>{const n=e.currentTarget,o=n.selectionStart??n.value.length;Ne.current=o,$e(n.value,o),u.detectMention(n.value,o),H(u.mentionActive),u.mentionActive&&A(n)},[$e,u,A]),kt=s.useCallback(e=>{e.key!=="Escape"&&Ue(e)},[Ue]),yt=s.useCallback(()=>{if(ee.current){window.requestAnimationFrame(()=>{Ae()});return}f.current!==null&&window.clearTimeout(f.current),f.current=window.setTimeout(()=>{ne(!1),de(!1),ce(""),d(-1),H(!1),u.dismissMention(),f.current=null},120)},[u,Ae]),jt=s.useCallback(()=>{f.current!==null&&(window.clearTimeout(f.current),f.current=null)},[]),Nt=s.useCallback(async e=>{M(null);try{await F(e),i("Conversation archived","success")}catch{i("Failed to archive conversation","error")}},[F,i]),Ct=s.useCallback(async e=>{_(null),M(null);try{await T(e),i("Conversation deleted","success")}catch{i("Failed to delete conversation","error")}},[T,i]),Mt=s.useCallback(e=>{I(e),le&&se(!1)},[I,le]),Tt=s.useCallback(()=>{I(""),se(!0)},[I]),At=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(as,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>W(!0),children:[t.jsx(tt,{size:16}),"New Chat"]})]}),te=it(r?.modelProvider,r?.modelId),Ye=r?.agentId===Pe?te??"Fusion":r?.title||he.get(r?.agentId??"")?.name||r?.agentId||"Chat",$t=!!(te&&te!==Ye),Re=he.get(r?.agentId??"")?.name||(r?.agentId===Pe?te??"Fusion":r?.agentId?.slice(0,30)??"Fusion"),ze=!!(te&&te!==Re),Rt=v.length>50?`${v.slice(0,50)}…`:v,He=s.useCallback(e=>{p(n=>{const o=new Set(n);return o.has(e)?o.delete(e):o.add(e),o})},[]),Dt=s.useCallback((e,n=!1)=>n?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:e}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(ot,{remarkPlugins:[ct],components:ft,children:e})}),[]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${z?"":" chat-sidebar--hidden"}`,children:[t.jsx("div",{className:"chat-sidebar-search",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Jt,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:j,onChange:e=>B(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):E.length===0?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):E.map(e=>t.jsxs("div",{className:`chat-session-item${r?.id===e.id?" chat-session-item--active":""}`,onClick:()=>Mt(e.id),onContextMenu:n=>{n.preventDefault(),M({sessionId:e.id,x:n.clientX,y:n.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:n=>{n.stopPropagation(),_(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(et,{size:14})}),t.jsx("div",{className:"chat-session-title",children:e.title||"Untitled"}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||"No messages"}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsx("span",{children:he.get(e.agentId)?.name||(e.agentId===Pe?it(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))}),t.jsx("span",{children:e.updatedAt?ht(e.updatedAt):""})]})]},e.id))}),t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>W(!0),"data-testid":"chat-new-btn",children:[t.jsx(tt,{size:14}),"New Chat"]})})]}),h&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:h.y,left:h.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Nt(h.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Yt,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{M(null),_(h.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(et,{size:14}),"Delete"]})]}),w&&t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:()=>_(null),children:t.jsxs("div",{className:"chat-new-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Conversation?"}),t.jsx("p",{style:{fontSize:"14px",color:"var(--text-secondary)",marginBottom:"16px"},children:"This action cannot be undone. All messages in this conversation will be permanently deleted."}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>_(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Ct(w),children:"Delete"})]})]})}),t.jsxs("div",{className:"chat-thread",style:pt,children:[(r||!le)&&t.jsxs("div",{className:"chat-thread-header",children:[le&&r&&t.jsx("button",{className:"btn-icon",onClick:Tt,"data-testid":"chat-back-btn",children:t.jsx(Qt,{size:16})}),t.jsx(Ee,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Ye}),$t&&t.jsx("span",{className:"chat-model-tag",children:te})]}),t.jsxs("div",{className:"chat-messages",ref:D,children:[y?t.jsxs(t.Fragment,{children:[c.map(e=>t.jsx(lt,{message:e,forcePlain:m.has(e.id),agentName:Re,showAssistantModelTag:ze,activeModelTag:te,activeSessionId:r?.id??null,mentionAgentsByName:Ke,onToggleRender:He},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ee,{size:14}),t.jsx("span",{children:Re}),ze&&t.jsx("span",{className:"chat-model-tag",children:te}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${m.has("__streaming__")?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":m.has("__streaming__")?"Show rendered markdown":"Show plain text",onClick:()=>He("__streaming__"),children:m.has("__streaming__")?t.jsx(dt,{size:14}):t.jsx(ut,{size:14})})]}),R?Dt(R,m.has("__streaming__")):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:S?"Thinking…":"Connecting…"}),mt(P),S&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:S})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):N?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):c.length===0&&!r?At():c.length===0&&r?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):t.jsx(t.Fragment,{children:c.map(e=>t.jsx(lt,{message:e,forcePlain:m.has(e.id),agentName:Re,showAssistantModelTag:ze,activeModelTag:te,activeSessionId:r?.id??null,mentionAgentsByName:Ke,onToggleRender:He},e.id))}),t.jsx("div",{ref:V})]}),r&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:qe,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{Te(e.target.files),e.target.value=""}}),K&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:me?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):Q.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:oe?"No skills found":"No skills available"}):Q.map((e,n)=>t.jsxs("button",{type:"button",role:"option","aria-selected":n===ie,className:`chat-skill-menu-item${n===ie?" chat-skill-menu-item--highlighted":""}`,onMouseDown:o=>o.preventDefault(),onMouseEnter:()=>fe(n),onClick:()=>Ie(e),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.relativePath,children:e.relativePath})]},e.id))}),b.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:b.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>xt(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":"Attach files",onClick:()=>qe.current?.click(),children:t.jsx(Xt,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${ge?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),O(!0)},onDragLeave:()=>O(!1),onDrop:e=>{e.preventDefault(),O(!1),Te(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:k,className:"chat-input-textarea",placeholder:"Type a message...",value:L,onChange:bt,onKeyDown:St,onKeyUp:kt,onClick:Ue,onBlur:yt,onFocus:jt,onPaste:vt,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(Zt,{agents:be,filter:Se,highlightedIndex:ye,visible:Z,onSelect:Oe,position:"below"}),t.jsx(es,{visible:u.mentionActive&&!Z,position:re,files:u.files,selectedIndex:u.selectedIndex,onSelect:e=>{const n=u.selectFile(e,L);Y(n),u.dismissMention(),H(!1),k.current?.focus()},loading:u.loading}),v&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${Rt}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:C,children:"×"})]})]}),y?t.jsx("button",{className:"chat-input-stop",onClick:g,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(ts,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{typeof window>"u"||window.innerWidth>768||(e.preventDefault(),e.pointerType&&e.pointerType!=="mouse"&&(Me.current=!0,Je(),Ae(),Ce(),window.setTimeout(()=>{ee.current=!1},1500)))},onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||(e.preventDefault(),Me.current=!0,Je(),Ae(),Ce(),window.setTimeout(()=>{ee.current=!1},1500))},onMouseDown:e=>{typeof window>"u"||window.innerWidth>768||e.preventDefault()},onClick:()=>{if(Me.current){Me.current=!1;return}Ce()},disabled:!L.trim()&&b.length===0,"data-testid":"chat-send-btn",children:t.jsx(ss,{size:16})})]})]})]}),X&&t.jsx(ms,{projectId:a,onClose:()=>W(!1),onCreate:wt})]})}export{ws as ChatView};
1
+ import{r as s,j as t}from"./vendor-react-K0fH_qHe.js";import{i as Be,aL as Et,g as Ft,aM as Lt,a as _t,aN as It,aO as Ot,aP as Ut,aQ as zt,aR as Ht,aS as Vt,s as Bt,aT as qt,aU as Gt,aV as Wt,aW as Kt,ab as ot,ac as ct,S as Jt,V as et,J as tt,ao as Yt,aX as Qt,B as Ee,a8 as dt,a9 as ut,aY as Xt,aZ as Zt,a_ as es,a$ as ts,b0 as ss,b1 as ns,b2 as st,b3 as as,h as is,u as nt,k as rs}from"./index-B4StE1qN.js";import"./vendor-xterm-DzcZoU0P.js";const Ve="kb-chat-active-session";function ls(a){const i=a?.toolCalls;if(!Array.isArray(i))return;const r=i.map(l=>{if(!l||typeof l!="object")return null;const c=l,N=typeof c.toolName=="string"?c.toolName:"";if(!N)return null;const y=c.args;return{toolName:N,...y&&typeof y=="object"?{args:y}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(l=>l!==null);return r.length>0?r:void 0}function at(a){return{id:a.id,sessionId:a.sessionId,role:a.role,content:a.content,thinkingOutput:a.thinkingOutput,toolCalls:ls(a.metadata),attachments:a.attachments,createdAt:a.createdAt}}function os(a){const[i,r]=s.useState([]),[l,c]=s.useState(null),[N,y]=s.useState(!0),[R,S]=s.useState([]),[P,I]=s.useState(!1),[x,F]=s.useState(!1),[T,$]=s.useState(""),[g,v]=s.useState(""),[C,j]=s.useState([]),[B,E]=s.useState(""),[X,W]=s.useState(""),[L,Y]=s.useState(!0),[h,M]=s.useState(new Map),w=s.useRef(null),_=s.useRef(!1),z=s.useRef(""),se=s.useRef(null),he=s.useRef(i),xe=s.useRef(l),ve=s.useRef(x);he.current=i,xe.current=l,ve.current=x,s.useEffect(()=>{z.current=B},[B]);const we=s.useRef(new Set),me=s.useRef(0),ke=s.useRef(a);ke.current!==a&&(ke.current=a,me.current++),s.useEffect(()=>{const d=me.current;Be(void 0,a).then(m=>{if(me.current!==d)return;const p=new Map;for(const b of m)p.set(b.id,b);M(p)}).catch(()=>{})},[a]);const K=s.useCallback(async()=>{y(!0);try{const m=[...(await Et(a)).sessions].sort((p,b)=>new Date(b.updatedAt).getTime()-new Date(p.updatedAt).getTime());r(m)}catch{}finally{y(!1)}},[a]);s.useEffect(()=>{K()},[K]);const ne=s.useRef(()=>{});s.useEffect(()=>{if(N)return;const d=Ft(Ve,a);d&&i.find(p=>p.id===d)&&ne.current(d)},[N,i,a]);const oe=s.useCallback(async(d,m)=>{I(!0);try{const p=await Lt(d,{limit:50,...m},a),b=p.messages.map(at);m?.offset&&m.offset>0?S(q=>[...b,...q]):S(b),Y(p.messages.length>=50)}catch{}finally{I(!1)}},[a]),ae=s.useCallback(()=>{se.current?.(),se.current=null,z.current="",E(""),$(""),v(""),j([]),F(!1)},[]),ie=s.useCallback((d,m)=>{w.current&&(w.current.close(),w.current=null);const p=m??i.find(b=>b.id===d);c(p||null),ae(),Y(!0),d?oe(d):S([]),d?_t(Ve,d,a):It(Ve,a)},[i,oe,a,ae]);ne.current=ie;const fe=s.useCallback(async d=>{const m=await Ot(d,a);w.current&&(w.current.close(),w.current=null);const p={id:m.session.id,title:m.session.title,agentId:m.session.agentId,status:m.session.status,modelProvider:m.session.modelProvider,modelId:m.session.modelId,createdAt:m.session.createdAt,updatedAt:m.session.updatedAt};return r(b=>b.some(q=>q.id===p.id)?b:[p,...b]),ae(),ie(p.id,p),S([]),p},[a,ae,ie]),Se=s.useCallback(async d=>{await Ut(d,{status:"archived"},a),r(m=>m.filter(p=>p.id!==d)),l?.id===d&&(c(null),S([]))},[l,a]),ce=s.useCallback(async d=>{l?.id===d&&w.current&&(w.current.close(),w.current=null),await zt(d,a),r(m=>m.filter(p=>p.id!==d)),l?.id===d&&(c(null),S([]))},[l,a]),Z=s.useCallback(async()=>{!l||!L||await oe(l.id,{offset:R.length})},[l,L,oe,R.length]),de=s.useCallback(()=>{l&&(_.current=!0,se.current?.(),se.current=null,w.current?.close(),w.current=null,Ht(l.id,a).catch(()=>{}),F(!1),$(""),v(""),j([]))},[l,a]),ye=s.useCallback(()=>{z.current="",E("")},[]),ue=s.useCallback((d,m)=>{if(!l)return;if(x){z.current=d,E(d);return}_.current=!1,w.current&&(w.current.close(),w.current=null);const p=`temp-${Date.now()}`,b={id:p,sessionId:l.id,role:"user",content:d,createdAt:new Date().toISOString()};S(f=>[...f,b]),$(""),v(""),j([]),F(!0);let q="",ge="",O=[],H=null,re=null;const G=()=>{H=null,$(q)},u=()=>{re=null,v(ge)},A=()=>{H!==null&&(cancelAnimationFrame(H),H=null),re!==null&&(cancelAnimationFrame(re),re=null)};se.current=A;const V={onThinking:f=>{ge+=f,re===null&&(re=requestAnimationFrame(u))},onText:f=>{q+=f,H===null&&(H=requestAnimationFrame(G))},onToolStart:f=>{O=[...O,{toolName:f.toolName,args:f.args,isError:!1,status:"running"}],j(O)},onToolEnd:f=>{const D=[...O];for(let k=D.length-1;k>=0;k--){const ee=D[k];if(ee?.toolName===f.toolName&&ee.status==="running"){D[k]={...ee,status:"completed",isError:f.isError,result:f.result},O=D,j(D);return}}O=[...D,{toolName:f.toolName,isError:f.isError,result:f.result,status:"completed"}],j(O)},onDone:f=>{A();const D={id:f.messageId||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:q,thinkingOutput:ge,toolCalls:O.length>0?O:void 0,createdAt:new Date().toISOString()};we.current.add(D.id),S(ee=>[...ee,D]),$(""),v(""),j([]),F(!1),w.current=null,setTimeout(()=>{we.current.delete(D.id)},1e3),K();const k=z.current.trim();k&&(z.current="",E(""),ue(k))},onError:f=>{if(A(),S(D=>D.filter(k=>k.id!==p)),$(""),v(""),j([]),F(!1),w.current=null,console.error("[useChat] Stream error:",f),!_.current){const D=z.current.trim();D&&(z.current="",E(""),ue(D))}}};w.current=Vt(l.id,d,V,m,a)},[l,x,a,K]),je=X?i.filter(d=>d.title?.toLowerCase().includes(X.toLowerCase())||d.agentId.toLowerCase().includes(X.toLowerCase())):i;return s.useEffect(()=>{const d=me.current,m=a?`?projectId=${encodeURIComponent(a)}`:"",p=()=>me.current!==d,b=G=>{if(p())return;const u=JSON.parse(G.data);r(A=>A.some(V=>V.id===u.id)?A:[u,...A])},q=G=>{if(p())return;const u=JSON.parse(G.data);r(A=>[...A.map(f=>f.id===u.id?u:f)]),xe.current?.id===u.id&&c(u)},ge=G=>{if(p())return;const{id:u}=JSON.parse(G.data);r(A=>A.filter(V=>V.id!==u)),xe.current?.id===u&&(c(null),S([]))},O=G=>{if(p())return;const u=JSON.parse(G.data),A=at(u);we.current.has(A.id)||xe.current?.id===A.sessionId&&!ve.current&&S(V=>V.some(f=>f.id===A.id)?V:[...V,A])},H=G=>{if(p())return;const{id:u}=JSON.parse(G.data);S(A=>A.filter(V=>V.id!==u))};return Bt(`/api/events${m}`,{events:{"chat:session:created":b,"chat:session:updated":q,"chat:session:deleted":ge,"chat:message:added":O,"chat:message:deleted":H}})},[a]),s.useEffect(()=>()=>{w.current&&(w.current.close(),w.current=null)},[]),{sessions:i,activeSession:l,sessionsLoading:N,messages:R,messagesLoading:P,isStreaming:x,streamingText:T,streamingThinking:g,streamingToolCalls:C,pendingMessage:B,selectSession:ie,createSession:fe,archiveSession:Se,deleteSession:ce,sendMessage:ue,stopStreaming:de,clearPendingMessage:ye,loadMoreMessages:Z,hasMoreMessages:L,searchQuery:X,setSearchQuery:W,filteredSessions:je,refreshSessions:K,agentsMap:h}}function ht(a){const i=new Date(a),l=new Date().getTime()-i.getTime(),c=Math.floor(l/1e3),N=Math.floor(c/60),y=Math.floor(N/60),R=Math.floor(y/24);return c<60?"just now":N<60?`${N}m ago`:y<24?`${y}h ago`:R<7?`${R}d ago`:i.toLocaleDateString()}function it(a,i){if(!a||!i)return null;const r=i.toLowerCase();if(r.includes("claude")){let c=i.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return c=c.replace(/\s+/g," "),c.length>30?c.slice(0,30)+"…":c}if(r.includes("gpt")||r.includes("openai")){const c=i.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return c.length>30?c.slice(0,30)+"…":c}if(r.includes("gemini")){const c=i.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return c.length>30?c.slice(0,30)+"…":c}const l=i.replace(/-/g," ").replace(/^\w/,c=>c.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function De(a,i){return a.length<=i?a:`${a.slice(0,i)}…`}function cs(a){if(!a)return null;const i=Object.entries(a);return i.length===0?null:i.map(([r,l])=>{const c=typeof l=="string"?l:(()=>{try{return JSON.stringify(l)}catch{return String(l)}})();return`${r}=${De(c,50)}`}).join(", ")}function ds(a){if(a===void 0)return null;if(typeof a=="string")return De(a,200);try{return De(JSON.stringify(a),200)}catch{return De(String(a),200)}}function mt(a){if(!a||a.length===0)return null;const i=(x,F)=>{const T=x.status==="running",$=x.status==="completed"&&x.isError,g=cs(x.args),v=ds(x.result),C=T?g:v?`result: ${v}`:g?`args: ${g}`:null,j=T?"running":$?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${T?" chat-tool-call--running":""}${$?" chat-tool-call--error":""}`,open:T,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",children:x.toolName}),C&&t.jsx("span",{className:"chat-tool-call-preview",title:C,children:C}),t.jsx("span",{className:"chat-tool-call-status-text",children:j})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[g&&t.jsxs("div",{className:"chat-tool-call-row",children:[t.jsx("span",{className:"chat-tool-call-label",children:"args"}),t.jsx("span",{className:"chat-tool-call-value",children:g})]}),v&&t.jsxs("div",{className:`chat-tool-call-row${$?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:"result"}),t.jsx("span",{className:"chat-tool-call-value",children:v})]})]})]},`${x.toolName}-${F}`)},r="chat-tool-calls";if(a.length===1)return t.jsxs("div",{className:r,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(st,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),i(a[0],0)]});const l=a.filter(x=>x.status==="running").length,c=a.filter(x=>x.status==="completed"&&x.isError).length,N=l>0,y=Array.from(new Set(a.map(x=>x.toolName))),R=y.slice(0,5),S=Math.max(0,y.length-R.length),P=S>0?`${R.join(", ")}, +${S} more`:R.join(", "),I=N?`(${l} running)`:c>0?`(${c} ${c===1?"error":"errors"})`:null;return t.jsx("div",{className:r,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:N,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(st,{size:12,"aria-hidden":"true"}),t.jsxs("span",{children:[a.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:P,children:P}),I&&t.jsx("span",{className:"chat-tool-calls-group-status",children:I})]}),a.map((x,F)=>i(x,F))]})})}const ft={pre:({children:a,...i})=>t.jsx("pre",{...i,className:"chat-markdown-pre",children:a}),table:({children:a,...i})=>t.jsx("table",{...i,className:"chat-markdown-table",children:a})},Pe="__fn_agent__",us=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function rt(a){const i=/(^|[\s])\/([^\s]*)$/.exec(a);if(!i)return null;const r=i[1]??"",l=i[2]??"",c=i.index+r.length;return{filter:l,start:c,end:a.length}}function hs(a,i){const r=a.slice(0,i),l=/(^|[\s\n])@([\w-]*)$/.exec(r);if(!l)return null;const c=l[2]??"",N=r.length-c.length-1;return{filter:c,start:N,end:i}}function ms({projectId:a,onClose:i,onCreate:r}){const[l,c]=s.useState("agent"),[N,y]=s.useState([]),[R,S]=s.useState(!0),[P,I]=s.useState(""),[x,F]=s.useState([]),[T,$]=s.useState(!0),[g,v]=s.useState(""),[C,j]=s.useState([]),[B,E]=s.useState([]);s.useEffect(()=>{let h=!1;return S(!0),Be(void 0,a).then(M=>{h||y(M)}).catch(()=>{h||y([])}).finally(()=>{h||S(!1)}),()=>{h=!0}},[a]),s.useEffect(()=>{$(!0),is().then(h=>{F(h.models),j(h.favoriteProviders),E(h.favoriteModels)}).catch(()=>{F([]),j([]),E([])}).finally(()=>{$(!1)})},[]);const X=s.useCallback(async h=>{const M=C,_=M.includes(h)?M.filter(z=>z!==h):[h,...M];j(_);try{await nt({favoriteProviders:_,favoriteModels:B})}catch{j(M)}},[C,B]),W=s.useCallback(async h=>{const M=B,_=M.includes(h)?M.filter(z=>z!==h):[h,...M];E(_);try{await nt({favoriteProviders:C,favoriteModels:_})}catch{E(M)}},[B,C]),L=h=>{if(h.preventDefault(),l==="agent"){if(!P)return;r({agentId:P});return}if(!g)return;const M=g.indexOf("/");if(M<=0)return;const w=g.slice(0,M),_=g.slice(M+1);r({agentId:Pe,modelProvider:w,modelId:_})},Y=l==="agent"?!P:!g;return t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:i,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog",onClick:h=>h.stopPropagation(),children:[t.jsx("h3",{children:"New Chat"}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{c("agent"),v("")},children:"Agent"}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{c("model"),I("")},children:"Model"})]}),t.jsxs("form",{onSubmit:L,children:[l==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",R?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):N.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:N.map(h=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${P===h.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>I(h.id),"data-testid":`agent-option-${h.id}`,children:[t.jsx(Ee,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:h.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:h.role})]},h.id))})]}),l==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:T?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(rs,{models:x,value:g,onChange:v,label:"Model",placeholder:"Select a model",favoriteProviders:C,onToggleFavorite:X,favoriteModels:B,onToggleModelFavorite:W})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:i,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:Y,children:"Create"})]})]})]})})}const lt=s.memo(function({message:i,forcePlain:r,agentName:l,showAssistantModelTag:c,activeModelTag:N,activeSessionId:y,mentionAgentsByName:R,onToggleRender:S}){const P=i.role==="assistant",I=s.useMemo(()=>{if(P)return null;const T=i.content,$=/@([\w-]+)/g,g=[];let v=0,C=$.exec(T);for(;C;){const[j,B=""]=C,E=C.index;E>v&&g.push(T.slice(v,E));const X=B.replace(/_/g," ").toLowerCase(),W=R.get(X);W?g.push(t.jsxs("span",{className:"chat-mention-chip",children:["@",W.name.replace(/\s+/g,"_")]},`${W.id}-${E}`)):g.push(j),v=E+j.length,C=$.exec(T)}return v<T.length&&g.push(T.slice(v)),g.length===0?T:g},[P,i.content,R]),x=s.useMemo(()=>{const T=i.attachments;if(!T||T.length===0||!y)return null;const $=`/api/chat/sessions/${encodeURIComponent(y)}/attachments/`;return t.jsx("div",{className:"chat-message-attachments",children:T.map(g=>{const v=g.mimeType.startsWith("image/"),C=g.id||g.filename,j=`${$}${encodeURIComponent(g.filename)}`;return v?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:j,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:j,alt:g.originalName})},C):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:j,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(ns,{size:14}),t.jsx("span",{children:g.originalName})]},C)})})},[i.attachments,y]),F=s.useMemo(()=>P?r?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:i.content}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(ot,{remarkPlugins:[ct],components:ft,children:i.content})}):null,[P,r,i.content]);return t.jsxs("div",{className:`chat-message chat-message--${i.role}`,"data-testid":`chat-message-${i.id}`,children:[P&&t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ee,{size:14}),t.jsx("span",{children:l}),c&&N&&t.jsx("span",{className:"chat-model-tag",children:N}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${r?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":r?"Show rendered markdown":"Show plain text",onClick:()=>S(i.id),children:r?t.jsx(dt,{size:14}):t.jsx(ut,{size:14})})]}),P?F:t.jsx("div",{className:"chat-message-content",children:I}),mt(i.toolCalls),i.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:i.thinkingOutput})]}),x,t.jsx("div",{className:"chat-message-time",children:ht(i.createdAt)})]})});function ws({projectId:a,addToast:i}){const{activeSession:r,sessionsLoading:l,messages:c,messagesLoading:N,isStreaming:y,streamingText:R,streamingThinking:S,streamingToolCalls:P,selectSession:I,createSession:x,archiveSession:F,deleteSession:T,sendMessage:$,stopStreaming:g,pendingMessage:v,clearPendingMessage:C,searchQuery:j,setSearchQuery:B,filteredSessions:E}=os(a),[X,W]=s.useState(!1),[L,Y]=s.useState(""),[h,M]=s.useState(null),[w,_]=s.useState(null),[z,se]=s.useState(!0),[he,xe]=s.useState(new Map),[ve,we]=s.useState([]),[me,ke]=s.useState(!0),[K,ne]=s.useState(!1),[oe,ae]=s.useState(""),[ie,fe]=s.useState(0),[Se,ce]=s.useState(""),[Z,de]=s.useState(!1),[ye,ue]=s.useState(0),[je,d]=s.useState(-1),[m,p]=s.useState(()=>new Set),[b,q]=s.useState([]),[ge,O]=s.useState(!1),[,H]=s.useState(!1),[re,G]=s.useState({top:0,left:0}),u=qt({projectId:a}),A=s.useCallback(e=>{if(!e||!u.mentionActive)return;const n=e.getBoundingClientRect();G({top:n.top-260,left:n.left+8})},[u.mentionActive]),V=s.useRef(null),f=s.useRef(null),D=s.useRef(null),k=s.useRef(null),ee=s.useRef(!1),Me=s.useRef(!1),qe=s.useRef(null),Ge=s.useRef([]),Ne=s.useRef(0),le=Gt()==="mobile",{keyboardOverlap:Fe,viewportHeight:We,viewportOffsetTop:gt,keyboardOpen:Le}=Wt({enabled:le&&!!r}),pt=Le?{"--keyboard-overlap":`${Fe}px`,"--vv-offset-top":`${gt}px`,...We!==null?{"--vv-height":`${We}px`}:{}}:{},Q=s.useMemo(()=>{const e=oe.trim().toLowerCase();return(e?ve.filter(o=>o.name.toLowerCase().includes(e)):ve).slice(0,10)},[ve,oe]),be=s.useMemo(()=>Array.from(he.values()),[he]),pe=s.useMemo(()=>{const e=Se.trim().toLowerCase();return e?be.filter(n=>n.name.toLowerCase().includes(e)):be},[be,Se]),Ke=s.useMemo(()=>{const e=new Map;for(const n of be)e.set(n.name.toLowerCase(),n);return e},[be]);s.useEffect(()=>{fe(0)},[Q]),s.useEffect(()=>{ue(0)},[Se,Z]),s.useEffect(()=>()=>{f.current!==null&&window.clearTimeout(f.current)},[]),s.useEffect(()=>{const e=D.current;e&&(e.scrollTop=e.scrollHeight)},[c,R,S,y]),s.useEffect(()=>{if(Fe<=0)return;const e=D.current;e&&(e.scrollTop=e.scrollHeight)},[Fe]),s.useEffect(()=>{if(!le||!Le)return;const e=document.documentElement,n=document.body,o={htmlOverflow:e.style.overflow,bodyOverflow:n.style.overflow};return e.style.overflow="hidden",n.style.overflow="hidden",()=>{e.style.overflow=o.htmlOverflow,n.style.overflow=o.bodyOverflow}},[le,Le]),s.useEffect(()=>{const e=()=>M(null);if(h)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[h]),s.useEffect(()=>{let e=!1;const n=a;return Be(void 0,a).then(o=>{if(e||n!==a)return;const U=new Map;for(const J of o)U.set(J.id,J);xe(U)}).catch(()=>{}),()=>{e=!0}},[a]),s.useEffect(()=>{let e=!1;return ke(!0),Kt(a).then(n=>{e||we(n)}).catch(()=>{e||we([])}).finally(()=>{e||ke(!1)}),()=>{e=!0}},[a]),s.useEffect(()=>{Ge.current=b},[b]),s.useEffect(()=>()=>{for(const e of Ge.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl)},[]);const Te=s.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const o of Array.from(e)){if(!us.includes(o.type))continue;const U=o.type.startsWith("image/");n.push({file:o,previewUrl:U?URL.createObjectURL(o):""})}n.length>0&&q(o=>[...o,...n])},[]),xt=s.useCallback(e=>{q(n=>{const o=n[e];return o?.previewUrl&&URL.revokeObjectURL(o.previewUrl),n.filter((U,J)=>J!==e)})},[]),vt=s.useCallback(e=>{const n=e.clipboardData?.files;if(!n||n.length===0)return;const o=Array.from(n).filter(U=>U.type.startsWith("image/"));o.length!==0&&Te(o)},[Te]),wt=s.useCallback(async e=>{try{await x(e),W(!1),le&&se(!1)}catch{i("Failed to create chat session","error")}},[x,i,le]),_e=s.useCallback(()=>{Y(""),ne(!1),ae(""),de(!1),ce(""),d(-1),q(e=>{for(const n of e)n.previewUrl&&URL.revokeObjectURL(n.previewUrl);return[]})},[]),Ce=s.useCallback(()=>{const e=L.trim(),n=b.map(o=>o.file);if(!(!e&&n.length===0||!r)){if(e==="/clear"){_e(),g(),C(),x({agentId:r.agentId,modelProvider:r.modelProvider??void 0,modelId:r.modelId??void 0}).catch(()=>{i("Failed to clear conversation","error")});return}_e(),$(e,n)}},[L,b,r,_e,g,C,x,i,$]),Ae=s.useCallback(()=>{if(typeof window>"u"||window.innerWidth>768)return;const e=k.current;if(!e||e.disabled)return;const n=window.scrollX,o=window.scrollY;e.focus({preventScroll:!0}),window.requestAnimationFrame(()=>{(window.scrollX!==n||window.scrollY!==o)&&window.scrollTo(n,o)})},[]),Je=s.useCallback(()=>{typeof window>"u"||window.innerWidth>768||(ee.current=!0)},[]),Ie=s.useCallback(e=>{Y(n=>{const o=rt(n);if(!o)return n;const U=`/skill:${e.name} `,J=n.slice(0,o.start)+U+n.slice(o.end);return window.requestAnimationFrame(()=>{k.current&&(k.current.style.height="auto",k.current.style.height=`${Math.min(k.current.scrollHeight,120)}px`,k.current.focus())}),J}),ne(!1),ae(""),fe(0)},[]),Oe=s.useCallback(e=>{const n=k.current;if(!n||je<0)return;const o=n.selectionStart??Ne.current,U=n.selectionEnd??o,J=Math.max(o,U),Qe=Math.min(je,J),Xe=`${`@${e.name.replace(/\s+/g,"_")}`} `,Pt=L.slice(0,Qe)+Xe+L.slice(J),Ze=Qe+Xe.length;Y(Pt),de(!1),ce(""),ue(0),d(-1),window.requestAnimationFrame(()=>{k.current&&(k.current.style.height="auto",k.current.style.height=`${Math.min(k.current.scrollHeight,120)}px`,k.current.focus(),k.current.setSelectionRange(Ze,Ze))})},[je,L]),St=s.useCallback(e=>{if(Ne.current=e.currentTarget.selectionStart??Ne.current,u.mentionActive&&u.files.length>0){if(u.handleKeyDown(e,L),e.key==="Enter"||e.key==="Tab"){const n=u.files[u.selectedIndex];if(n){const o=u.selectFile(n,L);Y(o),u.dismissMention(),H(!1)}}return}if(Z&&e.key==="ArrowDown"){e.preventDefault(),pe.length>0&&ue(n=>(n+1)%pe.length);return}if(Z&&e.key==="ArrowUp"){e.preventDefault(),pe.length>0&&ue(n=>n===0?pe.length-1:n-1);return}if(Z&&e.key==="Enter"){e.preventDefault();const n=pe[ye]??pe[0];n&&Oe(n);return}if(Z&&e.key==="Escape"){e.preventDefault(),de(!1),ce(""),d(-1);return}if(K&&e.key==="ArrowDown"){e.preventDefault(),Q.length>0&&fe(n=>(n+1)%Q.length);return}if(K&&e.key==="ArrowUp"){e.preventDefault(),Q.length>0&&fe(n=>n===0?Q.length-1:n-1);return}if(K&&(e.key==="Enter"||e.key==="Tab")&&Q.length>0){e.preventDefault();const n=Q[ie]??Q[0];n&&Ie(n);return}if(K&&e.key==="Escape"){e.preventDefault(),ne(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Ce())},[Z,pe,ye,Oe,K,Q,ie,Ie,Ce,u,L]),$e=s.useCallback((e,n)=>{const o=hs(e,n);if(o){de(!0),ce(o.filter),d(o.start);return}de(!1),ce(""),d(-1)},[]),bt=s.useCallback(e=>{const n=e.target,o=n.value,U=n.selectionStart??o.length;Ne.current=U,Y(o);const J=rt(o);J?(ne(!0),ae(J.filter)):(ne(!1),ae("")),$e(o,U),u.detectMention(o,U),H(u.mentionActive),u.mentionActive&&A(n),n.style.height="auto",n.style.height=`${Math.min(n.scrollHeight,120)}px`},[$e]),Ue=s.useCallback(e=>{const n=e.currentTarget,o=n.selectionStart??n.value.length;Ne.current=o,$e(n.value,o),u.detectMention(n.value,o),H(u.mentionActive),u.mentionActive&&A(n)},[$e,u,A]),kt=s.useCallback(e=>{e.key!=="Escape"&&Ue(e)},[Ue]),yt=s.useCallback(()=>{if(ee.current){window.requestAnimationFrame(()=>{Ae()});return}f.current!==null&&window.clearTimeout(f.current),f.current=window.setTimeout(()=>{ne(!1),de(!1),ce(""),d(-1),H(!1),u.dismissMention(),f.current=null},120)},[u,Ae]),jt=s.useCallback(()=>{f.current!==null&&(window.clearTimeout(f.current),f.current=null)},[]),Nt=s.useCallback(async e=>{M(null);try{await F(e),i("Conversation archived","success")}catch{i("Failed to archive conversation","error")}},[F,i]),Ct=s.useCallback(async e=>{_(null),M(null);try{await T(e),i("Conversation deleted","success")}catch{i("Failed to delete conversation","error")}},[T,i]),Mt=s.useCallback(e=>{I(e),le&&se(!1)},[I,le]),Tt=s.useCallback(()=>{I(""),se(!0)},[I]),At=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(as,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>W(!0),children:[t.jsx(tt,{size:16}),"New Chat"]})]}),te=it(r?.modelProvider,r?.modelId),Ye=r?.agentId===Pe?te??"Fusion":r?.title||he.get(r?.agentId??"")?.name||r?.agentId||"Chat",$t=!!(te&&te!==Ye),Re=he.get(r?.agentId??"")?.name||(r?.agentId===Pe?te??"Fusion":r?.agentId?.slice(0,30)??"Fusion"),ze=!!(te&&te!==Re),Rt=v.length>50?`${v.slice(0,50)}…`:v,He=s.useCallback(e=>{p(n=>{const o=new Set(n);return o.has(e)?o.delete(e):o.add(e),o})},[]),Dt=s.useCallback((e,n=!1)=>n?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:e}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(ot,{remarkPlugins:[ct],components:ft,children:e})}),[]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${z?"":" chat-sidebar--hidden"}`,children:[t.jsx("div",{className:"chat-sidebar-search",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Jt,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:j,onChange:e=>B(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):E.length===0?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):E.map(e=>t.jsxs("div",{className:`chat-session-item${r?.id===e.id?" chat-session-item--active":""}`,onClick:()=>Mt(e.id),onContextMenu:n=>{n.preventDefault(),M({sessionId:e.id,x:n.clientX,y:n.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:n=>{n.stopPropagation(),_(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(et,{size:14})}),t.jsx("div",{className:"chat-session-title",children:e.title||"Untitled"}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||"No messages"}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsx("span",{children:he.get(e.agentId)?.name||(e.agentId===Pe?it(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))}),t.jsx("span",{children:e.updatedAt?ht(e.updatedAt):""})]})]},e.id))}),t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>W(!0),"data-testid":"chat-new-btn",children:[t.jsx(tt,{size:14}),"New Chat"]})})]}),h&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:h.y,left:h.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Nt(h.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Yt,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{M(null),_(h.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(et,{size:14}),"Delete"]})]}),w&&t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:()=>_(null),children:t.jsxs("div",{className:"chat-new-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Conversation?"}),t.jsx("p",{style:{fontSize:"14px",color:"var(--text-secondary)",marginBottom:"16px"},children:"This action cannot be undone. All messages in this conversation will be permanently deleted."}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>_(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Ct(w),children:"Delete"})]})]})}),t.jsxs("div",{className:"chat-thread",style:pt,children:[(r||!le)&&t.jsxs("div",{className:"chat-thread-header",children:[le&&r&&t.jsx("button",{className:"btn-icon",onClick:Tt,"data-testid":"chat-back-btn",children:t.jsx(Qt,{size:16})}),t.jsx(Ee,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Ye}),$t&&t.jsx("span",{className:"chat-model-tag",children:te})]}),t.jsxs("div",{className:"chat-messages",ref:D,children:[y?t.jsxs(t.Fragment,{children:[c.map(e=>t.jsx(lt,{message:e,forcePlain:m.has(e.id),agentName:Re,showAssistantModelTag:ze,activeModelTag:te,activeSessionId:r?.id??null,mentionAgentsByName:Ke,onToggleRender:He},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ee,{size:14}),t.jsx("span",{children:Re}),ze&&t.jsx("span",{className:"chat-model-tag",children:te}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${m.has("__streaming__")?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":m.has("__streaming__")?"Show rendered markdown":"Show plain text",onClick:()=>He("__streaming__"),children:m.has("__streaming__")?t.jsx(dt,{size:14}):t.jsx(ut,{size:14})})]}),R?Dt(R,m.has("__streaming__")):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:S?"Thinking…":"Connecting…"}),mt(P),S&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:S})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):N?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):c.length===0&&!r?At():c.length===0&&r?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):t.jsx(t.Fragment,{children:c.map(e=>t.jsx(lt,{message:e,forcePlain:m.has(e.id),agentName:Re,showAssistantModelTag:ze,activeModelTag:te,activeSessionId:r?.id??null,mentionAgentsByName:Ke,onToggleRender:He},e.id))}),t.jsx("div",{ref:V})]}),r&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:qe,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{Te(e.target.files),e.target.value=""}}),K&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:me?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):Q.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:oe?"No skills found":"No skills available"}):Q.map((e,n)=>t.jsxs("button",{type:"button",role:"option","aria-selected":n===ie,className:`chat-skill-menu-item${n===ie?" chat-skill-menu-item--highlighted":""}`,onMouseDown:o=>o.preventDefault(),onMouseEnter:()=>fe(n),onClick:()=>Ie(e),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.relativePath,children:e.relativePath})]},e.id))}),b.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:b.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>xt(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":"Attach files",onClick:()=>qe.current?.click(),children:t.jsx(Xt,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${ge?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),O(!0)},onDragLeave:()=>O(!1),onDrop:e=>{e.preventDefault(),O(!1),Te(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:k,className:"chat-input-textarea",placeholder:"Type a message...",value:L,onChange:bt,onKeyDown:St,onKeyUp:kt,onClick:Ue,onBlur:yt,onFocus:jt,onPaste:vt,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(Zt,{agents:be,filter:Se,highlightedIndex:ye,visible:Z,onSelect:Oe,position:"below"}),t.jsx(es,{visible:u.mentionActive&&!Z,position:re,files:u.files,selectedIndex:u.selectedIndex,onSelect:e=>{const n=u.selectFile(e,L);Y(n),u.dismissMention(),H(!1),k.current?.focus()},loading:u.loading}),v&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${Rt}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:C,children:"×"})]})]}),y?t.jsx("button",{className:"chat-input-stop",onClick:g,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(ts,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{typeof window>"u"||window.innerWidth>768||(e.preventDefault(),e.pointerType&&e.pointerType!=="mouse"&&(Me.current=!0,Je(),Ae(),Ce(),window.setTimeout(()=>{ee.current=!1},1500)))},onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||(e.preventDefault(),Me.current=!0,Je(),Ae(),Ce(),window.setTimeout(()=>{ee.current=!1},1500))},onMouseDown:e=>{typeof window>"u"||window.innerWidth>768||e.preventDefault()},onClick:()=>{if(Me.current){Me.current=!1;return}Ce()},disabled:!L.trim()&&b.length===0,"data-testid":"chat-send-btn",children:t.jsx(ss,{size:16})})]})]})]}),X&&t.jsx(ms,{projectId:a,onClose:()=>W(!1),onCreate:wt})]})}export{ws as ChatView};
@@ -1 +1 @@
1
- import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{bG as De,bH as de,bI as Ze,bJ as ue,s as Ue,bK as ge,bL as we,bM as xe,bN as ye,bO as et,bP as ae,bQ as tt,bR as rt,bS as st,bT as nt,bU as at,bV as ie,L as ee,S as it,bW as lt,bX as ct,W as ot,bY as Me,T as Ae,bZ as dt,Q as ut,a$ as vt,b_ as mt,a9 as ft,an as pt,R as ht}from"./index-DoQ5ALYY.js";import"./vendor-xterm-DzcZoU0P.js";const ve=500,bt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function Pe(e){return e.length<=ve?e:e.slice(-ve)}function le(e,i){return Pe([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function Y(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function gt(e){return e?.previewUrl??null}async function Se(e){return tt(e)}async function Ne(e,i){return rt(e,i)}async function wt(e){return st(e)}async function xt(e){return nt(e)}async function je(e){return at(e)}function V(e){try{return e()}catch{return null}}function ce(){return typeof V(()=>de)=="function"&&typeof V(()=>De)=="function"}function X(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 yt(e){const[i,o]=r.useState(null),[b,y]=r.useState([]),[w,f]=r.useState([]),[k,U]=r.useState([]),[C,P]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,M]=r.useState(null),R=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-ve).map(Y);f(s)}},[]),A=r.useCallback(async()=>{const a=n.current;try{if(ce())if(d){const s=await De(d,e);if(n.current!==a)return;R(s)}else{const s=await de(e);if(n.current!==a)return;y(s),s.length>0&&(M(s[0].config.id),R(s[0]))}else{const s=await Se(e);if(n.current!==a)return;const c=X(s);y([c]),R(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[R,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),U([]),P(!0),u(null),M(null),(async()=>{try{const[c,l]=await Promise.allSettled([ce()?de(e):Se(e).then(N=>[X(N)]),typeof V(()=>ae)=="function"?ae(e):je(e).then(N=>N.map(g=>({name:g.name,command:g.command,cwd:g.cwd,scriptName:g.scriptName,packagePath:g.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const g=N[0];ce()&&M(g.config.id),R(g)}}else v=B(c.reason);l.status==="fulfilled"&&U(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&P(!1)}})()},[R,e]),r.useEffect(()=>{const a=d?Ze(d,e):typeof V(()=>ue)=="function"?ue(e):null;if(!a)return;const s=n.current,c=Ue(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(Y);f(Pe(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Y(v);f(g=>le(g,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:Y(v);f(g=>le(g,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>le(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(g=>g&&{...g,status:N,runtime:v.pid?{...g.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:g.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=X(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&A()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,A,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{A()},bt);return()=>{clearInterval(a)}},[A,i?.status]);const _=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>ge)=="function")l=await ge(d,e);else{const v=await Ne({command:a,cwd:s},e);l=X(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(()=>we)=="function")s=await we(d,e);else{const c=await wt(e);s=X(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),j=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>xe)=="function")s=await xe(d,e);else{const c=await xt(e);s=X(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(()=>ye)=="function")c=await ye(d,a,e);else{const l=await et({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 ae(e)}catch{s=(await je(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;U(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 Ne({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),g=X(N);o(g),y([g]),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 _(c,l)},[e,_,d]),E=r.useCallback(async()=>{await D()},[D]),L=r.useCallback(async()=>{await j()},[j]),z=r.useCallback(async a=>{await T(a)},[T]),F=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await A()},[A]),H=gt(i),x=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:b,logs:w,detectedCommands:k,previewUrl:H,isLoading:C,error:S,startServer:_,stopServer:D,restartServer:j,setPreviewUrl:T,detectCommands:h,refresh:A,candidates:k,serverState:x,loading:C,start:p,stop:E,restart:L,setManualUrl:z,detect:F,refreshStatus:O}}const ke=500,Ce=100;function Te(e){return e.length>ke?e.slice(-ke):e}function ze(e){return e==="stderr"?"stderr":"stdout"}function K(e){try{return JSON.parse(e.data)}catch{return null}}function Z(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:ze(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function St(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function oe(e,i){if(i.length===0)return e;const o=[...e],b=new Set(e.map(y=>y.id));for(const y of i)b.has(y.id)||(b.add(y.id),o.push(y));return o.sort((y,w)=>y.id-w.id),Te(o)}function Nt(e,i){const[o,b]=r.useState([]),[y,w]=r.useState(!1),[f,k]=r.useState(!1),[U,C]=r.useState(!1),[P,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),M=r.useRef(0),R=r.useRef(e),A=r.useRef(i),_=r.useRef(0),D=r.useRef(1);(R.current!==e||A.current!==i)&&(R.current=e,A.current=i,d.current++,n.current=!0,_.current=0,D.current=1,b([]),w(!1),k(!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 E=d.current,L=++M.current;n.current=!1,w(!0);const z=(x,a)=>{const s=Te(x);b(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;_.current=c,D.current=c+1},F=x=>{if(n.current||d.current!==E||!x||typeof x!="object")return;const a=x.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)=>St(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>Z(c,l+1));z(s,s.length)},O=x=>{if(n.current||d.current!==E)return;const a=typeof x.text=="string"?x.text:typeof x.line=="string"?x.line:null;if(!a)return;const s=D.current,c=typeof x.id=="number"&&Number.isFinite(x.id)?x.id:s,l={id:c,text:a,stream:ze(x.stream),timestamp:typeof x.timestamp=="string"?x.timestamp:""};_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1),b(v=>oe(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await ie({maxLines:Ce},e);if(n.current||d.current!==E||M.current!==L)return;const s=a.lines.map((c,l)=>Z(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==E||M.current!==L)return;z([],null)}finally{!n.current&&d.current===E&&M.current===L&&w(!1)}const x=ue(e);u.current=Ue(x,{events:{"dev-server:log":a=>{const s=K(a);s&&O(s)},log:a=>{const s=K(a);s&&O(s)},history:a=>{const s=K(a);F(s)},"dev-server:history":a=>{const s=K(a);F(s)}},onReconnect:()=>{n.current||d.current!==E||ie({lastEventId:_.current,maxLines:50},e).then(a=>{if(n.current||d.current!==E)return;const s=a.lines.map((c,l)=>Z(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1)}b(c=>oe(c,s)),S(a.totalLines)}).catch(()=>{})}})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const T=r.useCallback(async()=>{if(!i||f)return;const E=d.current,L=o.length;k(!0);try{const z=await ie({maxLines:Ce,offset:L},e);if(n.current||d.current!==E)return;const F=z.lines.map((O,H)=>Z(O,H+1));b(O=>oe(F,O)),C(z.totalLines>L+F.length),S(z.totalLines)}catch{}finally{k(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{b([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:U,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const jt="This preview appears to block iframe embedding. Open it in a new tab instead.",kt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Ct="Preview is taking longer than expected and may block iframe embedding.";function Et(e){return e==="blocked"?jt:e==="error"?kt:null}function Lt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:b=null}=i,y=r.useRef(null),w=r.useRef(null),[f,k]=r.useState("unknown"),[U,C]=r.useState(null),[P]=r.useState(b),S=r.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),u=r.useCallback(j=>{k(j),C(Et(j))},[]),n=r.useCallback(()=>{k("blocked"),C(Ct)},[]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null);let j=!1;return queueMicrotask(()=>{j||(k("loading"),C(null))}),()=>{j=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const j=setTimeout(()=>{w.current=null,n()},o);return w.current=j,()=>{clearTimeout(j),w.current===j&&(w.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const j=y.current;if(!j){u("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),M=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null)},[S]);const R=r.useCallback(()=>{S(),k("unknown"),C(null)},[S]),A=R,_=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:_,isBlocked:D,blockReason:U,detectionMethod:P,iframeRef:y,resetEmbedStatus:R,setEmbedStatus:u,retry:A,embedContext:U,handleIframeLoad:d,handleIframeError:M}}const Rt=/\x1b\[[0-9;]*m/g;function me(e){return e.replace(Rt,"")}function _t(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 Dt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ut(e){if(e.stream==="stderr")return"error";const i=me(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Mt(e,i){if(!i)return e;const o=new RegExp(`(${Dt(i)})`,"ig"),b=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:b.map((w,f)=>w.toLowerCase()===y?t.jsx("mark",{children:w},`${w}-${f}`):t.jsx("span",{children:w},`${w}-${f}`))})}function At({entries:e,loading:i,loadingMore:o,hasMore:b,total:y,onLoadMore:w,isRunning:f}){const k=r.useRef(null),U=r.useRef(e.length),C=r.useRef(f),[P,S]=r.useState(!1),[u,n]=r.useState(!1),[d,M]=r.useState(""),[R,A]=r.useState("all"),_=r.useMemo(()=>R==="all"?e:e.filter(p=>Ut(p)===R),[e,R]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?_.filter(E=>me(E.text).toLowerCase().includes(p)):_},[_,d]),j=D.length,T=r.useCallback(()=>{const p=k.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,E=U.current,L=e.length>E;f&&(!p||!u&&L)&&T(),C.current=f,U.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=k.current;if(!p)return;const L=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!L)},[]);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(ee,{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:R,onChange:p=>A(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(it,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>M(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:[j," match",j===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(lt,{size:14}):t.jsx(ct,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[b&&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:w,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(ee,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:k,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.":_.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const E=me(p.text),L=_t(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[L&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:L}),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:Mt(E,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(ot,{size:14}),"New logs"]})]})]})}const Pt="devserver-preview-iframe";function Tt({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:b,blockReason:y,onRetry:w,className:f=Pt,embedContext:k}){const U=y??k??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=b.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[b,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:b,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(ee,{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(Me,{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"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),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"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Ae,{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"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),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"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]})]}):null}const Ee={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"}};function Le(e){return e instanceof Error?e.message:String(e)}function $e(e){return e==="."?"root":e}function Re(e){return e?e==="root"?".":e:null}function _e(e,i,o){return!i||e.scriptName!==i?!1:o?$e(e.cwd)===o:!0}function zt(e){return e.cwd==="."?"root":e.cwd}function $t(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Ht({addToast:e,projectId:i}){const{session:o,detectedCommands:b,previewUrl:y,isLoading:w,error:f,startServer:k,stopServer:U,restartServer:C,setPreviewUrl:P,detectCommands:S,refresh:u}=yt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",M=Ee[n]??Ee.stopped,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,loadMore:T}=Nt(i,!!i),h=y,p=o?.config?.cwd??null,[E,L]=r.useState(!0),[z,F]=r.useState(""),[O,H]=r.useState(""),[x,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:g,setEmbedStatus:Fe,resetEmbedStatus:I,iframeRef:q,isEmbedded:Oe,isBlocked:te,blockReason:re,retry:fe}=Lt(N),[pe,W]=r.useState(!1),he=r.useRef(g);r.useEffect(()=>{const m=he.current!==g;te&&m&&W(!0),g==="embedded"&&W(!1),he.current=g},[g,te]),r.useEffect(()=>{W(!1)},[h]);const J=r.useMemo(()=>{if(!x)return null;const m=Re(p);return b.find($=>!($.scriptName!==x||m&&$.cwd!==m||o?.config?.command&&$.command!==o.config.command))??b.find($=>_e($,x,p))??null},[b,o?.config?.command,x,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(Le(m),"error")})},[e,S]),r.useEffect(()=>{if(x){L(!1);return}L(!0)},[x]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&F(o.config.command);return}if(J){F(J.command);return}b.length>0&&F(m=>m.trim().length>0?m:b[0]?.command??"")},[b,J,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const se=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),be=r.useCallback(()=>{W(!1),fe()},[fe]),Be=r.useCallback(()=>{try{const m=q.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),I();return}}catch{}if(!(!h||!q.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),q.current.src=m.toString(),W(!1),I()}catch{q.current.src=h,W(!1),I()}},[h,q,I]),Q=r.useCallback(async(m,$,ne)=>{c(m);try{await $(),e(ne,"success")}catch(Ke){e(Le(Ke),"error")}finally{c(null)}},[e]),He=r.useCallback(m=>{a(m.scriptName),L(!1),F(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),Ve=r.useCallback(()=>{a(null),L(!0),e("Cleared selected dev server script.","success")},[e]),We=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const $=Re(p)??".",ne=J?.cwd??$;Q("start",()=>k(m,ne),"Dev server started.")},Xe=()=>{Q("stop",U,"Dev server stopped.")},qe=()=>{Q("restart",C,"Dev server restarted.")},Ge=()=>{const m=O.trim(),$=m.length>0?m:null;Q("preview",()=>P($),$?"Preview URL updated.":"Preview URL override cleared.")},Ie=r.useCallback(()=>{f&&u()},[f,u]),Je=n==="starting"||n==="running"||s!==null,Qe=n==="stopped"||s!==null,Ye=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(dt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${M.className}`,"data-testid":"dev-server-status-badge",children:M.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:We,disabled:Je,"data-testid":"dev-server-start-button",children:[t.jsx(ut,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Xe,disabled:Qe,"data-testid":"dev-server-stop-button",children:[t.jsx(vt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:qe,disabled:Ye,"data-testid":"dev-server-restart-button",children:[t.jsx(mt,{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"}),w&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),w&&!o&&b.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(ee,{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:Ie,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),x&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:x}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ve,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),E&&b.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."]}),E&&b.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:b.map(m=>{const $=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${$?"dev-server-candidate--selected":""}`,onClick:()=>He(m),"data-testid":`dev-server-candidate-${m.scriptName}-${$e(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:$t(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:zt(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=>F(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:Ge,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:[j??R.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(At,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,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(ft,{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:se,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(pt,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Be,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(ht,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":g,"data-embedded":Oe?"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:se,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&pe&&te&&t.jsxs("div",{className:g==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[g==="error"?t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:g==="error"?"Preview failed":"Preview blocked"}),re&&t.jsx("p",{className:"devserver-preview-blocked-context",children:re})]}),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:se,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:be,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!pe&&t.jsx(Tt,{url:h,embedStatus:g,onEmbedStatusChange:Fe,iframeRef:q,blockReason:re,onRetry:be})]})]})]})}export{Ht as DevServerView};
1
+ import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{bG as De,bH as de,bI as Ze,bJ as ue,s as Ue,bK as ge,bL as we,bM as xe,bN as ye,bO as et,bP as ae,bQ as tt,bR as rt,bS as st,bT as nt,bU as at,bV as ie,L as ee,S as it,bW as lt,bX as ct,W as ot,bY as Me,T as Ae,bZ as dt,Q as ut,a$ as vt,b_ as mt,a9 as ft,an as pt,R as ht}from"./index-B4StE1qN.js";import"./vendor-xterm-DzcZoU0P.js";const ve=500,bt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function Pe(e){return e.length<=ve?e:e.slice(-ve)}function le(e,i){return Pe([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function Y(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function gt(e){return e?.previewUrl??null}async function Se(e){return tt(e)}async function Ne(e,i){return rt(e,i)}async function wt(e){return st(e)}async function xt(e){return nt(e)}async function je(e){return at(e)}function V(e){try{return e()}catch{return null}}function ce(){return typeof V(()=>de)=="function"&&typeof V(()=>De)=="function"}function X(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 yt(e){const[i,o]=r.useState(null),[b,y]=r.useState([]),[w,f]=r.useState([]),[k,U]=r.useState([]),[C,P]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,M]=r.useState(null),R=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-ve).map(Y);f(s)}},[]),A=r.useCallback(async()=>{const a=n.current;try{if(ce())if(d){const s=await De(d,e);if(n.current!==a)return;R(s)}else{const s=await de(e);if(n.current!==a)return;y(s),s.length>0&&(M(s[0].config.id),R(s[0]))}else{const s=await Se(e);if(n.current!==a)return;const c=X(s);y([c]),R(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[R,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),U([]),P(!0),u(null),M(null),(async()=>{try{const[c,l]=await Promise.allSettled([ce()?de(e):Se(e).then(N=>[X(N)]),typeof V(()=>ae)=="function"?ae(e):je(e).then(N=>N.map(g=>({name:g.name,command:g.command,cwd:g.cwd,scriptName:g.scriptName,packagePath:g.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const g=N[0];ce()&&M(g.config.id),R(g)}}else v=B(c.reason);l.status==="fulfilled"&&U(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&P(!1)}})()},[R,e]),r.useEffect(()=>{const a=d?Ze(d,e):typeof V(()=>ue)=="function"?ue(e):null;if(!a)return;const s=n.current,c=Ue(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(Y);f(Pe(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Y(v);f(g=>le(g,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:Y(v);f(g=>le(g,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>le(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(g=>g&&{...g,status:N,runtime:v.pid?{...g.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:g.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=X(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&A()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,A,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{A()},bt);return()=>{clearInterval(a)}},[A,i?.status]);const _=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>ge)=="function")l=await ge(d,e);else{const v=await Ne({command:a,cwd:s},e);l=X(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(()=>we)=="function")s=await we(d,e);else{const c=await wt(e);s=X(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),j=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>xe)=="function")s=await xe(d,e);else{const c=await xt(e);s=X(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(()=>ye)=="function")c=await ye(d,a,e);else{const l=await et({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 ae(e)}catch{s=(await je(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;U(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 Ne({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),g=X(N);o(g),y([g]),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 _(c,l)},[e,_,d]),E=r.useCallback(async()=>{await D()},[D]),L=r.useCallback(async()=>{await j()},[j]),z=r.useCallback(async a=>{await T(a)},[T]),F=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await A()},[A]),H=gt(i),x=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:b,logs:w,detectedCommands:k,previewUrl:H,isLoading:C,error:S,startServer:_,stopServer:D,restartServer:j,setPreviewUrl:T,detectCommands:h,refresh:A,candidates:k,serverState:x,loading:C,start:p,stop:E,restart:L,setManualUrl:z,detect:F,refreshStatus:O}}const ke=500,Ce=100;function Te(e){return e.length>ke?e.slice(-ke):e}function ze(e){return e==="stderr"?"stderr":"stdout"}function K(e){try{return JSON.parse(e.data)}catch{return null}}function Z(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:ze(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function St(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function oe(e,i){if(i.length===0)return e;const o=[...e],b=new Set(e.map(y=>y.id));for(const y of i)b.has(y.id)||(b.add(y.id),o.push(y));return o.sort((y,w)=>y.id-w.id),Te(o)}function Nt(e,i){const[o,b]=r.useState([]),[y,w]=r.useState(!1),[f,k]=r.useState(!1),[U,C]=r.useState(!1),[P,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),M=r.useRef(0),R=r.useRef(e),A=r.useRef(i),_=r.useRef(0),D=r.useRef(1);(R.current!==e||A.current!==i)&&(R.current=e,A.current=i,d.current++,n.current=!0,_.current=0,D.current=1,b([]),w(!1),k(!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 E=d.current,L=++M.current;n.current=!1,w(!0);const z=(x,a)=>{const s=Te(x);b(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;_.current=c,D.current=c+1},F=x=>{if(n.current||d.current!==E||!x||typeof x!="object")return;const a=x.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)=>St(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>Z(c,l+1));z(s,s.length)},O=x=>{if(n.current||d.current!==E)return;const a=typeof x.text=="string"?x.text:typeof x.line=="string"?x.line:null;if(!a)return;const s=D.current,c=typeof x.id=="number"&&Number.isFinite(x.id)?x.id:s,l={id:c,text:a,stream:ze(x.stream),timestamp:typeof x.timestamp=="string"?x.timestamp:""};_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1),b(v=>oe(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await ie({maxLines:Ce},e);if(n.current||d.current!==E||M.current!==L)return;const s=a.lines.map((c,l)=>Z(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==E||M.current!==L)return;z([],null)}finally{!n.current&&d.current===E&&M.current===L&&w(!1)}const x=ue(e);u.current=Ue(x,{events:{"dev-server:log":a=>{const s=K(a);s&&O(s)},log:a=>{const s=K(a);s&&O(s)},history:a=>{const s=K(a);F(s)},"dev-server:history":a=>{const s=K(a);F(s)}},onReconnect:()=>{n.current||d.current!==E||ie({lastEventId:_.current,maxLines:50},e).then(a=>{if(n.current||d.current!==E)return;const s=a.lines.map((c,l)=>Z(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1)}b(c=>oe(c,s)),S(a.totalLines)}).catch(()=>{})}})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const T=r.useCallback(async()=>{if(!i||f)return;const E=d.current,L=o.length;k(!0);try{const z=await ie({maxLines:Ce,offset:L},e);if(n.current||d.current!==E)return;const F=z.lines.map((O,H)=>Z(O,H+1));b(O=>oe(F,O)),C(z.totalLines>L+F.length),S(z.totalLines)}catch{}finally{k(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{b([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:U,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const jt="This preview appears to block iframe embedding. Open it in a new tab instead.",kt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Ct="Preview is taking longer than expected and may block iframe embedding.";function Et(e){return e==="blocked"?jt:e==="error"?kt:null}function Lt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:b=null}=i,y=r.useRef(null),w=r.useRef(null),[f,k]=r.useState("unknown"),[U,C]=r.useState(null),[P]=r.useState(b),S=r.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),u=r.useCallback(j=>{k(j),C(Et(j))},[]),n=r.useCallback(()=>{k("blocked"),C(Ct)},[]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null);let j=!1;return queueMicrotask(()=>{j||(k("loading"),C(null))}),()=>{j=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const j=setTimeout(()=>{w.current=null,n()},o);return w.current=j,()=>{clearTimeout(j),w.current===j&&(w.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const j=y.current;if(!j){u("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),M=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null)},[S]);const R=r.useCallback(()=>{S(),k("unknown"),C(null)},[S]),A=R,_=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:_,isBlocked:D,blockReason:U,detectionMethod:P,iframeRef:y,resetEmbedStatus:R,setEmbedStatus:u,retry:A,embedContext:U,handleIframeLoad:d,handleIframeError:M}}const Rt=/\x1b\[[0-9;]*m/g;function me(e){return e.replace(Rt,"")}function _t(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 Dt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ut(e){if(e.stream==="stderr")return"error";const i=me(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Mt(e,i){if(!i)return e;const o=new RegExp(`(${Dt(i)})`,"ig"),b=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:b.map((w,f)=>w.toLowerCase()===y?t.jsx("mark",{children:w},`${w}-${f}`):t.jsx("span",{children:w},`${w}-${f}`))})}function At({entries:e,loading:i,loadingMore:o,hasMore:b,total:y,onLoadMore:w,isRunning:f}){const k=r.useRef(null),U=r.useRef(e.length),C=r.useRef(f),[P,S]=r.useState(!1),[u,n]=r.useState(!1),[d,M]=r.useState(""),[R,A]=r.useState("all"),_=r.useMemo(()=>R==="all"?e:e.filter(p=>Ut(p)===R),[e,R]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?_.filter(E=>me(E.text).toLowerCase().includes(p)):_},[_,d]),j=D.length,T=r.useCallback(()=>{const p=k.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,E=U.current,L=e.length>E;f&&(!p||!u&&L)&&T(),C.current=f,U.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=k.current;if(!p)return;const L=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!L)},[]);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(ee,{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:R,onChange:p=>A(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(it,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>M(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:[j," match",j===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(lt,{size:14}):t.jsx(ct,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[b&&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:w,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(ee,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:k,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.":_.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const E=me(p.text),L=_t(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[L&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:L}),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:Mt(E,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(ot,{size:14}),"New logs"]})]})]})}const Pt="devserver-preview-iframe";function Tt({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:b,blockReason:y,onRetry:w,className:f=Pt,embedContext:k}){const U=y??k??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=b.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[b,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:b,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(ee,{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(Me,{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"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),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"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Ae,{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"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),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"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]})]}):null}const Ee={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"}};function Le(e){return e instanceof Error?e.message:String(e)}function $e(e){return e==="."?"root":e}function Re(e){return e?e==="root"?".":e:null}function _e(e,i,o){return!i||e.scriptName!==i?!1:o?$e(e.cwd)===o:!0}function zt(e){return e.cwd==="."?"root":e.cwd}function $t(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Ht({addToast:e,projectId:i}){const{session:o,detectedCommands:b,previewUrl:y,isLoading:w,error:f,startServer:k,stopServer:U,restartServer:C,setPreviewUrl:P,detectCommands:S,refresh:u}=yt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",M=Ee[n]??Ee.stopped,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,loadMore:T}=Nt(i,!!i),h=y,p=o?.config?.cwd??null,[E,L]=r.useState(!0),[z,F]=r.useState(""),[O,H]=r.useState(""),[x,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:g,setEmbedStatus:Fe,resetEmbedStatus:I,iframeRef:q,isEmbedded:Oe,isBlocked:te,blockReason:re,retry:fe}=Lt(N),[pe,W]=r.useState(!1),he=r.useRef(g);r.useEffect(()=>{const m=he.current!==g;te&&m&&W(!0),g==="embedded"&&W(!1),he.current=g},[g,te]),r.useEffect(()=>{W(!1)},[h]);const J=r.useMemo(()=>{if(!x)return null;const m=Re(p);return b.find($=>!($.scriptName!==x||m&&$.cwd!==m||o?.config?.command&&$.command!==o.config.command))??b.find($=>_e($,x,p))??null},[b,o?.config?.command,x,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(Le(m),"error")})},[e,S]),r.useEffect(()=>{if(x){L(!1);return}L(!0)},[x]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&F(o.config.command);return}if(J){F(J.command);return}b.length>0&&F(m=>m.trim().length>0?m:b[0]?.command??"")},[b,J,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const se=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),be=r.useCallback(()=>{W(!1),fe()},[fe]),Be=r.useCallback(()=>{try{const m=q.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),I();return}}catch{}if(!(!h||!q.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),q.current.src=m.toString(),W(!1),I()}catch{q.current.src=h,W(!1),I()}},[h,q,I]),Q=r.useCallback(async(m,$,ne)=>{c(m);try{await $(),e(ne,"success")}catch(Ke){e(Le(Ke),"error")}finally{c(null)}},[e]),He=r.useCallback(m=>{a(m.scriptName),L(!1),F(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),Ve=r.useCallback(()=>{a(null),L(!0),e("Cleared selected dev server script.","success")},[e]),We=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const $=Re(p)??".",ne=J?.cwd??$;Q("start",()=>k(m,ne),"Dev server started.")},Xe=()=>{Q("stop",U,"Dev server stopped.")},qe=()=>{Q("restart",C,"Dev server restarted.")},Ge=()=>{const m=O.trim(),$=m.length>0?m:null;Q("preview",()=>P($),$?"Preview URL updated.":"Preview URL override cleared.")},Ie=r.useCallback(()=>{f&&u()},[f,u]),Je=n==="starting"||n==="running"||s!==null,Qe=n==="stopped"||s!==null,Ye=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(dt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${M.className}`,"data-testid":"dev-server-status-badge",children:M.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:We,disabled:Je,"data-testid":"dev-server-start-button",children:[t.jsx(ut,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Xe,disabled:Qe,"data-testid":"dev-server-stop-button",children:[t.jsx(vt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:qe,disabled:Ye,"data-testid":"dev-server-restart-button",children:[t.jsx(mt,{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"}),w&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),w&&!o&&b.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(ee,{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:Ie,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),x&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:x}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ve,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),E&&b.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."]}),E&&b.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:b.map(m=>{const $=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${$?"dev-server-candidate--selected":""}`,onClick:()=>He(m),"data-testid":`dev-server-candidate-${m.scriptName}-${$e(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:$t(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:zt(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=>F(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:Ge,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:[j??R.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(At,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,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(ft,{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:se,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(pt,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Be,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(ht,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":g,"data-embedded":Oe?"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:se,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&pe&&te&&t.jsxs("div",{className:g==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[g==="error"?t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:g==="error"?"Preview failed":"Preview blocked"}),re&&t.jsx("p",{className:"devserver-preview-blocked-context",children:re})]}),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:se,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:be,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!pe&&t.jsx(Tt,{url:h,embedStatus:g,onEmbedStatusChange:Fe,iframeRef:q,blockReason:re,onRetry:be})]})]})]})}export{Ht as DevServerView};