@runfusion/fusion 0.9.3 → 0.9.4

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 (37) hide show
  1. package/dist/bin.js +2876 -915
  2. package/dist/client/assets/{AgentDetailView-D9UWpTYr.js → AgentDetailView-5W1q48YS.js} +3 -3
  3. package/dist/client/assets/{AgentsView-DeCfRupM.js → AgentsView-DcEnemu0.js} +3 -3
  4. package/dist/client/assets/{ChatView-ChlqnJfu.js → ChatView-CTc6mP8y.js} +1 -1
  5. package/dist/client/assets/{DevServerView-B7EjWlgc.js → DevServerView-LOrDrAYm.js} +1 -1
  6. package/dist/client/assets/{DirectoryPicker-crtmkC00.js → DirectoryPicker-Bgp6PCbu.js} +1 -1
  7. package/dist/client/assets/{DocumentsView-BLxVoopL.js → DocumentsView-CNbnZ7Q3.js} +1 -1
  8. package/dist/client/assets/{InsightsView-CcdTychV.js → InsightsView-CmJwV-ZC.js} +1 -1
  9. package/dist/client/assets/{MemoryView-rSwx9Md8.js → MemoryView-Bwi5p79s.js} +1 -1
  10. package/dist/client/assets/{NodesView-Bwz0cHKV.js → NodesView-1pZii99I.js} +3 -3
  11. package/dist/client/assets/{PiExtensionsManager-Uo3E8Ae7.js → PiExtensionsManager-CokhM-MB.js} +3 -3
  12. package/dist/client/assets/{PluginManager-HtW8xVY8.js → PluginManager-cHaGKMgY.js} +1 -1
  13. package/dist/client/assets/ResearchView-BVJFgfat.css +1 -0
  14. package/dist/client/assets/ResearchView-CQDI2y7Q.js +1 -0
  15. package/dist/client/assets/{RoadmapsView-C2j64cbz.js → RoadmapsView-BTo3BT0I.js} +2 -2
  16. package/dist/client/assets/{SettingsModal-YjpwLH2V.css → SettingsModal-9HS8MnmW.css} +1 -1
  17. package/dist/client/assets/{SettingsModal-CVd9kNk7.js → SettingsModal-D5slUUsC.js} +1 -1
  18. package/dist/client/assets/SettingsModal-EEQwF0Ql.js +31 -0
  19. package/dist/client/assets/{SetupWizardModal-Dy-vQpTm.js → SetupWizardModal-1qSn8Yl0.js} +1 -1
  20. package/dist/client/assets/{SkillsView-BQwTyjxc.js → SkillsView-CY3I5OYc.js} +1 -1
  21. package/dist/client/assets/{TodoView-Dce4DrzU.js → TodoView-B1GDwwhR.js} +2 -2
  22. package/dist/client/assets/{folder-open-DWUflP4Q.js → folder-open-DPESt6bg.js} +1 -1
  23. package/dist/client/assets/{index-C3-q81dV.css → index-2_pvFDiN.css} +1 -1
  24. package/dist/client/assets/index-DNIrnlpO.js +656 -0
  25. package/dist/client/assets/{list-checks-CusZ_RMn.js → list-checks-D7D9kx7Y.js} +1 -1
  26. package/dist/client/assets/{star-C-NXZn1F.js → star-C59_6aNu.js} +1 -1
  27. package/dist/client/assets/{upload-CXJ5L6L4.js → upload-1I0eQddJ.js} +1 -1
  28. package/dist/client/assets/{users-YaA3x5mt.js → users-DH50eBCX.js} +1 -1
  29. package/dist/client/index.html +2 -2
  30. package/dist/client/version.json +1 -1
  31. package/dist/extension.js +2200 -380
  32. package/dist/pi-claude-cli/package.json +1 -1
  33. package/package.json +1 -1
  34. package/dist/client/assets/ResearchView-BV-iy9g8.js +0 -1
  35. package/dist/client/assets/ResearchView-aQkoD9QR.css +0 -1
  36. package/dist/client/assets/SettingsModal-ClnT1Lcv.js +0 -31
  37. package/dist/client/assets/index-Bs3RZu5I.js +0 -656
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-D9UWpTYr.js","assets/vendor-react-K0fH_qHe.js","assets/index-Bs3RZu5I.js","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/index-C3-q81dV.css","assets/star-C-NXZn1F.js","assets/list-checks-CusZ_RMn.js","assets/upload-CXJ5L6L4.js","assets/folder-open-DWUflP4Q.js","assets/AgentDetailView-DIBOY8V-.css"])))=>i.map(i=>d[i]);
2
- import{c as Be,s as mt,A as Ce,r as We,F as Ke,f as ht,C as _e,Z as gt,B as Ge,g as Ue,a as rt,b as De,d as pt,e as ft,h as vt,i as bt,j as xt,u as Je,P as yt,k as wt,l as jt,m as kt,n as Xe,G as Nt,S as It,L as Le,T as ze,R as Pe,X as Ze,o as Ct,p as St,q as At,t as Et,v as ge,w as Oe,x as Tt,y as Mt,z as Rt,D as _t,E as Pt,H as $t,I as lt,J as Ft,K as Ee,M as Ye,N as Dt,O as Lt,Q as zt,U as Te,V as Ot,W as et,Y as Ht,_ as qt,$ as Vt,a0 as Wt}from"./index-Bs3RZu5I.js";import{r as n,j as e,a as Kt}from"./vendor-react-K0fH_qHe.js";import{U as ot}from"./upload-CXJ5L6L4.js";import{F as Ut}from"./folder-open-DWUflP4Q.js";/**
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-5W1q48YS.js","assets/vendor-react-K0fH_qHe.js","assets/index-DNIrnlpO.js","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/index-2_pvFDiN.css","assets/star-C59_6aNu.js","assets/list-checks-D7D9kx7Y.js","assets/upload-1I0eQddJ.js","assets/folder-open-DPESt6bg.js","assets/AgentDetailView-DIBOY8V-.css"])))=>i.map(i=>d[i]);
2
+ import{c as Be,s as mt,A as Ce,r as We,F as Ke,f as ht,C as _e,Z as gt,B as Ge,g as Ue,a as rt,b as De,d as pt,e as ft,h as vt,i as bt,j as xt,u as Je,P as yt,k as wt,l as jt,m as kt,n as Xe,G as Nt,S as It,L as Le,T as ze,R as Pe,X as Ze,o as Ct,p as St,q as At,t as Et,v as ge,w as Oe,x as Tt,y as Mt,z as Rt,D as _t,E as Pt,H as $t,I as lt,J as Ft,K as Ee,M as Ye,N as Dt,O as Lt,Q as zt,U as Te,V as Ot,W as et,Y as Ht,_ as qt,$ as Vt,a0 as Wt}from"./index-DNIrnlpO.js";import{r as n,j as e,a as Kt}from"./vendor-react-K0fH_qHe.js";import{U as ot}from"./upload-1I0eQddJ.js";import{F as Ut}from"./folder-open-DPESt6bg.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=>{h("paste"),C([]),f(i.target.value),P(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",r]}),H&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(ze,{size:14}),H]})]}),m==="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:b})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(Ke,{size:14}),e.jsxs("span",{children:[p.length," agent",p.length!==1?"s":""," found"]})]}),p.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>x(p.map(i=>i.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>x([]),children:"Clear agents"})]}),p.length>0?e.jsx("div",{className:"agent-import-agent-list",children:p.map((i,w)=>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:T.includes(i.name),onChange:()=>Se(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?"...":""]})]})]},w))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),k.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(Ke,{size:14}),e.jsxs("span",{children:[k.length," skill",k.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>te(k.map(i=>i.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>te([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:k.map((i,w)=>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:R.includes(i.name),onChange:()=>Ae(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}-${w}`))})]}),q&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(ze,{size:14}),q]})]}),m==="result"&&S&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(_e,{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:S.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[S.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[S.created.length," created"]})}),S.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[S.skipped.length," skipped (already exist)"]})}),S.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[S.errors.length," error",S.errors.length!==1?"s":""]})})]}),S.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:S.created.map((i,w)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(_e,{size:12}),e.jsx("span",{children:i.name})]},w))}),S.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:S.errors.map((i,w)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(Ze,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},w))}),S.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:[S.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[S.skills.imported.length," skill",S.skills.imported.length!==1?"s":""," imported"]})}),S.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[S.skills.skipped.length," skill",S.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),S.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[S.skills.errors.length," skill",S.skills.errors.length!==1?"s":""," error",S.skills.errors.length!==1?"s":""]})}),S.skills.imported.length===0&&S.skills.skipped.length===0&&S.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"})})]}),S.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:S.skills.imported.map((i,w)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(_e,{size:12}),e.jsx("span",{children:i.name})]},w))}),S.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:S.skills.errors.map((i,w)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(Ze,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},w))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[m==="preview"&&e.jsx("button",{className:"btn",onClick:()=>c("input"),disabled:Q,children:"Back"}),e.jsx("button",{className:"btn",onClick:he,disabled:Q,children:m==="result"?"Close":"Cancel"}),m==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void ve(),disabled:ae||(r==="directory"?g.length===0:r==="browse"?!L:!u.trim()),children:ae?e.jsxs(e.Fragment,{children:[e.jsx(Le,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),m==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void we(),disabled:Q||D===0&&K===0,children:Q?e.jsxs(e.Fragment,{children:[e.jsx(Le,{size:14,className:"spin"}),se]}):`Import ${ke}`})]})]})}):null}const Dn=n.lazy(()=>Wt(()=>import("./AgentDetailView-D9UWpTYr.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(a=>({default:a.AgentDetailView}))),Re=[{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:"✦"}],Ve=[.1,.25,.5,1,2,3,5,10];function $e(a){switch(a){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 Fe(a,l){switch(l){case"running":return`${a}--running`;case"active":return`${a}--active`;case"paused":return`${a}--paused`;case"error":return`${a}--error`;case"terminated":return`${a}--terminated`;case"idle":default:return`${a}--idle`}}function dt({node:a,onSelect:l,onToggle:y,isExpanded:d,getChildCount:m,getHealthStatus:c,getRoleIcon:r,getSkillBadges:h}){const{agent:u,children:f,depth:g}=a,C=m(u.id),b=d(u.id),E=c(u),p=$e(u.state),M=Fe("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(g,4)}`,children:[e.jsx("button",{className:`agent-tree__toggle${C===0?" agent-tree__toggle--leaf":""}`,onClick:()=>C>0&&y(u.id),title:C>0?b?"Collapse":"Expand":"No employees","aria-label":C>0?b?"Collapse":"Expand":"No employees",children:C>0?b?e.jsx(Lt,{size:16}):e.jsx(lt,{size:16}):e.jsx(Ge,{size:14})}),e.jsxs("div",{className:"agent-tree__content",onClick:()=>l(u.id),role:"button",tabIndex:0,onKeyDown:k=>k.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 ${p}`,children:u.state}),e.jsx("span",{className:"agent-tree__health",style:{color:E.color},title:E.label,children:E.icon}),C>0&&e.jsxs("span",{className:"agent-tree__count text-secondary",children:["(",C,")"]}),(()=>{const k=h(u);return k.length===0?null:e.jsxs("span",{className:"agent-tree__skill",title:k.join(", "),children:[k[0],k.length>1&&` +${k.length-1}`]})})()]})]}),b&&f.length>0&&e.jsx("div",{className:"agent-tree__children",children:f.map(k=>e.jsx(dt,{node:k,onSelect:l,onToggle:y,isExpanded:d,getChildCount:m,getHealthStatus:c,getRoleIcon:r,getSkillBadges:h},k.agent.id))})]})}function ut({node:a,onSelect:l,getHealthStatus:y,getRoleIcon:d,getSkillBadges:m}){const{agent:c,children:r}=a,h=y(c),u=$e(c.state),f=Fe("org-chart-node-card",c.state);return e.jsxs("div",{className:`org-chart-node${r.length>0?" org-chart-node--has-children":""}`,children:[e.jsxs("div",{className:f,onClick:()=>l(c.id),role:"button",tabIndex:0,onKeyDown:g=>g.key==="Enter"&&l(c.id),children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:d(c.role)}),e.jsx("span",{className:"org-chart-node__name",children:c.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${u}`,children:c.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:h.color},title:h.label,children:[h.icon,!h.stateDerived&&e.jsx("span",{className:"text-secondary",children:h.label})]}),(()=>{const g=m(c);if(g.length===0)return null;const C=g.slice(0,2),b=g.length-2;return e.jsxs(e.Fragment,{children:[C.map(E=>e.jsx("span",{className:"org-chart-node__skill",children:E},E)),b>0&&e.jsxs("span",{className:"org-chart-node__skill",children:["+",b]})]})})()]})]}),r.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${c.name} employees`,children:r.map(g=>e.jsx(ut,{node:g,onSelect:l,getHealthStatus:y,getRoleIcon:d,getSkillBadges:m},g.agent.id))})]})}function Ln({addToast:a,projectId:l,onOpenTaskLogs:y}){const[d,m]=n.useState(!1),[c,r]=n.useState("all"),{agents:h,stats:u,isLoading:f,loadAgents:g}=Ct(l,{filterState:c,showSystemAgents:d}),[C,b]=n.useState(!1),[E,p]=n.useState(!1),[M,k]=n.useState(null),[N,T]=n.useState(()=>{if(typeof window>"u")return"list";const t=Ue("fn-agent-view",l);return t==="list"||t==="board"||t==="tree"||t==="org"?t:"list"}),[x,R]=n.useState([]),[te,ae]=n.useState(!1),[X,Q]=n.useState(!1),ce=n.useRef(null),{confirm:H}=St(),P=n.useRef(null),S=n.useId();n.useEffect(()=>{const t=Ue("fn-agent-view",l);if(t==="list"||t==="board"||t==="tree"||t==="org"){T(t);return}T("list")},[l]),n.useEffect(()=>{rt("fn-agent-view",N,l)},[N,l]);const[xe,q]=n.useState(null),pe=n.useRef(null),[de,ne]=n.useState(null),[fe,B]=n.useState(null),[Z,G]=n.useState({}),[L,ie]=n.useState(1),[ue,re]=n.useState(!1),[O,V]=n.useState(new Set),[J,me]=n.useState(new Map),W=n.useRef(!0);n.useEffect(()=>(W.current=!0,()=>{W.current=!1}),[]),n.useEffect(()=>{At(l).then(t=>{W.current&&ie(t.heartbeatMultiplier??1)}).catch(()=>{})},[l]);const he=n.useCallback(async t=>{const o=Number.isFinite(t)&&t>0?t:1;ie(o),re(!0);try{await Et({heartbeatMultiplier:o},l),a(`Heartbeat speed set to ×${o.toFixed(1)}`,"success")}catch(j){a(`Failed to save heartbeat multiplier: ${ge(j)}`,"error")}finally{W.current&&re(!1)}},[l,a]),Y=n.useMemo(()=>J.size===0?h:h.map(t=>{const o=J.get(t.id);return o?{...t,state:o}:t}),[h,J]),oe=cn(Y,l),ee=n.useMemo(()=>Y.filter(t=>d||!Oe(t)),[Y,d]),ve=n.useMemo(()=>Y.filter(t=>t.state!=="active"&&t.state!=="running"?!1:d||!Oe(t)),[Y,d]),we=n.useMemo(()=>{if(d)return x;const t=o=>Oe(o.agent)?null:{...o,children:o.children.map(t).filter(j=>j!==null)};return x.map(t).filter(o=>o!==null)},[x,d]);n.useEffect(()=>{if(N!=="org")return;let t=!1;return ae(!0),Tt(l,{includeEphemeral:d}).then(o=>{t||R(o)}).catch(o=>{t||(a(`Failed to load org chart: ${ge(o)}`,"error"),R([]))}).finally(()=>{t||ae(!1)}),()=>{t=!0}},[N,l,d,a]),n.useEffect(()=>{const t=setInterval(()=>{g()},3e4);return()=>{clearInterval(t)}},[g]),n.useEffect(()=>{if(!X)return;const t=j=>{const A=j.target;A&&(ce.current?.contains(A)||P.current?.contains(A)||Q(!1))},o=j=>{j.key==="Escape"&&(Q(!1),P.current?.focus())};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",o),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",o)}},[X]);const D=async(t,o)=>{if(!O.has(t)){V(j=>new Set(j).add(t)),me(j=>{const A=new Map(j);return A.set(t,o),A});try{await Ht(t,o,l),a(`Agent state updated to ${o}`,"success"),await g(),me(j=>{const A=new Map(j);return A.delete(t),A})}catch(j){me(A=>{const s=new Map(A);return s.delete(t),s}),a(`Failed to update state: ${ge(j)}`,"error")}finally{V(j=>{const A=new Set(j);return A.delete(t),A})}}},K=async(t,o)=>{if(await H({title:"Delete Agent",message:`Delete agent "${o}"? This cannot be undone.`,danger:!0}))try{await Vt(t,l),a(`Agent "${o}" deleted`,"success"),g()}catch(A){a(`Failed to delete agent: ${ge(A)}`,"error")}},be=async(t,o)=>{const j=h.find(A=>A.id===t);if(j){if(j.role===o){q(null);return}try{await Te(t,{role:o},l),a(`Agent role updated to ${Re.find(A=>A.value===o)?.label??o}`,"success"),q(null),g()}catch(A){a(`Failed to update role: ${ge(A)}`,"error")}}},je=(t,o)=>{t.key==="Escape"&&q(null)},ke=async(t,o)=>{fe===t.id&&(B(null),G(j=>{const A={...j};return delete A[t.id],A})),ne(t.id);try{await Te(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:o}},l),a(`Heartbeat interval updated to ${et(o)} for ${t.name}`,"success"),g()}catch(j){a(`Failed to update heartbeat interval: ${ge(j)}`,"error")}finally{ne(null)}},se=async t=>{const o=Z[t.id]??"";if(o.trim()===""){a("Please enter a heartbeat interval in minutes","error");return}const j=Number(o);if(isNaN(j)){a("Heartbeat interval must be a valid number","error");return}if(j<=0){a("Heartbeat interval must be greater than 0","error");return}if(j>=1&&j<5){ne(t.id);try{await Te(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:Ot}},l),a(`Heartbeat interval set to 5 minutes (minimum). ${j} minute${j!==1?"s":""} was below the 5-minute minimum.`,"success"),B(null),G(s=>{const I={...s};return delete I[t.id],I}),g()}catch(s){a(`Failed to update heartbeat interval: ${ge(s)}`,"error")}finally{ne(null)}return}const A=Math.round(j*6e4);ne(t.id);try{await Te(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:A}},l),a(`Heartbeat interval updated to ${et(A)} for ${t.name}`,"success"),B(null),G(s=>{const I={...s};return delete I[t.id],I}),g()}catch(s){a(`Failed to update heartbeat interval: ${ge(s)}`,"error")}finally{ne(null)}},Se=t=>{const o=We(t.runtimeConfig?.heartbeatIntervalMs),j=Math.round(o/6e4);B(t.id),G(A=>({...A,[t.id]:String(j)}))},Ae=n.useCallback(()=>{k(null)},[]),i=n.useCallback(t=>{k(t)},[]),w=async(t,o)=>{try{await qt(t,l,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),a(`Heartbeat run started for ${o}`,"success"),g()}catch(j){a(`Failed to start heartbeat run: ${ge(j)}`,"error")}},_=t=>Re.find(o=>o.value===t)?.label??t,U=t=>Re.find(o=>o.value===t)?.icon??"◆",$=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],z=t=>zt(t),Ne=f&&h.length===0;return e.jsxs("div",{className:"agents-view",children:[e.jsxs("div",{className:"agents-view-header",children:[e.jsxs("div",{className:"agents-view-title",children:[e.jsx(Ge,{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${N==="list"?" active":""}`,onClick:()=>T("list"),title:"List view","aria-label":"List view","aria-pressed":N==="list",children:e.jsx(Mt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${N==="board"?" active":""}`,onClick:()=>T("board"),title:"Board view","aria-label":"Board view","aria-pressed":N==="board",children:e.jsx(Ce,{size:16})}),e.jsx("button",{className:`view-toggle-btn${N==="tree"?" active":""}`,onClick:()=>T("tree"),title:"Tree view","aria-label":"Tree view","aria-pressed":N==="tree",children:e.jsx(Rt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${N==="org"?" active":""}`,onClick:()=>T("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":N==="org",children:e.jsx(Jt,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:P,className:`btn-icon agent-controls-trigger${X?" agent-controls-trigger--active":""}`,onClick:()=>Q(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":X,"aria-controls":S,children:e.jsx(Zt,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void g(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Pe,{size:16,className:f?"spin":void 0})}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{b(!0),Q(!1)},children:[e.jsx(_t,{size:16}),"New Agent"]})]})]})]}),X&&e.jsxs("div",{ref:ce,id:S,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(Pt,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:c,onChange:t=>r(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"}),e.jsx("option",{value:"terminated",children:"Terminated"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:d,onChange:t=>m(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]}),e.jsx("div",{className:"agent-controls-actions",children:e.jsxs("button",{className:"btn",onClick:()=>{p(!0),Q(!1)},children:[e.jsx(ot,{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:L,onChange:t=>{const o=Number(t.target.value);he(Number.isFinite(o)&&o>0?o:1)},disabled:ue}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",L.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(Ve.reduce((t,o)=>Math.abs(o-L)<Math.abs(t-L)?o:t,Ve[0])),onChange:t=>{const o=Number(t.target.value);he(Number.isFinite(o)&&o>0?o:1)},disabled:ue,"aria-label":"Heartbeat speed preset",children:Ve.map(t=>e.jsxs("option",{value:String(t),children:["×",t]},t))})]}),e.jsx("small",{className:"text-secondary",children:"Scales all agent heartbeat intervals. ×0.5 = twice as fast, ×2.0 = twice as slow. Default: ×1.0"})]})}),e.jsx(rn,{agents:ee})]}),e.jsxs("div",{className:"agents-view-content",children:[e.jsx(an,{stats:u}),e.jsx(nn,{agents:ve,projectId:l,onAgentSelect:k,onOpenTaskLogs:y}),e.jsx(Pn,{isOpen:C,onClose:()=>b(!1),onCreated:()=>{b(!1),g()},projectId:l}),e.jsx(Fn,{isOpen:E,onClose:()=>p(!1),onImported:()=>void g(),projectId:l}),Ne?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Pe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):N==="tree"?e.jsx("div",{className:"agent-tree__view",children:ee.length===0?e.jsx(Me,{onCtaClick:()=>b(!0)}):oe.rootNodes.map(t=>e.jsx(dt,{node:t,onSelect:k,onToggle:oe.toggleExpand,isExpanded:oe.isExpanded,getChildCount:o=>oe.getChildren(o).length,getHealthStatus:z,getRoleIcon:U,getSkillBadges:$},t.agent.id))}):N==="org"?e.jsx("div",{className:"agent-org-chart","data-testid":"agent-org-chart",children:te?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Pe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):we.length===0?e.jsx(Me,{onCtaClick:()=>b(!0)}):we.map(t=>e.jsx(ut,{node:t,onSelect:k,getHealthStatus:z,getRoleIcon:U,getSkillBadges:$},t.agent.id))}):N==="board"?e.jsx("div",{className:"agent-board",children:ee.length===0?e.jsx(Me,{onCtaClick:()=>b(!0)}):ee.map(t=>{const o=z(t),j=$e(t.state),A=Fe("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${A}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>k(t.id),role:"button",tabIndex:0,onKeyDown:s=>s.key==="Enter"&&k(t.id),children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:U(t.role)}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:_(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${j}`,children:t.state})]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:o.color},title:o.label,children:[o.icon,!o.stateDerived&&` ${o.label}`]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:ee.length===0?e.jsx(Me,{onCtaClick:()=>b(!0)}):ee.map(t=>{const o=z(t),j=$e(t.state),A=Fe("agent-card",t.state),s=We(t.runtimeConfig?.heartbeatIntervalMs),I=$t(s),le=de===t.id;return e.jsxs("div",{className:`agent-card ${A}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info agent-info--clickable",onClick:()=>k(t.id),role:"button",tabIndex:0,onKeyDown:v=>v.key==="Enter"&&k(t.id),children:[xe===t.id?e.jsx("select",{ref:pe,className:"select agent-role-select",value:t.role,onChange:v=>void be(t.id,v.target.value),onKeyDown:v=>je(v,t.id),onBlur:()=>q(null),autoFocus:!0,children:Re.map(v=>e.jsxs("option",{value:v.value,children:[v.icon," ",v.label]},v.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:v=>{v.stopPropagation(),q(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.stopPropagation(),q(t.id))},children:U(t.role)}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(lt,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${j}`,children:t.state}),e.jsxs("span",{className:"badge",style:{color:o.color},title:o.label,children:[o.icon,!o.stateDerived&&` ${o.label}`]}),e.jsx("span",{className:"badge text-secondary",children:_(t.role)}),(()=>{const v=$(t);if(v.length===0)return null;const F=v.slice(0,2),ye=v.length-2;return e.jsxs(e.Fragment,{children:[F.map(Qe=>e.jsx("span",{className:"badge badge-skill",children:Qe},Qe)),ye>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",ye]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),fe===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:Z[t.id]??"",onChange:v=>G(F=>({...F,[t.id]:v.target.value})),onKeyDown:v=>{v.key==="Enter"?se(t):v.key==="Escape"&&(B(null),G(F=>{const ye={...F};return delete ye[t.id],ye}))},disabled:le,"aria-label":`Custom heartbeat interval in minutes for ${t.name}`}),e.jsx("span",{className:"text-secondary",children:"min"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>void se(t),disabled:le,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>{B(null),G(v=>{const F={...v};return delete F[t.id],F})},disabled:le,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:s,onChange:v=>{const F=v.target.value;F==="__custom__"?Se(t):ke(t,Number(F))},disabled:le,"aria-label":`Set heartbeat interval for ${t.name}`,children:[I.map(v=>e.jsx("option",{value:v.value,children:v.label},v.value)),Ft.some(v=>v.value===s)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),le&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const v=new Date(t.lastHeartbeatAt),F=new Date(v.getTime()+s),ye=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:v.toLocaleString(),children:["Last: ",v.toLocaleTimeString()]}),ye&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:F.toLocaleString(),children:["Next: ",F.toLocaleTimeString()]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[t.state==="idle"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"active"),disabled:O.has(t.id),title:"Activate",children:[e.jsx(Ee,{size:14})," Start"]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void w(t.id,t.name),disabled:O.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(Ce,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"paused"),disabled:O.has(t.id),title:"Pause",children:[e.jsx(Ye,{size:14})," Pause"]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"active"),disabled:O.has(t.id),title:"Resume",children:[e.jsx(Ee,{size:14})," Resume"]}),t.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 ${t.name}`,children:[e.jsx(Ce,{size:14})," Running"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"paused"),disabled:O.has(t.id),title:"Pause",children:[e.jsx(Ye,{size:14})," Pause"]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"active"),disabled:O.has(t.id),title:"Retry",children:[e.jsx(Ee,{size:14})," Retry"]}),t.state==="terminated"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"active"),disabled:O.has(t.id),title:"Start",children:[e.jsx(Ee,{size:14})," Start"]}),e.jsx("button",{className:"btn btn--sm agent-card-details-btn",onClick:()=>k(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:"View Details"}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void K(t.id,t.name),title:"Delete",children:[e.jsx(Dt,{size:14})," Delete"]})]})]},t.id)})})]}),M&&e.jsx(n.Suspense,{fallback:null,children:e.jsx(Dn,{agentId:M,projectId:l,onClose:Ae,addToast:a,onChildClick:i})})]})}const Vn=Object.freeze(Object.defineProperty({__proto__:null,AgentsView:Ln},Symbol.toStringTag,{value:"Module"}));export{Vn as A,Rn as S};
522
+ Agent instructions go here...`,value:u,onChange:i=>{h("paste"),C([]),f(i.target.value),P(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",r]}),H&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(ze,{size:14}),H]})]}),m==="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:b})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(Ke,{size:14}),e.jsxs("span",{children:[p.length," agent",p.length!==1?"s":""," found"]})]}),p.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>x(p.map(i=>i.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>x([]),children:"Clear agents"})]}),p.length>0?e.jsx("div",{className:"agent-import-agent-list",children:p.map((i,w)=>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:T.includes(i.name),onChange:()=>Se(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?"...":""]})]})]},w))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),k.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(Ke,{size:14}),e.jsxs("span",{children:[k.length," skill",k.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>te(k.map(i=>i.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>te([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:k.map((i,w)=>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:R.includes(i.name),onChange:()=>Ae(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}-${w}`))})]}),q&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(ze,{size:14}),q]})]}),m==="result"&&S&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(_e,{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:S.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[S.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[S.created.length," created"]})}),S.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[S.skipped.length," skipped (already exist)"]})}),S.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[S.errors.length," error",S.errors.length!==1?"s":""]})})]}),S.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:S.created.map((i,w)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(_e,{size:12}),e.jsx("span",{children:i.name})]},w))}),S.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:S.errors.map((i,w)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(Ze,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},w))}),S.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:[S.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[S.skills.imported.length," skill",S.skills.imported.length!==1?"s":""," imported"]})}),S.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[S.skills.skipped.length," skill",S.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),S.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[S.skills.errors.length," skill",S.skills.errors.length!==1?"s":""," error",S.skills.errors.length!==1?"s":""]})}),S.skills.imported.length===0&&S.skills.skipped.length===0&&S.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"})})]}),S.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:S.skills.imported.map((i,w)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(_e,{size:12}),e.jsx("span",{children:i.name})]},w))}),S.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:S.skills.errors.map((i,w)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(Ze,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},w))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[m==="preview"&&e.jsx("button",{className:"btn",onClick:()=>c("input"),disabled:Q,children:"Back"}),e.jsx("button",{className:"btn",onClick:he,disabled:Q,children:m==="result"?"Close":"Cancel"}),m==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void ve(),disabled:ae||(r==="directory"?g.length===0:r==="browse"?!L:!u.trim()),children:ae?e.jsxs(e.Fragment,{children:[e.jsx(Le,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),m==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void we(),disabled:Q||D===0&&K===0,children:Q?e.jsxs(e.Fragment,{children:[e.jsx(Le,{size:14,className:"spin"}),se]}):`Import ${ke}`})]})]})}):null}const Dn=n.lazy(()=>Wt(()=>import("./AgentDetailView-5W1q48YS.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(a=>({default:a.AgentDetailView}))),Re=[{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:"✦"}],Ve=[.1,.25,.5,1,2,3,5,10];function $e(a){switch(a){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 Fe(a,l){switch(l){case"running":return`${a}--running`;case"active":return`${a}--active`;case"paused":return`${a}--paused`;case"error":return`${a}--error`;case"terminated":return`${a}--terminated`;case"idle":default:return`${a}--idle`}}function dt({node:a,onSelect:l,onToggle:y,isExpanded:d,getChildCount:m,getHealthStatus:c,getRoleIcon:r,getSkillBadges:h}){const{agent:u,children:f,depth:g}=a,C=m(u.id),b=d(u.id),E=c(u),p=$e(u.state),M=Fe("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(g,4)}`,children:[e.jsx("button",{className:`agent-tree__toggle${C===0?" agent-tree__toggle--leaf":""}`,onClick:()=>C>0&&y(u.id),title:C>0?b?"Collapse":"Expand":"No employees","aria-label":C>0?b?"Collapse":"Expand":"No employees",children:C>0?b?e.jsx(Lt,{size:16}):e.jsx(lt,{size:16}):e.jsx(Ge,{size:14})}),e.jsxs("div",{className:"agent-tree__content",onClick:()=>l(u.id),role:"button",tabIndex:0,onKeyDown:k=>k.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 ${p}`,children:u.state}),e.jsx("span",{className:"agent-tree__health",style:{color:E.color},title:E.label,children:E.icon}),C>0&&e.jsxs("span",{className:"agent-tree__count text-secondary",children:["(",C,")"]}),(()=>{const k=h(u);return k.length===0?null:e.jsxs("span",{className:"agent-tree__skill",title:k.join(", "),children:[k[0],k.length>1&&` +${k.length-1}`]})})()]})]}),b&&f.length>0&&e.jsx("div",{className:"agent-tree__children",children:f.map(k=>e.jsx(dt,{node:k,onSelect:l,onToggle:y,isExpanded:d,getChildCount:m,getHealthStatus:c,getRoleIcon:r,getSkillBadges:h},k.agent.id))})]})}function ut({node:a,onSelect:l,getHealthStatus:y,getRoleIcon:d,getSkillBadges:m}){const{agent:c,children:r}=a,h=y(c),u=$e(c.state),f=Fe("org-chart-node-card",c.state);return e.jsxs("div",{className:`org-chart-node${r.length>0?" org-chart-node--has-children":""}`,children:[e.jsxs("div",{className:f,onClick:()=>l(c.id),role:"button",tabIndex:0,onKeyDown:g=>g.key==="Enter"&&l(c.id),children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:d(c.role)}),e.jsx("span",{className:"org-chart-node__name",children:c.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${u}`,children:c.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:h.color},title:h.label,children:[h.icon,!h.stateDerived&&e.jsx("span",{className:"text-secondary",children:h.label})]}),(()=>{const g=m(c);if(g.length===0)return null;const C=g.slice(0,2),b=g.length-2;return e.jsxs(e.Fragment,{children:[C.map(E=>e.jsx("span",{className:"org-chart-node__skill",children:E},E)),b>0&&e.jsxs("span",{className:"org-chart-node__skill",children:["+",b]})]})})()]})]}),r.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${c.name} employees`,children:r.map(g=>e.jsx(ut,{node:g,onSelect:l,getHealthStatus:y,getRoleIcon:d,getSkillBadges:m},g.agent.id))})]})}function Ln({addToast:a,projectId:l,onOpenTaskLogs:y}){const[d,m]=n.useState(!1),[c,r]=n.useState("all"),{agents:h,stats:u,isLoading:f,loadAgents:g}=Ct(l,{filterState:c,showSystemAgents:d}),[C,b]=n.useState(!1),[E,p]=n.useState(!1),[M,k]=n.useState(null),[N,T]=n.useState(()=>{if(typeof window>"u")return"list";const t=Ue("fn-agent-view",l);return t==="list"||t==="board"||t==="tree"||t==="org"?t:"list"}),[x,R]=n.useState([]),[te,ae]=n.useState(!1),[X,Q]=n.useState(!1),ce=n.useRef(null),{confirm:H}=St(),P=n.useRef(null),S=n.useId();n.useEffect(()=>{const t=Ue("fn-agent-view",l);if(t==="list"||t==="board"||t==="tree"||t==="org"){T(t);return}T("list")},[l]),n.useEffect(()=>{rt("fn-agent-view",N,l)},[N,l]);const[xe,q]=n.useState(null),pe=n.useRef(null),[de,ne]=n.useState(null),[fe,B]=n.useState(null),[Z,G]=n.useState({}),[L,ie]=n.useState(1),[ue,re]=n.useState(!1),[O,V]=n.useState(new Set),[J,me]=n.useState(new Map),W=n.useRef(!0);n.useEffect(()=>(W.current=!0,()=>{W.current=!1}),[]),n.useEffect(()=>{At(l).then(t=>{W.current&&ie(t.heartbeatMultiplier??1)}).catch(()=>{})},[l]);const he=n.useCallback(async t=>{const o=Number.isFinite(t)&&t>0?t:1;ie(o),re(!0);try{await Et({heartbeatMultiplier:o},l),a(`Heartbeat speed set to ×${o.toFixed(1)}`,"success")}catch(j){a(`Failed to save heartbeat multiplier: ${ge(j)}`,"error")}finally{W.current&&re(!1)}},[l,a]),Y=n.useMemo(()=>J.size===0?h:h.map(t=>{const o=J.get(t.id);return o?{...t,state:o}:t}),[h,J]),oe=cn(Y,l),ee=n.useMemo(()=>Y.filter(t=>d||!Oe(t)),[Y,d]),ve=n.useMemo(()=>Y.filter(t=>t.state!=="active"&&t.state!=="running"?!1:d||!Oe(t)),[Y,d]),we=n.useMemo(()=>{if(d)return x;const t=o=>Oe(o.agent)?null:{...o,children:o.children.map(t).filter(j=>j!==null)};return x.map(t).filter(o=>o!==null)},[x,d]);n.useEffect(()=>{if(N!=="org")return;let t=!1;return ae(!0),Tt(l,{includeEphemeral:d}).then(o=>{t||R(o)}).catch(o=>{t||(a(`Failed to load org chart: ${ge(o)}`,"error"),R([]))}).finally(()=>{t||ae(!1)}),()=>{t=!0}},[N,l,d,a]),n.useEffect(()=>{const t=setInterval(()=>{g()},3e4);return()=>{clearInterval(t)}},[g]),n.useEffect(()=>{if(!X)return;const t=j=>{const A=j.target;A&&(ce.current?.contains(A)||P.current?.contains(A)||Q(!1))},o=j=>{j.key==="Escape"&&(Q(!1),P.current?.focus())};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",o),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",o)}},[X]);const D=async(t,o)=>{if(!O.has(t)){V(j=>new Set(j).add(t)),me(j=>{const A=new Map(j);return A.set(t,o),A});try{await Ht(t,o,l),a(`Agent state updated to ${o}`,"success"),await g(),me(j=>{const A=new Map(j);return A.delete(t),A})}catch(j){me(A=>{const s=new Map(A);return s.delete(t),s}),a(`Failed to update state: ${ge(j)}`,"error")}finally{V(j=>{const A=new Set(j);return A.delete(t),A})}}},K=async(t,o)=>{if(await H({title:"Delete Agent",message:`Delete agent "${o}"? This cannot be undone.`,danger:!0}))try{await Vt(t,l),a(`Agent "${o}" deleted`,"success"),g()}catch(A){a(`Failed to delete agent: ${ge(A)}`,"error")}},be=async(t,o)=>{const j=h.find(A=>A.id===t);if(j){if(j.role===o){q(null);return}try{await Te(t,{role:o},l),a(`Agent role updated to ${Re.find(A=>A.value===o)?.label??o}`,"success"),q(null),g()}catch(A){a(`Failed to update role: ${ge(A)}`,"error")}}},je=(t,o)=>{t.key==="Escape"&&q(null)},ke=async(t,o)=>{fe===t.id&&(B(null),G(j=>{const A={...j};return delete A[t.id],A})),ne(t.id);try{await Te(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:o}},l),a(`Heartbeat interval updated to ${et(o)} for ${t.name}`,"success"),g()}catch(j){a(`Failed to update heartbeat interval: ${ge(j)}`,"error")}finally{ne(null)}},se=async t=>{const o=Z[t.id]??"";if(o.trim()===""){a("Please enter a heartbeat interval in minutes","error");return}const j=Number(o);if(isNaN(j)){a("Heartbeat interval must be a valid number","error");return}if(j<=0){a("Heartbeat interval must be greater than 0","error");return}if(j>=1&&j<5){ne(t.id);try{await Te(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:Ot}},l),a(`Heartbeat interval set to 5 minutes (minimum). ${j} minute${j!==1?"s":""} was below the 5-minute minimum.`,"success"),B(null),G(s=>{const I={...s};return delete I[t.id],I}),g()}catch(s){a(`Failed to update heartbeat interval: ${ge(s)}`,"error")}finally{ne(null)}return}const A=Math.round(j*6e4);ne(t.id);try{await Te(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:A}},l),a(`Heartbeat interval updated to ${et(A)} for ${t.name}`,"success"),B(null),G(s=>{const I={...s};return delete I[t.id],I}),g()}catch(s){a(`Failed to update heartbeat interval: ${ge(s)}`,"error")}finally{ne(null)}},Se=t=>{const o=We(t.runtimeConfig?.heartbeatIntervalMs),j=Math.round(o/6e4);B(t.id),G(A=>({...A,[t.id]:String(j)}))},Ae=n.useCallback(()=>{k(null)},[]),i=n.useCallback(t=>{k(t)},[]),w=async(t,o)=>{try{await qt(t,l,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),a(`Heartbeat run started for ${o}`,"success"),g()}catch(j){a(`Failed to start heartbeat run: ${ge(j)}`,"error")}},_=t=>Re.find(o=>o.value===t)?.label??t,U=t=>Re.find(o=>o.value===t)?.icon??"◆",$=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],z=t=>zt(t),Ne=f&&h.length===0;return e.jsxs("div",{className:"agents-view",children:[e.jsxs("div",{className:"agents-view-header",children:[e.jsxs("div",{className:"agents-view-title",children:[e.jsx(Ge,{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${N==="list"?" active":""}`,onClick:()=>T("list"),title:"List view","aria-label":"List view","aria-pressed":N==="list",children:e.jsx(Mt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${N==="board"?" active":""}`,onClick:()=>T("board"),title:"Board view","aria-label":"Board view","aria-pressed":N==="board",children:e.jsx(Ce,{size:16})}),e.jsx("button",{className:`view-toggle-btn${N==="tree"?" active":""}`,onClick:()=>T("tree"),title:"Tree view","aria-label":"Tree view","aria-pressed":N==="tree",children:e.jsx(Rt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${N==="org"?" active":""}`,onClick:()=>T("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":N==="org",children:e.jsx(Jt,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:P,className:`btn-icon agent-controls-trigger${X?" agent-controls-trigger--active":""}`,onClick:()=>Q(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":X,"aria-controls":S,children:e.jsx(Zt,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void g(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Pe,{size:16,className:f?"spin":void 0})}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{b(!0),Q(!1)},children:[e.jsx(_t,{size:16}),"New Agent"]})]})]})]}),X&&e.jsxs("div",{ref:ce,id:S,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(Pt,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:c,onChange:t=>r(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"}),e.jsx("option",{value:"terminated",children:"Terminated"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:d,onChange:t=>m(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]}),e.jsx("div",{className:"agent-controls-actions",children:e.jsxs("button",{className:"btn",onClick:()=>{p(!0),Q(!1)},children:[e.jsx(ot,{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:L,onChange:t=>{const o=Number(t.target.value);he(Number.isFinite(o)&&o>0?o:1)},disabled:ue}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",L.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(Ve.reduce((t,o)=>Math.abs(o-L)<Math.abs(t-L)?o:t,Ve[0])),onChange:t=>{const o=Number(t.target.value);he(Number.isFinite(o)&&o>0?o:1)},disabled:ue,"aria-label":"Heartbeat speed preset",children:Ve.map(t=>e.jsxs("option",{value:String(t),children:["×",t]},t))})]}),e.jsx("small",{className:"text-secondary",children:"Scales all agent heartbeat intervals. ×0.5 = twice as fast, ×2.0 = twice as slow. Default: ×1.0"})]})}),e.jsx(rn,{agents:ee})]}),e.jsxs("div",{className:"agents-view-content",children:[e.jsx(an,{stats:u}),e.jsx(nn,{agents:ve,projectId:l,onAgentSelect:k,onOpenTaskLogs:y}),e.jsx(Pn,{isOpen:C,onClose:()=>b(!1),onCreated:()=>{b(!1),g()},projectId:l}),e.jsx(Fn,{isOpen:E,onClose:()=>p(!1),onImported:()=>void g(),projectId:l}),Ne?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Pe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):N==="tree"?e.jsx("div",{className:"agent-tree__view",children:ee.length===0?e.jsx(Me,{onCtaClick:()=>b(!0)}):oe.rootNodes.map(t=>e.jsx(dt,{node:t,onSelect:k,onToggle:oe.toggleExpand,isExpanded:oe.isExpanded,getChildCount:o=>oe.getChildren(o).length,getHealthStatus:z,getRoleIcon:U,getSkillBadges:$},t.agent.id))}):N==="org"?e.jsx("div",{className:"agent-org-chart","data-testid":"agent-org-chart",children:te?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Pe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):we.length===0?e.jsx(Me,{onCtaClick:()=>b(!0)}):we.map(t=>e.jsx(ut,{node:t,onSelect:k,getHealthStatus:z,getRoleIcon:U,getSkillBadges:$},t.agent.id))}):N==="board"?e.jsx("div",{className:"agent-board",children:ee.length===0?e.jsx(Me,{onCtaClick:()=>b(!0)}):ee.map(t=>{const o=z(t),j=$e(t.state),A=Fe("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${A}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>k(t.id),role:"button",tabIndex:0,onKeyDown:s=>s.key==="Enter"&&k(t.id),children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:U(t.role)}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:_(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${j}`,children:t.state})]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:o.color},title:o.label,children:[o.icon,!o.stateDerived&&` ${o.label}`]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:ee.length===0?e.jsx(Me,{onCtaClick:()=>b(!0)}):ee.map(t=>{const o=z(t),j=$e(t.state),A=Fe("agent-card",t.state),s=We(t.runtimeConfig?.heartbeatIntervalMs),I=$t(s),le=de===t.id;return e.jsxs("div",{className:`agent-card ${A}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info agent-info--clickable",onClick:()=>k(t.id),role:"button",tabIndex:0,onKeyDown:v=>v.key==="Enter"&&k(t.id),children:[xe===t.id?e.jsx("select",{ref:pe,className:"select agent-role-select",value:t.role,onChange:v=>void be(t.id,v.target.value),onKeyDown:v=>je(v,t.id),onBlur:()=>q(null),autoFocus:!0,children:Re.map(v=>e.jsxs("option",{value:v.value,children:[v.icon," ",v.label]},v.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:v=>{v.stopPropagation(),q(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.stopPropagation(),q(t.id))},children:U(t.role)}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(lt,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${j}`,children:t.state}),e.jsxs("span",{className:"badge",style:{color:o.color},title:o.label,children:[o.icon,!o.stateDerived&&` ${o.label}`]}),e.jsx("span",{className:"badge text-secondary",children:_(t.role)}),(()=>{const v=$(t);if(v.length===0)return null;const F=v.slice(0,2),ye=v.length-2;return e.jsxs(e.Fragment,{children:[F.map(Qe=>e.jsx("span",{className:"badge badge-skill",children:Qe},Qe)),ye>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",ye]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),fe===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:Z[t.id]??"",onChange:v=>G(F=>({...F,[t.id]:v.target.value})),onKeyDown:v=>{v.key==="Enter"?se(t):v.key==="Escape"&&(B(null),G(F=>{const ye={...F};return delete ye[t.id],ye}))},disabled:le,"aria-label":`Custom heartbeat interval in minutes for ${t.name}`}),e.jsx("span",{className:"text-secondary",children:"min"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>void se(t),disabled:le,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>{B(null),G(v=>{const F={...v};return delete F[t.id],F})},disabled:le,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:s,onChange:v=>{const F=v.target.value;F==="__custom__"?Se(t):ke(t,Number(F))},disabled:le,"aria-label":`Set heartbeat interval for ${t.name}`,children:[I.map(v=>e.jsx("option",{value:v.value,children:v.label},v.value)),Ft.some(v=>v.value===s)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),le&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const v=new Date(t.lastHeartbeatAt),F=new Date(v.getTime()+s),ye=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:v.toLocaleString(),children:["Last: ",v.toLocaleTimeString()]}),ye&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:F.toLocaleString(),children:["Next: ",F.toLocaleTimeString()]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[t.state==="idle"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"active"),disabled:O.has(t.id),title:"Activate",children:[e.jsx(Ee,{size:14})," Start"]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void w(t.id,t.name),disabled:O.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(Ce,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"paused"),disabled:O.has(t.id),title:"Pause",children:[e.jsx(Ye,{size:14})," Pause"]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"active"),disabled:O.has(t.id),title:"Resume",children:[e.jsx(Ee,{size:14})," Resume"]}),t.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 ${t.name}`,children:[e.jsx(Ce,{size:14})," Running"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"paused"),disabled:O.has(t.id),title:"Pause",children:[e.jsx(Ye,{size:14})," Pause"]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"active"),disabled:O.has(t.id),title:"Retry",children:[e.jsx(Ee,{size:14})," Retry"]}),t.state==="terminated"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void D(t.id,"active"),disabled:O.has(t.id),title:"Start",children:[e.jsx(Ee,{size:14})," Start"]}),e.jsx("button",{className:"btn btn--sm agent-card-details-btn",onClick:()=>k(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:"View Details"}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void K(t.id,t.name),title:"Delete",children:[e.jsx(Dt,{size:14})," Delete"]})]})]},t.id)})})]}),M&&e.jsx(n.Suspense,{fallback:null,children:e.jsx(Dn,{agentId:M,projectId:l,onClose:Ae,addToast:a,onChildClick:i})})]})}const Vn=Object.freeze(Object.defineProperty({__proto__:null,AgentsView:Ln},Symbol.toStringTag,{value:"Module"}));export{Vn as A,Rn as S};
@@ -1 +1 @@
1
- import{r as s,j as t}from"./vendor-react-K0fH_qHe.js";import{j as ze,aA as Mt,g as Tt,aB as At,a as $t,aC as Pt,aD as Rt,aE as Dt,aF as Et,aG as Ft,aH as Lt,s as _t,aI as It,aJ as zt,aK as Ot,h as Ut,aL as Ht,a7 as Vt,a8 as Bt,S as Gt,N as Xe,D as Ze,ak as Kt,aM as qt,B as Ae,a4 as et,a5 as tt,aN as Jt,aO as Qt,aP as Wt,aQ as Yt,aR as Xt,aS as Zt,aT as st,i as es,u as nt,l as ts}from"./index-Bs3RZu5I.js";import"./vendor-xterm-DzcZoU0P.js";const Ie="kb-chat-active-session";function ss(a){const r=a?.toolCalls;if(!Array.isArray(r))return;const c=r.map(l=>{if(!l||typeof l!="object")return null;const o=l,C=typeof o.toolName=="string"?o.toolName:"";if(!C)return null;const M=o.args;return{toolName:C,...M&&typeof M=="object"?{args:M}:{},isError:!!o.isError,result:o.result,status:"completed"}}).filter(l=>l!==null);return c.length>0?c:void 0}function at(a){return{id:a.id,sessionId:a.sessionId,role:a.role,content:a.content,thinkingOutput:a.thinkingOutput,toolCalls:ss(a.metadata),attachments:a.attachments,createdAt:a.createdAt}}function ns(a){const[r,c]=s.useState([]),[l,o]=s.useState(null),[C,M]=s.useState(!0),[R,k]=s.useState([]),[V,I]=s.useState(!1),[p,F]=s.useState(!1),[B,D]=s.useState(""),[E,T]=s.useState(""),[z,A]=s.useState([]),[G,H]=s.useState(""),[se,ne]=s.useState(""),[$,K]=s.useState(!0),[u,w]=s.useState(new Map),x=s.useRef(null),P=s.useRef(!1),O=s.useRef(""),Se=s.useRef(r),Q=s.useRef(l),je=s.useRef(p);Se.current=r,Q.current=l,je.current=p,s.useEffect(()=>{O.current=G},[G]);const oe=s.useRef(new Set),ae=s.useRef(0),ye=s.useRef(a);ye.current!==a&&(ye.current=a,ae.current++),s.useEffect(()=>{const d=ae.current;ze(void 0,a).then(g=>{if(ae.current!==d)return;const h=new Map;for(const j of g)h.set(j.id,j);w(h)}).catch(()=>{})},[a]);const ie=s.useCallback(async()=>{M(!0);try{const g=[...(await Mt(a)).sessions].sort((h,j)=>new Date(j.updatedAt).getTime()-new Date(h.updatedAt).getTime());c(g)}catch{}finally{M(!1)}},[a]);s.useEffect(()=>{ie()},[ie]);const X=s.useRef(()=>{});s.useEffect(()=>{if(C)return;const d=Tt(Ie,a);d&&r.find(h=>h.id===d)&&X.current(d)},[C,r,a]);const q=s.useCallback(async(d,g)=>{I(!0);try{const h=await At(d,{limit:50,...g},a),j=h.messages.map(at);g?.offset&&g.offset>0?k(Z=>[...j,...Z]):k(j),K(h.messages.length>=50)}catch{}finally{I(!1)}},[a]),re=s.useCallback((d,g)=>{x.current&&(x.current.close(),x.current=null);const h=g??r.find(j=>j.id===d);o(h||null),D(""),T(""),A([]),F(!1),K(!0),d?q(d):k([]),d?$t(Ie,d,a):Pt(Ie,a)},[r,q,a]);X.current=re;const ge=s.useCallback(async d=>{const g=await Rt(d,a);x.current&&(x.current.close(),x.current=null);const h={id:g.session.id,title:g.session.title,agentId:g.session.agentId,status:g.session.status,modelProvider:g.session.modelProvider,modelId:g.session.modelId,createdAt:g.session.createdAt,updatedAt:g.session.updatedAt};return c(j=>[h,...j]),re(h.id,h),k([]),h},[a,re]),fe=s.useCallback(async d=>{await Dt(d,{status:"archived"},a),c(g=>g.filter(h=>h.id!==d)),l?.id===d&&(o(null),k([]))},[l,a]),de=s.useCallback(async d=>{l?.id===d&&x.current&&(x.current.close(),x.current=null),await Et(d,a),c(g=>g.filter(h=>h.id!==d)),l?.id===d&&(o(null),k([]))},[l,a]),pe=s.useCallback(async()=>{!l||!$||await q(l.id,{offset:R.length})},[l,$,q,R.length]),le=s.useCallback(()=>{l&&(P.current=!0,x.current?.close(),x.current=null,Ft(l.id,a).catch(()=>{}),F(!1),D(""),T(""),A([]))},[l,a]),W=s.useCallback(()=>{O.current="",H("")},[]),Y=s.useCallback((d,g)=>{if(!l)return;if(p){O.current=d,H(d);return}P.current=!1,x.current&&(x.current.close(),x.current=null);const h=`temp-${Date.now()}`,j={id:h,sessionId:l.id,role:"user",content:d,createdAt:new Date().toISOString()};k(b=>[...b,j]),D(""),T(""),A([]),F(!0);let Z="",U="",L=[];const we={onThinking:b=>{U+=b,T(U)},onText:b=>{Z+=b,D(Z)},onToolStart:b=>{L=[...L,{toolName:b.toolName,args:b.args,isError:!1,status:"running"}],A(L)},onToolEnd:b=>{const f=[...L];for(let S=f.length-1;S>=0;S--){const N=f[S];if(N?.toolName===b.toolName&&N.status==="running"){f[S]={...N,status:"completed",isError:b.isError,result:b.result},L=f,A(f);return}}L=[...f,{toolName:b.toolName,isError:b.isError,result:b.result,status:"completed"}],A(L)},onDone:b=>{const f={id:b.messageId||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:Z,thinkingOutput:U,toolCalls:L.length>0?L:void 0,createdAt:new Date().toISOString()};oe.current.add(f.id),k(N=>[...N,f]),D(""),T(""),A([]),F(!1),x.current=null,setTimeout(()=>{oe.current.delete(f.id)},1e3),ie();const S=O.current.trim();S&&(O.current="",H(""),Y(S))},onError:b=>{if(k(f=>f.filter(S=>S.id!==h)),D(""),T(""),A([]),F(!1),x.current=null,console.error("[useChat] Stream error:",b),!P.current){const f=O.current.trim();f&&(O.current="",H(""),Y(f))}}};x.current=Lt(l.id,d,we,g,a)},[l,p,a,ie]),be=se?r.filter(d=>d.title?.toLowerCase().includes(se.toLowerCase())||d.agentId.toLowerCase().includes(se.toLowerCase())):r;return s.useEffect(()=>{const d=ae.current,g=a?`?projectId=${encodeURIComponent(a)}`:"",h=()=>ae.current!==d,j=f=>{if(h())return;const S=JSON.parse(f.data);c(N=>N.some(m=>m.id===S.id)?N:[S,...N])},Z=f=>{if(h())return;const S=JSON.parse(f.data);c(N=>[...N.map(ce=>ce.id===S.id?S:ce)]),Q.current?.id===S.id&&o(S)},U=f=>{if(h())return;const{id:S}=JSON.parse(f.data);c(N=>N.filter(m=>m.id!==S)),Q.current?.id===S&&(o(null),k([]))},L=f=>{if(h())return;const S=JSON.parse(f.data),N=at(S);oe.current.has(N.id)||Q.current?.id===N.sessionId&&!je.current&&k(m=>m.some(ce=>ce.id===N.id)?m:[...m,N])},we=f=>{if(h())return;const{id:S}=JSON.parse(f.data);k(N=>N.filter(m=>m.id!==S))};return _t(`/api/events${g}`,{events:{"chat:session:created":j,"chat:session:updated":Z,"chat:session:deleted":U,"chat:message:added":L,"chat:message:deleted":we}})},[a]),s.useEffect(()=>()=>{x.current&&(x.current.close(),x.current=null)},[]),{sessions:r,activeSession:l,sessionsLoading:C,messages:R,messagesLoading:V,isStreaming:p,streamingText:B,streamingThinking:E,streamingToolCalls:z,pendingMessage:G,selectSession:re,createSession:ge,archiveSession:fe,deleteSession:de,sendMessage:Y,stopStreaming:le,clearPendingMessage:W,loadMoreMessages:pe,hasMoreMessages:$,searchQuery:se,setSearchQuery:ne,filteredSessions:be,refreshSessions:ie,agentsMap:u}}function it(a){const r=new Date(a),l=new Date().getTime()-r.getTime(),o=Math.floor(l/1e3),C=Math.floor(o/60),M=Math.floor(C/60),R=Math.floor(M/24);return o<60?"just now":C<60?`${C}m ago`:M<24?`${M}h ago`:R<7?`${R}d ago`:r.toLocaleDateString()}function rt(a,r){if(!a||!r)return null;const c=r.toLowerCase();if(c.includes("claude")){let o=r.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 o=o.replace(/\s+/g," "),o.length>30?o.slice(0,30)+"…":o}if(c.includes("gpt")||c.includes("openai")){const o=r.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 o.length>30?o.slice(0,30)+"…":o}if(c.includes("gemini")){const o=r.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 o.length>30?o.slice(0,30)+"…":o}const l=r.replace(/-/g," ").replace(/^\w/,o=>o.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function $e(a,r){return a.length<=r?a:`${a.slice(0,r)}…`}function as(a){if(!a)return null;const r=Object.entries(a);return r.length===0?null:r.map(([c,l])=>{const o=typeof l=="string"?l:(()=>{try{return JSON.stringify(l)}catch{return String(l)}})();return`${c}=${$e(o,50)}`}).join(", ")}function is(a){if(a===void 0)return null;if(typeof a=="string")return $e(a,200);try{return $e(JSON.stringify(a),200)}catch{return $e(String(a),200)}}function lt(a){if(!a||a.length===0)return null;const r=(p,F)=>{const B=p.status==="running",D=p.status==="completed"&&p.isError,E=as(p.args),T=is(p.result),z=B?E:T?`result: ${T}`:E?`args: ${E}`:null,A=B?"running":D?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${B?" chat-tool-call--running":""}${D?" chat-tool-call--error":""}`,open:B,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:p.toolName}),z&&t.jsx("span",{className:"chat-tool-call-preview",title:z,children:z}),t.jsx("span",{className:"chat-tool-call-status-text",children:A})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[E&&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:E})]}),T&&t.jsxs("div",{className:`chat-tool-call-row${D?" 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:T})]})]})]},`${p.toolName}-${F}`)},c="chat-tool-calls";if(a.length===1)return t.jsxs("div",{className:c,"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"})]}),r(a[0],0)]});const l=a.filter(p=>p.status==="running").length,o=a.filter(p=>p.status==="completed"&&p.isError).length,C=l>0,M=Array.from(new Set(a.map(p=>p.toolName))),R=M.slice(0,5),k=Math.max(0,M.length-R.length),V=k>0?`${R.join(", ")}, +${k} more`:R.join(", "),I=C?`(${l} running)`:o>0?`(${o} ${o===1?"error":"errors"})`:null;return t.jsx("div",{className:c,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:C,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:V,children:V}),I&&t.jsx("span",{className:"chat-tool-calls-group-status",children:I})]}),a.map((p,F)=>r(p,F))]})})}const rs={pre:({children:a,...r})=>t.jsx("pre",{...r,className:"chat-markdown-pre",children:a}),table:({children:a,...r})=>t.jsx("table",{...r,className:"chat-markdown-table",children:a})},Pe="__fn_agent__",ls=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function ct(a){const r=/(^|[\s])\/([^\s]*)$/.exec(a);if(!r)return null;const c=r[1]??"",l=r[2]??"",o=r.index+c.length;return{filter:l,start:o,end:a.length}}function cs(a,r){const c=a.slice(0,r),l=/(^|[\s\n])@([\w-]*)$/.exec(c);if(!l)return null;const o=l[2]??"",C=c.length-o.length-1;return{filter:o,start:C,end:r}}function os({projectId:a,onClose:r,onCreate:c}){const[l,o]=s.useState("agent"),[C,M]=s.useState([]),[R,k]=s.useState(!0),[V,I]=s.useState(""),[p,F]=s.useState([]),[B,D]=s.useState(!0),[E,T]=s.useState(""),[z,A]=s.useState([]),[G,H]=s.useState([]);s.useEffect(()=>{let u=!1;return k(!0),ze(void 0,a).then(w=>{u||M(w)}).catch(()=>{u||M([])}).finally(()=>{u||k(!1)}),()=>{u=!0}},[a]),s.useEffect(()=>{D(!0),es().then(u=>{F(u.models),A(u.favoriteProviders),H(u.favoriteModels)}).catch(()=>{F([]),A([]),H([])}).finally(()=>{D(!1)})},[]);const se=s.useCallback(async u=>{const w=z,P=w.includes(u)?w.filter(O=>O!==u):[u,...w];A(P);try{await nt({favoriteProviders:P,favoriteModels:G})}catch{A(w)}},[z,G]),ne=s.useCallback(async u=>{const w=G,P=w.includes(u)?w.filter(O=>O!==u):[u,...w];H(P);try{await nt({favoriteProviders:z,favoriteModels:P})}catch{H(w)}},[G,z]),$=u=>{if(u.preventDefault(),l==="agent"){if(!V)return;c({agentId:V});return}if(!E)return;const w=E.indexOf("/");if(w<=0)return;const x=E.slice(0,w),P=E.slice(w+1);c({agentId:Pe,modelProvider:x,modelId:P})},K=l==="agent"?!V:!E;return t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog",onClick:u=>u.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:()=>{o("agent"),T("")},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:()=>{o("model"),I("")},children:"Model"})]}),t.jsxs("form",{onSubmit:$,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..."}):C.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:C.map(u=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${V===u.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>I(u.id),"data-testid":`agent-option-${u.id}`,children:[t.jsx(Ae,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:u.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:u.role})]},u.id))})]}),l==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:B?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(ts,{models:p,value:E,onChange:T,label:"Model",placeholder:"Select a model",favoriteProviders:z,onToggleFavorite:se,favoriteModels:G,onToggleModelFavorite:ne})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:K,children:"Create"})]})]})]})})}function gs({projectId:a,addToast:r}){const{activeSession:c,sessionsLoading:l,messages:o,messagesLoading:C,isStreaming:M,streamingText:R,streamingThinking:k,streamingToolCalls:V,selectSession:I,createSession:p,archiveSession:F,deleteSession:B,sendMessage:D,stopStreaming:E,pendingMessage:T,clearPendingMessage:z,searchQuery:A,setSearchQuery:G,filteredSessions:H}=ns(a),[se,ne]=s.useState(!1),[$,K]=s.useState(""),[u,w]=s.useState(null),[x,P]=s.useState(null),[O,Se]=s.useState(!0),[Q,je]=s.useState(new Map),[oe,ae]=s.useState([]),[ye,ie]=s.useState(!0),[X,q]=s.useState(!1),[re,ge]=s.useState(""),[fe,de]=s.useState(0),[pe,le]=s.useState(""),[W,Y]=s.useState(!1),[be,d]=s.useState(0),[g,h]=s.useState(-1),[j,Z]=s.useState(()=>new Set),[U,L]=s.useState([]),[we,b]=s.useState(!1),[,f]=s.useState(!1),[S,N]=s.useState({top:0,left:0}),m=It({projectId:a}),ce=s.useCallback(e=>{if(!e||!m.mentionActive)return;const n=e.getBoundingClientRect();N({top:n.top-260,left:n.left+8})},[m.mentionActive]),Oe=s.useRef(null),ee=s.useRef(null),Ue=s.useRef(null),_=s.useRef(null),He=s.useRef(null),Ve=s.useRef([]),ke=s.useRef(0),ue=zt()==="mobile",{keyboardOverlap:Ce,viewportHeight:Be}=Ot({enabled:ue&&!!c}),ot=Ce>0?{"--keyboard-overlap":`${Ce}px`,...Be!==null?{"--vv-height":`${Be}px`}:{}}:{},J=s.useMemo(()=>{const e=re.trim().toLowerCase();return(e?oe.filter(i=>i.name.toLowerCase().includes(e)):oe).slice(0,10)},[oe,re]),xe=s.useMemo(()=>Array.from(Q.values()),[Q]),he=s.useMemo(()=>{const e=pe.trim().toLowerCase();return e?xe.filter(n=>n.name.toLowerCase().includes(e)):xe},[xe,pe]),Ge=s.useMemo(()=>{const e=new Map;for(const n of xe)e.set(n.name.toLowerCase(),n);return e},[xe]);s.useEffect(()=>{de(0)},[J]),s.useEffect(()=>{d(0)},[pe,W]),s.useEffect(()=>()=>{ee.current!==null&&window.clearTimeout(ee.current)},[]),s.useEffect(()=>{Oe.current?.scrollIntoView({behavior:"smooth"})},[o,R]),s.useEffect(()=>{if(Ce<=0)return;const e=Ue.current;e&&(e.scrollTop=e.scrollHeight)},[Ce]),s.useEffect(()=>{const e=()=>w(null);if(u)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[u]),s.useEffect(()=>{let e=!1;const n=a;return ze(void 0,a).then(i=>{if(e||n!==a)return;const v=new Map;for(const y of i)v.set(y.id,y);je(v)}).catch(()=>{}),()=>{e=!0}},[a]),s.useEffect(()=>{let e=!1;return ie(!0),Ut(a).then(n=>{e||ae(n)}).catch(()=>{e||ae([])}).finally(()=>{e||ie(!1)}),()=>{e=!0}},[a]),s.useEffect(()=>{Ve.current=U},[U]),s.useEffect(()=>()=>{for(const e of Ve.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl)},[]);const Me=s.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const i of Array.from(e)){if(!ls.includes(i.type))continue;const v=i.type.startsWith("image/");n.push({file:i,previewUrl:v?URL.createObjectURL(i):""})}n.length>0&&L(i=>[...i,...n])},[]),dt=s.useCallback(e=>{L(n=>{const i=n[e];return i?.previewUrl&&URL.revokeObjectURL(i.previewUrl),n.filter((v,y)=>y!==e)})},[]),ut=s.useCallback(e=>{const n=e.clipboardData?.files;if(!n||n.length===0)return;const i=Array.from(n).filter(v=>v.type.startsWith("image/"));i.length!==0&&Me(i)},[Me]),ht=s.useCallback(async e=>{try{await p(e),ne(!1),ue&&Se(!1)}catch{r("Failed to create chat session","error")}},[p,r,ue]),Re=s.useCallback(()=>{const e=$.trim(),n=U.map(i=>i.file);!e&&n.length===0||!c||(K(""),q(!1),ge(""),Y(!1),le(""),h(-1),D(e,n),L(i=>{for(const v of i)v.previewUrl&&URL.revokeObjectURL(v.previewUrl);return[]}))},[$,U,c,D]),De=s.useCallback(e=>{K(n=>{const i=ct(n);if(!i)return n;const v=`/skill:${e.name} `,y=n.slice(0,i.start)+v+n.slice(i.end);return window.requestAnimationFrame(()=>{_.current&&(_.current.style.height="auto",_.current.style.height=`${Math.min(_.current.scrollHeight,120)}px`,_.current.focus())}),y}),q(!1),ge(""),de(0)},[]),Ee=s.useCallback(e=>{const n=_.current;if(!n||g<0)return;const i=n.selectionStart??ke.current,v=n.selectionEnd??i,y=Math.max(i,v),Ne=Math.min(g,y),me=`${`@${e.name.replace(/\s+/g,"_")}`} `,_e=$.slice(0,Ne)+me+$.slice(y),ve=Ne+me.length;K(_e),Y(!1),le(""),d(0),h(-1),window.requestAnimationFrame(()=>{_.current&&(_.current.style.height="auto",_.current.style.height=`${Math.min(_.current.scrollHeight,120)}px`,_.current.focus(),_.current.setSelectionRange(ve,ve))})},[g,$]),mt=s.useCallback(e=>{const n=/@([\w-]+)/g,i=[];let v=0,y=n.exec(e);for(;y;){const[Ne,Ye=""]=y,me=y.index;me>v&&i.push(e.slice(v,me));const _e=Ye.replace(/_/g," ").toLowerCase(),ve=Ge.get(_e);ve?i.push(t.jsxs("span",{className:"chat-mention-chip",children:["@",ve.name.replace(/\s+/g,"_")]},`${ve.id}-${me}`)):i.push(Ne),v=me+Ne.length,y=n.exec(e)}return v<e.length&&i.push(e.slice(v)),i.length===0?e:i},[Ge]),Ke=s.useCallback(e=>c?`/api/chat/sessions/${encodeURIComponent(c.id)}/attachments/${encodeURIComponent(e)}`:"",[c]),gt=s.useCallback(e=>!e||e.length===0?null:t.jsx("div",{className:"chat-message-attachments",children:e.map(n=>{const i=n.mimeType.startsWith("image/"),v=n.id||n.filename,y=Ke(n.filename);return i?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:y,alt:n.originalName})},v):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(Ht,{size:14}),t.jsx("span",{children:n.originalName})]},v)})}),[Ke]),ft=s.useCallback(e=>{if(ke.current=e.currentTarget.selectionStart??ke.current,m.mentionActive&&m.files.length>0){if(m.handleKeyDown(e,$),e.key==="Enter"||e.key==="Tab"){const n=m.files[m.selectedIndex];if(n){const i=m.selectFile(n,$);K(i),m.dismissMention(),f(!1)}}return}if(W&&e.key==="ArrowDown"){e.preventDefault(),he.length>0&&d(n=>(n+1)%he.length);return}if(W&&e.key==="ArrowUp"){e.preventDefault(),he.length>0&&d(n=>n===0?he.length-1:n-1);return}if(W&&e.key==="Enter"){e.preventDefault();const n=he[be]??he[0];n&&Ee(n);return}if(W&&e.key==="Escape"){e.preventDefault(),Y(!1),le(""),h(-1);return}if(X&&e.key==="ArrowDown"){e.preventDefault(),J.length>0&&de(n=>(n+1)%J.length);return}if(X&&e.key==="ArrowUp"){e.preventDefault(),J.length>0&&de(n=>n===0?J.length-1:n-1);return}if(X&&(e.key==="Enter"||e.key==="Tab")&&J.length>0){e.preventDefault();const n=J[fe]??J[0];n&&De(n);return}if(X&&e.key==="Escape"){e.preventDefault(),q(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Re())},[W,he,be,Ee,X,J,fe,De,Re,m,$]),Te=s.useCallback((e,n)=>{const i=cs(e,n);if(i){Y(!0),le(i.filter),h(i.start);return}Y(!1),le(""),h(-1)},[]),pt=s.useCallback(e=>{const n=e.target,i=n.value,v=n.selectionStart??i.length;ke.current=v,K(i);const y=ct(i);y?(q(!0),ge(y.filter)):(q(!1),ge("")),Te(i,v),m.detectMention(i,v),f(m.mentionActive),m.mentionActive&&ce(n),n.style.height="auto",n.style.height=`${Math.min(n.scrollHeight,120)}px`},[Te]),Fe=s.useCallback(e=>{const n=e.currentTarget,i=n.selectionStart??n.value.length;ke.current=i,Te(n.value,i),m.detectMention(n.value,i),f(m.mentionActive),m.mentionActive&&ce(n)},[Te,m,ce]),xt=s.useCallback(e=>{e.key!=="Escape"&&Fe(e)},[Fe]),vt=s.useCallback(()=>{ee.current!==null&&window.clearTimeout(ee.current),ee.current=window.setTimeout(()=>{q(!1),Y(!1),le(""),h(-1),f(!1),m.dismissMention(),ee.current=null},120)},[m]),St=s.useCallback(()=>{ee.current!==null&&(window.clearTimeout(ee.current),ee.current=null)},[]),bt=s.useCallback(async e=>{w(null);try{await F(e),r("Conversation archived","success")}catch{r("Failed to archive conversation","error")}},[F,r]),wt=s.useCallback(async e=>{P(null),w(null);try{await B(e),r("Conversation deleted","success")}catch{r("Failed to delete conversation","error")}},[B,r]),kt=s.useCallback(e=>{I(e),ue&&Se(!1)},[I,ue]),Nt=s.useCallback(()=>{I(""),Se(!0)},[I]),jt=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(Zt,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>ne(!0),children:[t.jsx(Ze,{size:16}),"New Chat"]})]}),te=rt(c?.modelProvider,c?.modelId),qe=c?.agentId===Pe?te??"Fusion":c?.title||Q.get(c?.agentId??"")?.name||c?.agentId||"Chat",yt=!!(te&&te!==qe),Le=Q.get(c?.agentId??"")?.name||(c?.agentId===Pe?te??"Fusion":c?.agentId?.slice(0,30)??"Fusion"),Je=!!(te&&te!==Le),Ct=T.length>50?`${T.slice(0,50)}…`:T,Qe=s.useCallback(e=>{Z(n=>{const i=new Set(n);return i.has(e)?i.delete(e):i.add(e),i})},[]),We=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(Vt,{remarkPlugins:[Bt],components:rs,children:e})}),[]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${O?"":" chat-sidebar--hidden"}`,children:[t.jsx("div",{className:"chat-sidebar-search",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Gt,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:A,onChange:e=>G(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..."}):H.length===0?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):H.map(e=>t.jsxs("div",{className:`chat-session-item${c?.id===e.id?" chat-session-item--active":""}`,onClick:()=>kt(e.id),onContextMenu:n=>{n.preventDefault(),w({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(),P(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(Xe,{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:Q.get(e.agentId)?.name||(e.agentId===Pe?rt(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))}),t.jsx("span",{children:e.updatedAt?it(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:()=>ne(!0),"data-testid":"chat-new-btn",children:[t.jsx(Ze,{size:14}),"New Chat"]})})]}),u&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:u.y,left:u.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>bt(u.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Kt,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{w(null),P(u.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(Xe,{size:14}),"Delete"]})]}),x&&t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:()=>P(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:()=>P(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void wt(x),children:"Delete"})]})]})}),t.jsxs("div",{className:"chat-thread",style:ot,children:[(c||!ue)&&t.jsxs("div",{className:"chat-thread-header",children:[ue&&c&&t.jsx("button",{className:"btn-icon",onClick:Nt,"data-testid":"chat-back-btn",children:t.jsx(qt,{size:16})}),t.jsx(Ae,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:qe}),yt&&t.jsx("span",{className:"chat-model-tag",children:te})]}),t.jsxs("div",{className:"chat-messages",ref:Ue,children:[C?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):o.length===0&&!c?jt():o.length===0&&c?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):t.jsxs(t.Fragment,{children:[o.map(e=>{const n=e.role==="assistant",i=j.has(e.id);return t.jsxs("div",{className:`chat-message chat-message--${e.role}`,"data-testid":`chat-message-${e.id}`,children:[n&&t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ae,{size:14}),t.jsx("span",{children:Le}),Je&&t.jsx("span",{className:"chat-model-tag",children:te}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${i?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":i?"Show rendered markdown":"Show plain text",onClick:()=>Qe(e.id),children:i?t.jsx(et,{size:14}):t.jsx(tt,{size:14})})]}),n?We(e.content,i):t.jsx("div",{className:"chat-message-content",children:mt(e.content)}),lt(e.toolCalls),e.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:e.thinkingOutput})]}),gt(e.attachments),t.jsx("div",{className:"chat-message-time",children:it(e.createdAt)})]},e.id)}),M&&t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ae,{size:14}),t.jsx("span",{children:Le}),Je&&t.jsx("span",{className:"chat-model-tag",children:te}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${j.has("__streaming__")?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":j.has("__streaming__")?"Show rendered markdown":"Show plain text",onClick:()=>Qe("__streaming__"),children:j.has("__streaming__")?t.jsx(et,{size:14}):t.jsx(tt,{size:14})})]}),R?We(R,j.has("__streaming__")):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:k?"Thinking…":"Connecting…"}),lt(V),k&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:k})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}),t.jsx("div",{ref:Oe})]}),c&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:He,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{Me(e.target.files),e.target.value=""}}),X&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:ye?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):J.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:re?"No skills found":"No skills available"}):J.map((e,n)=>t.jsxs("button",{type:"button",role:"option","aria-selected":n===fe,className:`chat-skill-menu-item${n===fe?" chat-skill-menu-item--highlighted":""}`,onMouseDown:i=>i.preventDefault(),onMouseEnter:()=>de(n),onClick:()=>De(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))}),U.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:U.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:()=>dt(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:()=>He.current?.click(),children:t.jsx(Jt,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${we?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),b(!0)},onDragLeave:()=>b(!1),onDrop:e=>{e.preventDefault(),b(!1),Me(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:_,className:"chat-input-textarea",placeholder:"Type a message...",value:$,onChange:pt,onKeyDown:ft,onKeyUp:xt,onClick:Fe,onBlur:vt,onFocus:St,onPaste:ut,rows:1,"data-testid":"chat-input"}),t.jsx(Qt,{agents:xe,filter:pe,highlightedIndex:be,visible:W,onSelect:Ee,position:"below"}),t.jsx(Wt,{visible:m.mentionActive&&!W,position:S,files:m.files,selectedIndex:m.selectedIndex,onSelect:e=>{const n=m.selectFile(e,$);K(n),m.dismissMention(),f(!1),_.current?.focus()},loading:m.loading}),T&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${Ct}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:z,children:"×"})]})]}),M?t.jsx("button",{className:"chat-input-stop",onClick:E,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(Yt,{size:14})}):t.jsx("button",{className:"chat-input-send",onClick:()=>void Re(),disabled:!$.trim()&&U.length===0,"data-testid":"chat-send-btn",children:t.jsx(Xt,{size:16})})]})]})]}),se&&t.jsx(os,{projectId:a,onClose:()=>ne(!1),onCreate:ht})]})}export{gs as ChatView};
1
+ import{r as s,j as t}from"./vendor-react-K0fH_qHe.js";import{j as ze,aG as Mt,g as Tt,aH as At,a as $t,aI as Pt,aJ as Rt,aK as Dt,aL as Et,aM as Ft,aN as Lt,s as _t,aO as It,aP as zt,aQ as Ot,h as Ut,aR as Ht,a7 as Vt,a8 as Gt,S as Bt,N as Xe,D as Ze,ak as Kt,aS as qt,B as Ae,a4 as et,a5 as tt,aT as Jt,aU as Wt,aV as Qt,aW as Yt,aX as Xt,aY as Zt,aZ as st,i as es,u as nt,l as ts}from"./index-DNIrnlpO.js";import"./vendor-xterm-DzcZoU0P.js";const Ie="kb-chat-active-session";function ss(a){const r=a?.toolCalls;if(!Array.isArray(r))return;const c=r.map(l=>{if(!l||typeof l!="object")return null;const o=l,C=typeof o.toolName=="string"?o.toolName:"";if(!C)return null;const M=o.args;return{toolName:C,...M&&typeof M=="object"?{args:M}:{},isError:!!o.isError,result:o.result,status:"completed"}}).filter(l=>l!==null);return c.length>0?c:void 0}function at(a){return{id:a.id,sessionId:a.sessionId,role:a.role,content:a.content,thinkingOutput:a.thinkingOutput,toolCalls:ss(a.metadata),attachments:a.attachments,createdAt:a.createdAt}}function ns(a){const[r,c]=s.useState([]),[l,o]=s.useState(null),[C,M]=s.useState(!0),[R,k]=s.useState([]),[V,I]=s.useState(!1),[p,F]=s.useState(!1),[G,D]=s.useState(""),[E,T]=s.useState(""),[z,A]=s.useState([]),[B,H]=s.useState(""),[se,ne]=s.useState(""),[$,K]=s.useState(!0),[u,w]=s.useState(new Map),x=s.useRef(null),P=s.useRef(!1),O=s.useRef(""),Se=s.useRef(r),W=s.useRef(l),je=s.useRef(p);Se.current=r,W.current=l,je.current=p,s.useEffect(()=>{O.current=B},[B]);const oe=s.useRef(new Set),ae=s.useRef(0),ye=s.useRef(a);ye.current!==a&&(ye.current=a,ae.current++),s.useEffect(()=>{const d=ae.current;ze(void 0,a).then(g=>{if(ae.current!==d)return;const h=new Map;for(const j of g)h.set(j.id,j);w(h)}).catch(()=>{})},[a]);const ie=s.useCallback(async()=>{M(!0);try{const g=[...(await Mt(a)).sessions].sort((h,j)=>new Date(j.updatedAt).getTime()-new Date(h.updatedAt).getTime());c(g)}catch{}finally{M(!1)}},[a]);s.useEffect(()=>{ie()},[ie]);const X=s.useRef(()=>{});s.useEffect(()=>{if(C)return;const d=Tt(Ie,a);d&&r.find(h=>h.id===d)&&X.current(d)},[C,r,a]);const q=s.useCallback(async(d,g)=>{I(!0);try{const h=await At(d,{limit:50,...g},a),j=h.messages.map(at);g?.offset&&g.offset>0?k(Z=>[...j,...Z]):k(j),K(h.messages.length>=50)}catch{}finally{I(!1)}},[a]),re=s.useCallback((d,g)=>{x.current&&(x.current.close(),x.current=null);const h=g??r.find(j=>j.id===d);o(h||null),D(""),T(""),A([]),F(!1),K(!0),d?q(d):k([]),d?$t(Ie,d,a):Pt(Ie,a)},[r,q,a]);X.current=re;const ge=s.useCallback(async d=>{const g=await Rt(d,a);x.current&&(x.current.close(),x.current=null);const h={id:g.session.id,title:g.session.title,agentId:g.session.agentId,status:g.session.status,modelProvider:g.session.modelProvider,modelId:g.session.modelId,createdAt:g.session.createdAt,updatedAt:g.session.updatedAt};return c(j=>[h,...j]),re(h.id,h),k([]),h},[a,re]),fe=s.useCallback(async d=>{await Dt(d,{status:"archived"},a),c(g=>g.filter(h=>h.id!==d)),l?.id===d&&(o(null),k([]))},[l,a]),de=s.useCallback(async d=>{l?.id===d&&x.current&&(x.current.close(),x.current=null),await Et(d,a),c(g=>g.filter(h=>h.id!==d)),l?.id===d&&(o(null),k([]))},[l,a]),pe=s.useCallback(async()=>{!l||!$||await q(l.id,{offset:R.length})},[l,$,q,R.length]),le=s.useCallback(()=>{l&&(P.current=!0,x.current?.close(),x.current=null,Ft(l.id,a).catch(()=>{}),F(!1),D(""),T(""),A([]))},[l,a]),Q=s.useCallback(()=>{O.current="",H("")},[]),Y=s.useCallback((d,g)=>{if(!l)return;if(p){O.current=d,H(d);return}P.current=!1,x.current&&(x.current.close(),x.current=null);const h=`temp-${Date.now()}`,j={id:h,sessionId:l.id,role:"user",content:d,createdAt:new Date().toISOString()};k(b=>[...b,j]),D(""),T(""),A([]),F(!0);let Z="",U="",L=[];const we={onThinking:b=>{U+=b,T(U)},onText:b=>{Z+=b,D(Z)},onToolStart:b=>{L=[...L,{toolName:b.toolName,args:b.args,isError:!1,status:"running"}],A(L)},onToolEnd:b=>{const f=[...L];for(let S=f.length-1;S>=0;S--){const N=f[S];if(N?.toolName===b.toolName&&N.status==="running"){f[S]={...N,status:"completed",isError:b.isError,result:b.result},L=f,A(f);return}}L=[...f,{toolName:b.toolName,isError:b.isError,result:b.result,status:"completed"}],A(L)},onDone:b=>{const f={id:b.messageId||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:Z,thinkingOutput:U,toolCalls:L.length>0?L:void 0,createdAt:new Date().toISOString()};oe.current.add(f.id),k(N=>[...N,f]),D(""),T(""),A([]),F(!1),x.current=null,setTimeout(()=>{oe.current.delete(f.id)},1e3),ie();const S=O.current.trim();S&&(O.current="",H(""),Y(S))},onError:b=>{if(k(f=>f.filter(S=>S.id!==h)),D(""),T(""),A([]),F(!1),x.current=null,console.error("[useChat] Stream error:",b),!P.current){const f=O.current.trim();f&&(O.current="",H(""),Y(f))}}};x.current=Lt(l.id,d,we,g,a)},[l,p,a,ie]),be=se?r.filter(d=>d.title?.toLowerCase().includes(se.toLowerCase())||d.agentId.toLowerCase().includes(se.toLowerCase())):r;return s.useEffect(()=>{const d=ae.current,g=a?`?projectId=${encodeURIComponent(a)}`:"",h=()=>ae.current!==d,j=f=>{if(h())return;const S=JSON.parse(f.data);c(N=>N.some(m=>m.id===S.id)?N:[S,...N])},Z=f=>{if(h())return;const S=JSON.parse(f.data);c(N=>[...N.map(ce=>ce.id===S.id?S:ce)]),W.current?.id===S.id&&o(S)},U=f=>{if(h())return;const{id:S}=JSON.parse(f.data);c(N=>N.filter(m=>m.id!==S)),W.current?.id===S&&(o(null),k([]))},L=f=>{if(h())return;const S=JSON.parse(f.data),N=at(S);oe.current.has(N.id)||W.current?.id===N.sessionId&&!je.current&&k(m=>m.some(ce=>ce.id===N.id)?m:[...m,N])},we=f=>{if(h())return;const{id:S}=JSON.parse(f.data);k(N=>N.filter(m=>m.id!==S))};return _t(`/api/events${g}`,{events:{"chat:session:created":j,"chat:session:updated":Z,"chat:session:deleted":U,"chat:message:added":L,"chat:message:deleted":we}})},[a]),s.useEffect(()=>()=>{x.current&&(x.current.close(),x.current=null)},[]),{sessions:r,activeSession:l,sessionsLoading:C,messages:R,messagesLoading:V,isStreaming:p,streamingText:G,streamingThinking:E,streamingToolCalls:z,pendingMessage:B,selectSession:re,createSession:ge,archiveSession:fe,deleteSession:de,sendMessage:Y,stopStreaming:le,clearPendingMessage:Q,loadMoreMessages:pe,hasMoreMessages:$,searchQuery:se,setSearchQuery:ne,filteredSessions:be,refreshSessions:ie,agentsMap:u}}function it(a){const r=new Date(a),l=new Date().getTime()-r.getTime(),o=Math.floor(l/1e3),C=Math.floor(o/60),M=Math.floor(C/60),R=Math.floor(M/24);return o<60?"just now":C<60?`${C}m ago`:M<24?`${M}h ago`:R<7?`${R}d ago`:r.toLocaleDateString()}function rt(a,r){if(!a||!r)return null;const c=r.toLowerCase();if(c.includes("claude")){let o=r.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 o=o.replace(/\s+/g," "),o.length>30?o.slice(0,30)+"…":o}if(c.includes("gpt")||c.includes("openai")){const o=r.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 o.length>30?o.slice(0,30)+"…":o}if(c.includes("gemini")){const o=r.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 o.length>30?o.slice(0,30)+"…":o}const l=r.replace(/-/g," ").replace(/^\w/,o=>o.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function $e(a,r){return a.length<=r?a:`${a.slice(0,r)}…`}function as(a){if(!a)return null;const r=Object.entries(a);return r.length===0?null:r.map(([c,l])=>{const o=typeof l=="string"?l:(()=>{try{return JSON.stringify(l)}catch{return String(l)}})();return`${c}=${$e(o,50)}`}).join(", ")}function is(a){if(a===void 0)return null;if(typeof a=="string")return $e(a,200);try{return $e(JSON.stringify(a),200)}catch{return $e(String(a),200)}}function lt(a){if(!a||a.length===0)return null;const r=(p,F)=>{const G=p.status==="running",D=p.status==="completed"&&p.isError,E=as(p.args),T=is(p.result),z=G?E:T?`result: ${T}`:E?`args: ${E}`:null,A=G?"running":D?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${G?" chat-tool-call--running":""}${D?" chat-tool-call--error":""}`,open:G,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:p.toolName}),z&&t.jsx("span",{className:"chat-tool-call-preview",title:z,children:z}),t.jsx("span",{className:"chat-tool-call-status-text",children:A})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[E&&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:E})]}),T&&t.jsxs("div",{className:`chat-tool-call-row${D?" 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:T})]})]})]},`${p.toolName}-${F}`)},c="chat-tool-calls";if(a.length===1)return t.jsxs("div",{className:c,"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"})]}),r(a[0],0)]});const l=a.filter(p=>p.status==="running").length,o=a.filter(p=>p.status==="completed"&&p.isError).length,C=l>0,M=Array.from(new Set(a.map(p=>p.toolName))),R=M.slice(0,5),k=Math.max(0,M.length-R.length),V=k>0?`${R.join(", ")}, +${k} more`:R.join(", "),I=C?`(${l} running)`:o>0?`(${o} ${o===1?"error":"errors"})`:null;return t.jsx("div",{className:c,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:C,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:V,children:V}),I&&t.jsx("span",{className:"chat-tool-calls-group-status",children:I})]}),a.map((p,F)=>r(p,F))]})})}const rs={pre:({children:a,...r})=>t.jsx("pre",{...r,className:"chat-markdown-pre",children:a}),table:({children:a,...r})=>t.jsx("table",{...r,className:"chat-markdown-table",children:a})},Pe="__fn_agent__",ls=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function ct(a){const r=/(^|[\s])\/([^\s]*)$/.exec(a);if(!r)return null;const c=r[1]??"",l=r[2]??"",o=r.index+c.length;return{filter:l,start:o,end:a.length}}function cs(a,r){const c=a.slice(0,r),l=/(^|[\s\n])@([\w-]*)$/.exec(c);if(!l)return null;const o=l[2]??"",C=c.length-o.length-1;return{filter:o,start:C,end:r}}function os({projectId:a,onClose:r,onCreate:c}){const[l,o]=s.useState("agent"),[C,M]=s.useState([]),[R,k]=s.useState(!0),[V,I]=s.useState(""),[p,F]=s.useState([]),[G,D]=s.useState(!0),[E,T]=s.useState(""),[z,A]=s.useState([]),[B,H]=s.useState([]);s.useEffect(()=>{let u=!1;return k(!0),ze(void 0,a).then(w=>{u||M(w)}).catch(()=>{u||M([])}).finally(()=>{u||k(!1)}),()=>{u=!0}},[a]),s.useEffect(()=>{D(!0),es().then(u=>{F(u.models),A(u.favoriteProviders),H(u.favoriteModels)}).catch(()=>{F([]),A([]),H([])}).finally(()=>{D(!1)})},[]);const se=s.useCallback(async u=>{const w=z,P=w.includes(u)?w.filter(O=>O!==u):[u,...w];A(P);try{await nt({favoriteProviders:P,favoriteModels:B})}catch{A(w)}},[z,B]),ne=s.useCallback(async u=>{const w=B,P=w.includes(u)?w.filter(O=>O!==u):[u,...w];H(P);try{await nt({favoriteProviders:z,favoriteModels:P})}catch{H(w)}},[B,z]),$=u=>{if(u.preventDefault(),l==="agent"){if(!V)return;c({agentId:V});return}if(!E)return;const w=E.indexOf("/");if(w<=0)return;const x=E.slice(0,w),P=E.slice(w+1);c({agentId:Pe,modelProvider:x,modelId:P})},K=l==="agent"?!V:!E;return t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog",onClick:u=>u.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:()=>{o("agent"),T("")},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:()=>{o("model"),I("")},children:"Model"})]}),t.jsxs("form",{onSubmit:$,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..."}):C.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:C.map(u=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${V===u.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>I(u.id),"data-testid":`agent-option-${u.id}`,children:[t.jsx(Ae,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:u.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:u.role})]},u.id))})]}),l==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:G?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(ts,{models:p,value:E,onChange:T,label:"Model",placeholder:"Select a model",favoriteProviders:z,onToggleFavorite:se,favoriteModels:B,onToggleModelFavorite:ne})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:K,children:"Create"})]})]})]})})}function gs({projectId:a,addToast:r}){const{activeSession:c,sessionsLoading:l,messages:o,messagesLoading:C,isStreaming:M,streamingText:R,streamingThinking:k,streamingToolCalls:V,selectSession:I,createSession:p,archiveSession:F,deleteSession:G,sendMessage:D,stopStreaming:E,pendingMessage:T,clearPendingMessage:z,searchQuery:A,setSearchQuery:B,filteredSessions:H}=ns(a),[se,ne]=s.useState(!1),[$,K]=s.useState(""),[u,w]=s.useState(null),[x,P]=s.useState(null),[O,Se]=s.useState(!0),[W,je]=s.useState(new Map),[oe,ae]=s.useState([]),[ye,ie]=s.useState(!0),[X,q]=s.useState(!1),[re,ge]=s.useState(""),[fe,de]=s.useState(0),[pe,le]=s.useState(""),[Q,Y]=s.useState(!1),[be,d]=s.useState(0),[g,h]=s.useState(-1),[j,Z]=s.useState(()=>new Set),[U,L]=s.useState([]),[we,b]=s.useState(!1),[,f]=s.useState(!1),[S,N]=s.useState({top:0,left:0}),m=It({projectId:a}),ce=s.useCallback(e=>{if(!e||!m.mentionActive)return;const n=e.getBoundingClientRect();N({top:n.top-260,left:n.left+8})},[m.mentionActive]),Oe=s.useRef(null),ee=s.useRef(null),Ue=s.useRef(null),_=s.useRef(null),He=s.useRef(null),Ve=s.useRef([]),ke=s.useRef(0),ue=zt()==="mobile",{keyboardOverlap:Ce,viewportHeight:Ge}=Ot({enabled:ue&&!!c}),ot=Ce>0?{"--keyboard-overlap":`${Ce}px`,...Ge!==null?{"--vv-height":`${Ge}px`}:{}}:{},J=s.useMemo(()=>{const e=re.trim().toLowerCase();return(e?oe.filter(i=>i.name.toLowerCase().includes(e)):oe).slice(0,10)},[oe,re]),xe=s.useMemo(()=>Array.from(W.values()),[W]),he=s.useMemo(()=>{const e=pe.trim().toLowerCase();return e?xe.filter(n=>n.name.toLowerCase().includes(e)):xe},[xe,pe]),Be=s.useMemo(()=>{const e=new Map;for(const n of xe)e.set(n.name.toLowerCase(),n);return e},[xe]);s.useEffect(()=>{de(0)},[J]),s.useEffect(()=>{d(0)},[pe,Q]),s.useEffect(()=>()=>{ee.current!==null&&window.clearTimeout(ee.current)},[]),s.useEffect(()=>{Oe.current?.scrollIntoView({behavior:"smooth"})},[o,R]),s.useEffect(()=>{if(Ce<=0)return;const e=Ue.current;e&&(e.scrollTop=e.scrollHeight)},[Ce]),s.useEffect(()=>{const e=()=>w(null);if(u)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[u]),s.useEffect(()=>{let e=!1;const n=a;return ze(void 0,a).then(i=>{if(e||n!==a)return;const v=new Map;for(const y of i)v.set(y.id,y);je(v)}).catch(()=>{}),()=>{e=!0}},[a]),s.useEffect(()=>{let e=!1;return ie(!0),Ut(a).then(n=>{e||ae(n)}).catch(()=>{e||ae([])}).finally(()=>{e||ie(!1)}),()=>{e=!0}},[a]),s.useEffect(()=>{Ve.current=U},[U]),s.useEffect(()=>()=>{for(const e of Ve.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl)},[]);const Me=s.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const i of Array.from(e)){if(!ls.includes(i.type))continue;const v=i.type.startsWith("image/");n.push({file:i,previewUrl:v?URL.createObjectURL(i):""})}n.length>0&&L(i=>[...i,...n])},[]),dt=s.useCallback(e=>{L(n=>{const i=n[e];return i?.previewUrl&&URL.revokeObjectURL(i.previewUrl),n.filter((v,y)=>y!==e)})},[]),ut=s.useCallback(e=>{const n=e.clipboardData?.files;if(!n||n.length===0)return;const i=Array.from(n).filter(v=>v.type.startsWith("image/"));i.length!==0&&Me(i)},[Me]),ht=s.useCallback(async e=>{try{await p(e),ne(!1),ue&&Se(!1)}catch{r("Failed to create chat session","error")}},[p,r,ue]),Re=s.useCallback(()=>{const e=$.trim(),n=U.map(i=>i.file);!e&&n.length===0||!c||(K(""),q(!1),ge(""),Y(!1),le(""),h(-1),D(e,n),L(i=>{for(const v of i)v.previewUrl&&URL.revokeObjectURL(v.previewUrl);return[]}))},[$,U,c,D]),De=s.useCallback(e=>{K(n=>{const i=ct(n);if(!i)return n;const v=`/skill:${e.name} `,y=n.slice(0,i.start)+v+n.slice(i.end);return window.requestAnimationFrame(()=>{_.current&&(_.current.style.height="auto",_.current.style.height=`${Math.min(_.current.scrollHeight,120)}px`,_.current.focus())}),y}),q(!1),ge(""),de(0)},[]),Ee=s.useCallback(e=>{const n=_.current;if(!n||g<0)return;const i=n.selectionStart??ke.current,v=n.selectionEnd??i,y=Math.max(i,v),Ne=Math.min(g,y),me=`${`@${e.name.replace(/\s+/g,"_")}`} `,_e=$.slice(0,Ne)+me+$.slice(y),ve=Ne+me.length;K(_e),Y(!1),le(""),d(0),h(-1),window.requestAnimationFrame(()=>{_.current&&(_.current.style.height="auto",_.current.style.height=`${Math.min(_.current.scrollHeight,120)}px`,_.current.focus(),_.current.setSelectionRange(ve,ve))})},[g,$]),mt=s.useCallback(e=>{const n=/@([\w-]+)/g,i=[];let v=0,y=n.exec(e);for(;y;){const[Ne,Ye=""]=y,me=y.index;me>v&&i.push(e.slice(v,me));const _e=Ye.replace(/_/g," ").toLowerCase(),ve=Be.get(_e);ve?i.push(t.jsxs("span",{className:"chat-mention-chip",children:["@",ve.name.replace(/\s+/g,"_")]},`${ve.id}-${me}`)):i.push(Ne),v=me+Ne.length,y=n.exec(e)}return v<e.length&&i.push(e.slice(v)),i.length===0?e:i},[Be]),Ke=s.useCallback(e=>c?`/api/chat/sessions/${encodeURIComponent(c.id)}/attachments/${encodeURIComponent(e)}`:"",[c]),gt=s.useCallback(e=>!e||e.length===0?null:t.jsx("div",{className:"chat-message-attachments",children:e.map(n=>{const i=n.mimeType.startsWith("image/"),v=n.id||n.filename,y=Ke(n.filename);return i?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:y,alt:n.originalName})},v):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(Ht,{size:14}),t.jsx("span",{children:n.originalName})]},v)})}),[Ke]),ft=s.useCallback(e=>{if(ke.current=e.currentTarget.selectionStart??ke.current,m.mentionActive&&m.files.length>0){if(m.handleKeyDown(e,$),e.key==="Enter"||e.key==="Tab"){const n=m.files[m.selectedIndex];if(n){const i=m.selectFile(n,$);K(i),m.dismissMention(),f(!1)}}return}if(Q&&e.key==="ArrowDown"){e.preventDefault(),he.length>0&&d(n=>(n+1)%he.length);return}if(Q&&e.key==="ArrowUp"){e.preventDefault(),he.length>0&&d(n=>n===0?he.length-1:n-1);return}if(Q&&e.key==="Enter"){e.preventDefault();const n=he[be]??he[0];n&&Ee(n);return}if(Q&&e.key==="Escape"){e.preventDefault(),Y(!1),le(""),h(-1);return}if(X&&e.key==="ArrowDown"){e.preventDefault(),J.length>0&&de(n=>(n+1)%J.length);return}if(X&&e.key==="ArrowUp"){e.preventDefault(),J.length>0&&de(n=>n===0?J.length-1:n-1);return}if(X&&(e.key==="Enter"||e.key==="Tab")&&J.length>0){e.preventDefault();const n=J[fe]??J[0];n&&De(n);return}if(X&&e.key==="Escape"){e.preventDefault(),q(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Re())},[Q,he,be,Ee,X,J,fe,De,Re,m,$]),Te=s.useCallback((e,n)=>{const i=cs(e,n);if(i){Y(!0),le(i.filter),h(i.start);return}Y(!1),le(""),h(-1)},[]),pt=s.useCallback(e=>{const n=e.target,i=n.value,v=n.selectionStart??i.length;ke.current=v,K(i);const y=ct(i);y?(q(!0),ge(y.filter)):(q(!1),ge("")),Te(i,v),m.detectMention(i,v),f(m.mentionActive),m.mentionActive&&ce(n),n.style.height="auto",n.style.height=`${Math.min(n.scrollHeight,120)}px`},[Te]),Fe=s.useCallback(e=>{const n=e.currentTarget,i=n.selectionStart??n.value.length;ke.current=i,Te(n.value,i),m.detectMention(n.value,i),f(m.mentionActive),m.mentionActive&&ce(n)},[Te,m,ce]),xt=s.useCallback(e=>{e.key!=="Escape"&&Fe(e)},[Fe]),vt=s.useCallback(()=>{ee.current!==null&&window.clearTimeout(ee.current),ee.current=window.setTimeout(()=>{q(!1),Y(!1),le(""),h(-1),f(!1),m.dismissMention(),ee.current=null},120)},[m]),St=s.useCallback(()=>{ee.current!==null&&(window.clearTimeout(ee.current),ee.current=null)},[]),bt=s.useCallback(async e=>{w(null);try{await F(e),r("Conversation archived","success")}catch{r("Failed to archive conversation","error")}},[F,r]),wt=s.useCallback(async e=>{P(null),w(null);try{await G(e),r("Conversation deleted","success")}catch{r("Failed to delete conversation","error")}},[G,r]),kt=s.useCallback(e=>{I(e),ue&&Se(!1)},[I,ue]),Nt=s.useCallback(()=>{I(""),Se(!0)},[I]),jt=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(Zt,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>ne(!0),children:[t.jsx(Ze,{size:16}),"New Chat"]})]}),te=rt(c?.modelProvider,c?.modelId),qe=c?.agentId===Pe?te??"Fusion":c?.title||W.get(c?.agentId??"")?.name||c?.agentId||"Chat",yt=!!(te&&te!==qe),Le=W.get(c?.agentId??"")?.name||(c?.agentId===Pe?te??"Fusion":c?.agentId?.slice(0,30)??"Fusion"),Je=!!(te&&te!==Le),Ct=T.length>50?`${T.slice(0,50)}…`:T,We=s.useCallback(e=>{Z(n=>{const i=new Set(n);return i.has(e)?i.delete(e):i.add(e),i})},[]),Qe=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(Vt,{remarkPlugins:[Gt],components:rs,children:e})}),[]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${O?"":" chat-sidebar--hidden"}`,children:[t.jsx("div",{className:"chat-sidebar-search",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Bt,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:A,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..."}):H.length===0?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):H.map(e=>t.jsxs("div",{className:`chat-session-item${c?.id===e.id?" chat-session-item--active":""}`,onClick:()=>kt(e.id),onContextMenu:n=>{n.preventDefault(),w({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(),P(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(Xe,{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:W.get(e.agentId)?.name||(e.agentId===Pe?rt(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))}),t.jsx("span",{children:e.updatedAt?it(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:()=>ne(!0),"data-testid":"chat-new-btn",children:[t.jsx(Ze,{size:14}),"New Chat"]})})]}),u&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:u.y,left:u.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>bt(u.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Kt,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{w(null),P(u.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(Xe,{size:14}),"Delete"]})]}),x&&t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:()=>P(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:()=>P(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void wt(x),children:"Delete"})]})]})}),t.jsxs("div",{className:"chat-thread",style:ot,children:[(c||!ue)&&t.jsxs("div",{className:"chat-thread-header",children:[ue&&c&&t.jsx("button",{className:"btn-icon",onClick:Nt,"data-testid":"chat-back-btn",children:t.jsx(qt,{size:16})}),t.jsx(Ae,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:qe}),yt&&t.jsx("span",{className:"chat-model-tag",children:te})]}),t.jsxs("div",{className:"chat-messages",ref:Ue,children:[C?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):o.length===0&&!c?jt():o.length===0&&c?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):t.jsxs(t.Fragment,{children:[o.map(e=>{const n=e.role==="assistant",i=j.has(e.id);return t.jsxs("div",{className:`chat-message chat-message--${e.role}`,"data-testid":`chat-message-${e.id}`,children:[n&&t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ae,{size:14}),t.jsx("span",{children:Le}),Je&&t.jsx("span",{className:"chat-model-tag",children:te}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${i?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":i?"Show rendered markdown":"Show plain text",onClick:()=>We(e.id),children:i?t.jsx(et,{size:14}):t.jsx(tt,{size:14})})]}),n?Qe(e.content,i):t.jsx("div",{className:"chat-message-content",children:mt(e.content)}),lt(e.toolCalls),e.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:e.thinkingOutput})]}),gt(e.attachments),t.jsx("div",{className:"chat-message-time",children:it(e.createdAt)})]},e.id)}),M&&t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ae,{size:14}),t.jsx("span",{children:Le}),Je&&t.jsx("span",{className:"chat-model-tag",children:te}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${j.has("__streaming__")?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":j.has("__streaming__")?"Show rendered markdown":"Show plain text",onClick:()=>We("__streaming__"),children:j.has("__streaming__")?t.jsx(et,{size:14}):t.jsx(tt,{size:14})})]}),R?Qe(R,j.has("__streaming__")):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:k?"Thinking…":"Connecting…"}),lt(V),k&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:k})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}),t.jsx("div",{ref:Oe})]}),c&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:He,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{Me(e.target.files),e.target.value=""}}),X&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:ye?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):J.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:re?"No skills found":"No skills available"}):J.map((e,n)=>t.jsxs("button",{type:"button",role:"option","aria-selected":n===fe,className:`chat-skill-menu-item${n===fe?" chat-skill-menu-item--highlighted":""}`,onMouseDown:i=>i.preventDefault(),onMouseEnter:()=>de(n),onClick:()=>De(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))}),U.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:U.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:()=>dt(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:()=>He.current?.click(),children:t.jsx(Jt,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${we?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),b(!0)},onDragLeave:()=>b(!1),onDrop:e=>{e.preventDefault(),b(!1),Me(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:_,className:"chat-input-textarea",placeholder:"Type a message...",value:$,onChange:pt,onKeyDown:ft,onKeyUp:xt,onClick:Fe,onBlur:vt,onFocus:St,onPaste:ut,rows:1,"data-testid":"chat-input"}),t.jsx(Wt,{agents:xe,filter:pe,highlightedIndex:be,visible:Q,onSelect:Ee,position:"below"}),t.jsx(Qt,{visible:m.mentionActive&&!Q,position:S,files:m.files,selectedIndex:m.selectedIndex,onSelect:e=>{const n=m.selectFile(e,$);K(n),m.dismissMention(),f(!1),_.current?.focus()},loading:m.loading}),T&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${Ct}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:z,children:"×"})]})]}),M?t.jsx("button",{className:"chat-input-stop",onClick:E,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(Yt,{size:14})}):t.jsx("button",{className:"chat-input-send",onClick:()=>void Re(),disabled:!$.trim()&&U.length===0,"data-testid":"chat-send-btn",children:t.jsx(Xt,{size:16})})]})]})]}),se&&t.jsx(os,{projectId:a,onClose:()=>ne(!1),onCreate:ht})]})}export{gs as ChatView};
@@ -1 +1 @@
1
- import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{bu as De,bv as de,bw as Ze,bx as ue,s as Ue,by as ge,bz as we,bA as xe,bB as ye,bC as et,bD as ae,bE as tt,bF as rt,bG as st,bH as nt,bI as at,bJ as ie,L as ee,S as it,bK as lt,bL as ct,O as ot,bM as Me,T as Ae,bN as dt,K as ut,aQ as vt,bO as mt,a5 as ft,aj as pt,R as ht}from"./index-Bs3RZu5I.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 I(e){try{return JSON.parse(e)}catch{return null}}function Q(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function gt(e){return e?.previewUrl??null}async function Ne(e){return tt(e)}async function Se(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 q(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function 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),[N,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(Q);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 Ne(e);if(n.current!==a)return;const c=q(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):Ne(e).then(S=>[q(S)]),typeof V(()=>ae)=="function"?ae(e):je(e).then(S=>S.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 S=c.value;if(y(S),S.length>0){const g=S[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=I(l.data);if(v?.lines){const S=v.lines.map(Q);f(Pe(S))}},log:l=>{if(n.current!==s)return;const v=I(l.data);if(v){const S=typeof v.line=="string"?v.line:Q(v);f(g=>le(g,S))}},"dev-server:log":l=>{if(n.current!==s)return;const v=I(l.data);if(v){const S=typeof v.line=="string"?v.line:Q(v);f(g=>le(g,S))}},"dev-server:output":l=>{if(n.current!==s)return;const v=I(l.data);v?.line&&f(S=>le(S,v.line))},status:l=>{if(n.current!==s)return;const v=I(l.data),S=v?.status;S&&o(g=>g&&{...g,status:S,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=I(l.data);if(v?.status){const S=q(v);o(S),y([S])}},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 Se({command:a,cwd:s},e);l=q(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>we)=="function")s=await we(d,e);else{const c=await wt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),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=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),T=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>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,S=await Se({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),g=q(S);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]),$=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:N,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:$,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 Y(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 Nt(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 St(e,i){const[o,b]=r.useState([]),[y,w]=r.useState(!1),[f,k]=r.useState(!1),[U,C]=r.useState(!1),[P,N]=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),N(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),N(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},$=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)=>Nt(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])),N(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=Y(a);s&&O(s)},log:a=>{const s=Y(a);s&&O(s)},history:a=>{const s=Y(a);$(s)},"dev-server:history":a=>{const s=Y(a);$(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)),N(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 $=z.lines.map((O,H)=>Z(O,H+1));b(O=>oe($,O)),C(z.totalLines>L+$.length),N(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),N=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(N(),!e){k("unknown"),C(null);return}k("unknown"),C(null);let j=!1;return queueMicrotask(()=>{j||(k("loading"),C(null))}),()=>{j=!0,N()}},[N,e]),r.useEffect(()=>{if(f!=="loading"){N();return}const j=setTimeout(()=>{w.current=null,n()},o);return w.current=j,()=>{clearTimeout(j),w.current===j&&(w.current=null)}},[N,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(N(),!e){k("unknown"),C(null);return}k("unknown"),C(null)},[N]);const R=r.useCallback(()=>{N(),k("unknown"),C(null)},[N]),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,N]=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:()=>N(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 N=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:N,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 Fe(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?Fe(e.cwd)===o:!0}function zt(e){return e.cwd==="."?"root":e.cwd}function Ft(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:N,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}=St(i,!!i),h=y,p=o?.config?.cwd??null,[E,L]=r.useState(!0),[z,$]=r.useState(""),[O,H]=r.useState(""),[x,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),S=l==="embedded"?h:null,{embedStatus:g,setEmbedStatus:$e,resetEmbedStatus:X,iframeRef:G,isEmbedded:Oe,isBlocked:te,blockReason:re,retry:fe}=Lt(S),[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(F=>!(F.scriptName!==x||m&&F.cwd!==m||o?.config?.command&&F.command!==o.config.command))??b.find(F=>_e(F,x,p))??null},[b,o?.config?.command,x,p]);r.useEffect(()=>{typeof N=="function"&&N().catch(m=>{e(Le(m),"error")})},[e,N]),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&&$(o.config.command);return}if(J){$(J.command);return}b.length>0&&$(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=G.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),X();return}}catch{}if(!(!h||!G.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),G.current.src=m.toString(),W(!1),X()}catch{G.current.src=h,W(!1),X()}},[h,G,X]),K=r.useCallback(async(m,F,ne)=>{c(m);try{await F(),e(ne,"success")}catch(Ye){e(Le(Ye),"error")}finally{c(null)}},[e]),He=r.useCallback(m=>{a(m.scriptName),L(!1),$(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 F=Re(p)??".",ne=J?.cwd??F;K("start",()=>k(m,ne),"Dev server started.")},qe=()=>{K("stop",U,"Dev server stopped.")},Ge=()=>{K("restart",C,"Dev server restarted.")},Ie=()=>{const m=O.trim(),F=m.length>0?m:null;K("preview",()=>P(F),F?"Preview URL updated.":"Preview URL override cleared.")},Xe=r.useCallback(()=>{f&&u()},[f,u]),Je=n==="starting"||n==="running"||s!==null,Ke=n==="stopped"||s!==null,Qe=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:qe,disabled:Ke,"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:Ge,disabled:Qe,"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:Xe,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 F=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${F?"dev-server-candidate--selected":""}`,onClick:()=>He(m),"data-testid":`dev-server-candidate-${m.scriptName}-${Fe(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:Ft(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=>$(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:Ie,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,{size:14})}),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,{size:14})})]})]}),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:$e,iframeRef:G,blockReason:re,onRetry:be})]})]})]})}export{Ht as DevServerView};
1
+ import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{bA as De,bB as de,bC as Ze,bD as ue,s as Ue,bE as ge,bF as we,bG as xe,bH as ye,bI as et,bJ as ae,bK as tt,bL as rt,bM as st,bN as nt,bO as at,bP as ie,L as ee,S as it,bQ as lt,bR as ct,O as ot,bS as Me,T as Ae,bT as dt,K as ut,aW as vt,bU as mt,a5 as ft,aj as pt,R as ht}from"./index-DNIrnlpO.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 I(e){try{return JSON.parse(e)}catch{return null}}function Q(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 q(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function 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(Q);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=q(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=>[q(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=I(l.data);if(v?.lines){const N=v.lines.map(Q);f(Pe(N))}},log:l=>{if(n.current!==s)return;const v=I(l.data);if(v){const N=typeof v.line=="string"?v.line:Q(v);f(g=>le(g,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=I(l.data);if(v){const N=typeof v.line=="string"?v.line:Q(v);f(g=>le(g,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=I(l.data);v?.line&&f(N=>le(N,v.line))},status:l=>{if(n.current!==s)return;const v=I(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=I(l.data);if(v?.status){const N=q(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=q(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>we)=="function")s=await we(d,e);else{const c=await wt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),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=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),T=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>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=q(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]),$=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:$,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 Y(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},$=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=Y(a);s&&O(s)},log:a=>{const s=Y(a);s&&O(s)},history:a=>{const s=Y(a);$(s)},"dev-server:history":a=>{const s=Y(a);$(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 $=z.lines.map((O,H)=>Z(O,H+1));b(O=>oe($,O)),C(z.totalLines>L+$.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 Fe(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?Fe(e.cwd)===o:!0}function zt(e){return e.cwd==="."?"root":e.cwd}function Ft(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,$]=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:$e,resetEmbedStatus:X,iframeRef:G,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(F=>!(F.scriptName!==x||m&&F.cwd!==m||o?.config?.command&&F.command!==o.config.command))??b.find(F=>_e(F,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&&$(o.config.command);return}if(J){$(J.command);return}b.length>0&&$(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=G.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),X();return}}catch{}if(!(!h||!G.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),G.current.src=m.toString(),W(!1),X()}catch{G.current.src=h,W(!1),X()}},[h,G,X]),K=r.useCallback(async(m,F,ne)=>{c(m);try{await F(),e(ne,"success")}catch(Ye){e(Le(Ye),"error")}finally{c(null)}},[e]),He=r.useCallback(m=>{a(m.scriptName),L(!1),$(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 F=Re(p)??".",ne=J?.cwd??F;K("start",()=>k(m,ne),"Dev server started.")},qe=()=>{K("stop",U,"Dev server stopped.")},Ge=()=>{K("restart",C,"Dev server restarted.")},Ie=()=>{const m=O.trim(),F=m.length>0?m:null;K("preview",()=>P(F),F?"Preview URL updated.":"Preview URL override cleared.")},Xe=r.useCallback(()=>{f&&u()},[f,u]),Je=n==="starting"||n==="running"||s!==null,Ke=n==="stopped"||s!==null,Qe=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:qe,disabled:Ke,"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:Ge,disabled:Qe,"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:Xe,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 F=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${F?"dev-server-candidate--selected":""}`,onClick:()=>He(m),"data-testid":`dev-server-candidate-${m.scriptName}-${Fe(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:Ft(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=>$(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:Ie,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,{size:14})}),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,{size:14})})]})]}),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:$e,iframeRef:G,blockReason:re,onRetry:be})]})]})]})}export{Ht as DevServerView};
@@ -1 +1 @@
1
- import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{dF as f,dG as g,cK as b,I as y,a9 as P,a4 as H,a5 as C,L as O,ag as v}from"./index-Bs3RZu5I.js";import{F as z}from"./folder-open-DWUflP4Q.js";function D({value:o,onChange:d,placeholder:m,onInputKeyDown:x,nodeId:l,localNodeId:h}){const[e,n]=i.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1}),a=i.useCallback(async(s,c=!1)=>{n(t=>({...t,loading:!0,error:null}));try{const t=await f(s,c,l,h);n(u=>({...u,loading:!1,currentPath:t.currentPath,parentPath:t.parentPath,entries:t.entries}))}catch(t){n(u=>({...u,loading:!1,error:t instanceof Error?t.message:"Failed to browse directory"}))}},[l,h]),j=i.useCallback(()=>{n(s=>s.isOpen?{...s,isOpen:!1}:{...s,isOpen:!0})},[]);i.useEffect(()=>{e.isOpen&&!e.loading&&e.entries.length===0&&!e.error&&a(o||void 0,e.showHidden)},[e.isOpen,e.loading,e.entries.length,e.error,o,e.showHidden,a,l,h]);const p=i.useCallback(s=>{a(s,e.showHidden)},[a,e.showHidden]),k=i.useCallback(()=>{d(e.currentPath),n(s=>({...s,isOpen:!1}))},[e.currentPath,d]),w=i.useCallback(()=>{n(s=>{const c=!s.showHidden;return{...s,showHidden:c}})},[]);i.useEffect(()=>{e.isOpen&&e.currentPath&&a(e.currentPath,e.showHidden)},[e.showHidden]);const N=e.currentPath?g(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:o,onChange:s=>d(s.target.value),onKeyDown:x,placeholder:m||"/path/to/your/project"}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:j,"aria-label":e.isOpen?"Close directory browser":"Browse directories",children:[e.isOpen?r.jsx(z,{size:16}):r.jsx(b,{size:16}),r.jsx("span",{children:"Browse"})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":"Directory browser",children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:N.map((s,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(y,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>p(s.path),title:s.path,children:s.label})]},s.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>p(e.parentPath),"aria-label":"Go to parent directory",title:"Parent directory",children:[r.jsx(P,{size:14}),r.jsx("span",{children:"Up"})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:w,"aria-label":e.showHidden?"Hide hidden directories":"Show hidden directories",title:e.showHidden?"Hide hidden":"Show hidden",children:[e.showHidden?r.jsx(H,{size:14}):r.jsx(C,{size:14}),r.jsx("span",{children:e.showHidden?"Hide hidden":"Show hidden"})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(O,{size:20,className:"animate-spin"}),r.jsx("span",{children:"Loading…"})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(v,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:"No subdirectories"}):e.entries.map(s=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>p(s.path),role:"treeitem",title:s.path,children:[r.jsx(b,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:s.name}),s.hasChildren&&r.jsx(y,{size:14,className:"directory-picker-entry-arrow"})]},s.path))}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:k,children:"Select"})]})]})]})}export{D};
1
+ import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{dK as f,dL as g,cQ as b,I as y,a9 as P,a4 as H,a5 as C,L as O,ag as v}from"./index-DNIrnlpO.js";import{F as z}from"./folder-open-DPESt6bg.js";function D({value:o,onChange:d,placeholder:m,onInputKeyDown:x,nodeId:l,localNodeId:h}){const[e,n]=i.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1}),a=i.useCallback(async(s,c=!1)=>{n(t=>({...t,loading:!0,error:null}));try{const t=await f(s,c,l,h);n(u=>({...u,loading:!1,currentPath:t.currentPath,parentPath:t.parentPath,entries:t.entries}))}catch(t){n(u=>({...u,loading:!1,error:t instanceof Error?t.message:"Failed to browse directory"}))}},[l,h]),j=i.useCallback(()=>{n(s=>s.isOpen?{...s,isOpen:!1}:{...s,isOpen:!0})},[]);i.useEffect(()=>{e.isOpen&&!e.loading&&e.entries.length===0&&!e.error&&a(o||void 0,e.showHidden)},[e.isOpen,e.loading,e.entries.length,e.error,o,e.showHidden,a,l,h]);const p=i.useCallback(s=>{a(s,e.showHidden)},[a,e.showHidden]),k=i.useCallback(()=>{d(e.currentPath),n(s=>({...s,isOpen:!1}))},[e.currentPath,d]),w=i.useCallback(()=>{n(s=>{const c=!s.showHidden;return{...s,showHidden:c}})},[]);i.useEffect(()=>{e.isOpen&&e.currentPath&&a(e.currentPath,e.showHidden)},[e.showHidden]);const N=e.currentPath?g(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:o,onChange:s=>d(s.target.value),onKeyDown:x,placeholder:m||"/path/to/your/project"}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:j,"aria-label":e.isOpen?"Close directory browser":"Browse directories",children:[e.isOpen?r.jsx(z,{size:16}):r.jsx(b,{size:16}),r.jsx("span",{children:"Browse"})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":"Directory browser",children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:N.map((s,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(y,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>p(s.path),title:s.path,children:s.label})]},s.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>p(e.parentPath),"aria-label":"Go to parent directory",title:"Parent directory",children:[r.jsx(P,{size:14}),r.jsx("span",{children:"Up"})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:w,"aria-label":e.showHidden?"Hide hidden directories":"Show hidden directories",title:e.showHidden?"Hide hidden":"Show hidden",children:[e.showHidden?r.jsx(H,{size:14}):r.jsx(C,{size:14}),r.jsx("span",{children:e.showHidden?"Hide hidden":"Show hidden"})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(O,{size:20,className:"animate-spin"}),r.jsx("span",{children:"Loading…"})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(v,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:"No subdirectories"}):e.entries.map(s=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>p(s.path),role:"treeitem",title:s.path,children:[r.jsx(b,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:s.name}),s.hasChildren&&r.jsx(y,{size:14,className:"directory-picker-entry-arrow"})]},s.path))}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:k,children:"Select"})]})]})]})}export{D};