@runfusion/fusion 0.27.1 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +3418 -864
- package/dist/client/assets/AgentDetailView-DSpIqBOs.css +1 -0
- package/dist/client/assets/{AgentDetailView-shgiiUb4.js → AgentDetailView-V32TpEe1.js} +3 -3
- package/dist/client/assets/{AgentsView-CpwqOVDz.js → AgentsView-CxITZE-U.js} +3 -3
- package/dist/client/assets/ChatView-7WPHyB_7.js +1 -0
- package/dist/client/assets/DevServerView-Diw4hjw0.js +1 -0
- package/dist/client/assets/{DirectoryPicker-C0kmRv0u.js → DirectoryPicker-CWSApoLU.js} +1 -1
- package/dist/client/assets/{DocumentsView-B94U9ijs.js → DocumentsView-1kr0dhsV.js} +1 -1
- package/dist/client/assets/{EvalsView-O_4YWy--.js → EvalsView-cDfXYiK6.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-CkEiF85-.js → ExperimentalAgentOnboardingModal-lNSf6UtY.js} +1 -1
- package/dist/client/assets/{InsightsView-D-Qe0tRr.js → InsightsView-D2AjxOnu.js} +1 -1
- package/dist/client/assets/{MemoryView-CoRUmRvb.js → MemoryView-Dq4yjIPI.js} +1 -1
- package/dist/client/assets/{NodesView-DQzXjcLc.js → NodesView-Cpmkze7n.js} +4 -4
- package/dist/client/assets/{PiExtensionsManager-Dn1LmFbq.js → PiExtensionsManager-oi9FHT0y.js} +2 -2
- package/dist/client/assets/PluginManager-C4UoLv4U.css +1 -0
- package/dist/client/assets/PluginManager-o12KG4e8.js +1 -0
- package/dist/client/assets/ResearchView-C7uXon3o.css +1 -0
- package/dist/client/assets/ResearchView-C9bjVB7-.js +1 -0
- package/dist/client/assets/{SettingsModal-Bg1-3JO_.js → SettingsModal-CT01a5Rh.js} +1 -1
- package/dist/client/assets/SettingsModal-Cu93Jjho.js +31 -0
- package/dist/client/assets/{SetupWizardModal-DuzYPbuJ.js → SetupWizardModal-Agi3XNtZ.js} +1 -1
- package/dist/client/assets/{SkillsView-BIFoVNUf.js → SkillsView-DmZfbGLs.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-C52KsV7f.js → StashRecoveryView-BwKJQaUW.js} +1 -1
- package/dist/client/assets/{TodoView-sS_mT0Y7.js → TodoView-uJRg4Cnl.js} +2 -2
- package/dist/client/assets/dashboard-view-C7Snlgow.js +21 -0
- package/dist/client/assets/dashboard-view-DqWnXEbq.css +1 -0
- package/dist/client/assets/{folder-open-B9cwJ-OX.js → folder-open-DU-Ec_iC.js} +1 -1
- package/dist/client/assets/index-CD0_dkME.css +1 -0
- package/dist/client/assets/index-DiewofJh.js +692 -0
- package/dist/client/assets/{star-BDn04UYV.js → star-Qi0GspVN.js} +1 -1
- package/dist/client/assets/{upload-zdPPycKQ.js → upload-Dx_l9Vbu.js} +1 -1
- package/dist/client/assets/{users-CPYZjK2g.js → users-3Qw_TMah.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +2628 -573
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/registration.test.ts +2 -4
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/runtime-availability.test.ts +5 -2
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/workflow-integration.test.ts +7 -4
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/references/engine-tools.md +1 -0
- package/skill/fusion/references/extension-tools.md +3 -1
- package/dist/client/assets/AgentDetailView-B7QRcHJH.css +0 -1
- package/dist/client/assets/ChatView-DyRBOIKL.js +0 -1
- package/dist/client/assets/DevServerView-Cdelj9-m.js +0 -1
- package/dist/client/assets/PluginManager-DtRQXia5.css +0 -1
- package/dist/client/assets/PluginManager-Y0fs-6No.js +0 -1
- package/dist/client/assets/ResearchView-BEI4ZSGs.css +0 -1
- package/dist/client/assets/ResearchView-CjOxKhdS.js +0 -1
- package/dist/client/assets/SettingsModal-DL7tjJQa.js +0 -31
- package/dist/client/assets/dashboard-view-BoTzlP8b.css +0 -1
- package/dist/client/assets/dashboard-view-MB-86hAu.js +0 -21
- package/dist/client/assets/index-BOjPRqEk.js +0 -692
- package/dist/client/assets/index-BmSEq8Rb.css +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-
|
|
2
|
-
import{c as Ue,A as De,C as Je,Z as Zt,s as qt,r as ht,F as pt,f as Jt,a as Qt,b as zt,B as xt,u as Dt,d as nt,e as Xt,g as Yt,h as es,i as ts,j as Ct,k as Xe,P as ss,l as as,m as ns,n as ls,o as St,G as is,S as rs,L as lt,T as it,R as Ve,X as At,p as os,q as cs,t as Tt,v as ds,w as us,x as ms,y as gs,z as fe,D as rt,E as hs,H as ps,N as xs,I as Rt,J as bs,M as vs,K as js,O as fs,Q as Ns,U as ot,V as Mt,W as ys,_ as ks,Y as ws,$ as Ze,a0 as Cs,a1 as Et,a2 as Ss,a3 as As,a4 as Ts}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-V32TpEe1.js","assets/vendor-react-K0fH_qHe.js","assets/index-DiewofJh.js","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/index-CD0_dkME.css","assets/star-Qi0GspVN.js","assets/ExperimentalAgentOnboardingModal-lNSf6UtY.js","assets/ExperimentalAgentOnboardingModal-B-APN_lM.css","assets/AgentDetailView-DSpIqBOs.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{c as Ue,A as De,C as Je,Z as Zt,s as qt,r as ht,F as pt,f as Jt,a as Qt,b as zt,B as xt,u as Dt,d as nt,e as Xt,g as Yt,h as es,i as ts,j as Ct,k as Xe,P as ss,l as as,m as ns,n as ls,o as St,G as is,S as rs,L as lt,T as it,R as Ve,X as At,p as os,q as cs,t as Tt,v as ds,w as us,x as ms,y as gs,z as fe,D as rt,E as hs,H as ps,N as xs,I as Rt,J as bs,M as vs,K as js,O as fs,Q as Ns,U as ot,V as Mt,W as ys,_ as ks,Y as ws,$ as Ze,a0 as Cs,a1 as Et,a2 as Ss,a3 as As,a4 as Ts}from"./index-DiewofJh.js";import{r as a,j as e,a as Rs}from"./vendor-react-K0fH_qHe.js";import{A as Ms,S as Es,E as _s,f as $s}from"./ExperimentalAgentOnboardingModal-lNSf6UtY.js";import{U as bt}from"./upload-Dx_l9Vbu.js";import{F as Ls}from"./folder-open-DU-Ec_iC.js";import"./vendor-xterm-DzcZoU0P.js";/**
|
|
3
3
|
* @license lucide-react v1.7.0 - ISC
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the ISC license.
|
|
@@ -31,4 +31,4 @@ reportsTo: null
|
|
|
31
31
|
skills:
|
|
32
32
|
- review
|
|
33
33
|
---
|
|
34
|
-
Agent instructions go here...`,value:N,onChange:l=>{b("paste"),C([]),k(l.target.value),z(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",o]}),ce&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(it,{size:14}),ce]})]}),g==="preview"&&e.jsxs("div",{className:"agent-import-preview",children:[e.jsxs("div",{className:"agent-import-company",children:[e.jsx("span",{className:"agent-import-company-label",children:"Company"}),e.jsx("span",{className:"agent-import-company-name",children:w})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(pt,{size:14}),e.jsxs("span",{children:[T.length," agent",T.length!==1?"s":""," found"]})]}),T.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L(T.map(l=>l.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L([]),children:"Clear agents"})]}),T.length>0?e.jsx("div",{className:"agent-import-agent-list",children:T.map((l,x)=>e.jsxs("div",{className:"agent-import-agent-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select agent ${l.name}`,checked:p.includes(l.name),onChange:()=>Se(l.name)})}),e.jsx("span",{className:"agent-import-agent-icon",children:l.icon||"🤖"}),e.jsxs("div",{className:"agent-import-agent-details",children:[e.jsx("span",{className:"agent-import-agent-name",children:l.name}),e.jsxs("span",{className:"agent-import-agent-meta",children:[l.title&&e.jsxs("span",{className:"agent-import-agent-title",children:[l.title," · "]}),e.jsx("span",{className:"agent-import-agent-role",children:l.role}),l.reportsTo&&e.jsxs("span",{className:"agent-import-agent-reports",children:[" · reports to ",l.reportsTo]}),l.skills&&l.skills.length>0&&e.jsxs("span",{className:"agent-import-agent-model",children:[" · skills: ",l.skills.join(", ")]})]}),l.instructionsText&&e.jsxs("span",{className:"agent-import-agent-instructions",children:[l.instructionsText.slice(0,100),l.instructionsText.length>100?"...":""]})]})]},x))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),S.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(pt,{size:14}),e.jsxs("span",{children:[S.length," skill",S.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ee(S.map(l=>l.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ee([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:S.map((l,x)=>e.jsxs("div",{className:"agent-import-skill-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select skill ${l.name}`,checked:$.includes(l.name),onChange:()=>Ae(l.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:l.name}),l.description&&e.jsx("span",{className:"agent-import-skill-description",children:l.description})]})]},`${l.name}-${x}`))})]}),be&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(it,{size:14}),be]})]}),g==="result"&&y&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(Je,{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:y.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[y.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[y.created.length," created"]})}),y.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[y.skipped.length," skipped (already exist)"]})}),y.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[y.errors.length," error",y.errors.length!==1?"s":""]})})]}),y.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:y.created.map((l,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Je,{size:12}),e.jsx("span",{children:l.name})]},x))}),y.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:y.errors.map((l,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(At,{size:12}),e.jsxs("span",{children:[l.name,": ",l.error]})]},x))}),y.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:[y.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[y.skills.imported.length," skill",y.skills.imported.length!==1?"s":""," imported"]})}),y.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[y.skills.skipped.length," skill",y.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),y.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[y.skills.errors.length," skill",y.skills.errors.length!==1?"s":""," error",y.skills.errors.length!==1?"s":""]})}),y.skills.imported.length===0&&y.skills.skipped.length===0&&y.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"})})]}),y.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:y.skills.imported.map((l,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Je,{size:12}),e.jsx("span",{children:l.name})]},x))}),y.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:y.skills.errors.map((l,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(At,{size:12}),e.jsxs("span",{children:[l.name,": ",l.error]})]},x))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[g==="preview"&&e.jsx("button",{className:"btn",onClick:()=>c("input"),disabled:te,children:"Back"}),e.jsx("button",{className:"btn",onClick:_e,disabled:te,children:g==="result"?"Close":"Cancel"}),g==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void X(),disabled:Ne||(o==="directory"?M.length===0:o==="browse"?!G:!N.trim()),children:Ne?e.jsxs(e.Fragment,{children:[e.jsx(lt,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),g==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void $e(),disabled:te||H===0&&F===0,children:te?e.jsxs(e.Fragment,{children:[e.jsx(lt,{size:14,className:"spin"}),Y]}):`Import ${Ce}`})]})]})}):null}const Ht=220,aa=24,na=24,la=16;function Ot(n){return n.children.length===0?1:n.children.reduce((i,f)=>i+Ot(f),0)}function ia(n){const i=Ot(n);return i*Ht+Math.max(0,i-1)*aa}function ra(n){if(n.length===0)return Ht;const f=n.map(ia).reduce((d,g)=>d+g,0),u=Math.max(0,n.length-1)*na;return f+u+la*2}function oa(n){const i=Number.isFinite(n.availableWidth)&&n.availableWidth>0?n.availableWidth:0;return i===0||n.tree.length<=1?"horizontal":ra(n.tree)>i?"vertical":"horizontal"}const Pt=a.lazy(()=>ks(()=>import("./AgentDetailView-shgiiUb4.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])).then(n=>({default:n.AgentDetailView}))),qe=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],mt=[.1,.25,.5,1,2,3,5,10],gt=[.75,1,1.25,1.5];function vt(n){switch(n){case"running":return"agent-badge--running";case"active":return"agent-badge--active";case"paused":return"agent-badge--paused";case"error":return"agent-badge--error";case"idle":default:return"agent-badge--idle"}}function jt(n,i){switch(i){case"running":return`${n}--running`;case"active":return`${n}--active`;case"paused":return`${n}--paused`;case"error":return`${n}--error`;case"idle":default:return`${n}--idle`}}function Qe(n){return n.children.length===0?1:n.children.reduce((i,f)=>i+Qe(f),0)}function ft(n,i){return n.state==="error"?{title:void 0,label:"Error"}:{title:i.reason??i.label,label:i.stateDerived?null:i.label}}function Bt({node:n,onSelect:i,getHealthStatus:f,getRoleIcon:u,selectedAgentId:d}){const{agent:g,children:c}=n,o=f(g),b=ft(g,o),N=vt(g.state),k=jt("org-chart-node-card",g.state),M=Qe(n),C={"--org-chart-subtree-leaves":String(M)},w=c.length>0?Qe(c[0]):1,P=c.length>0?Qe(c[c.length-1]):1,T={"--org-chart-first-child-leaves":String(w),"--org-chart-last-child-leaves":String(P)};return e.jsxs("div",{className:`org-chart-node${c.length>0?" org-chart-node--has-children":""}`,style:C,children:[e.jsxs("div",{className:`${k}${d===g.id?" agent-card--selected":""}`,onClick:()=>i(g.id),role:"button",tabIndex:0,onKeyDown:E=>{(E.key==="Enter"||E.key===" ")&&(E.key===" "&&E.preventDefault(),i(g.id))},children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:e.jsx(Xe,{agent:g,size:20})}),e.jsx("span",{className:"org-chart-node__name",children:g.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${N}`,children:g.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:o.color},title:b.title,children:[o.icon,b.label&&e.jsx("span",{className:"text-secondary",children:b.label})]})]})]}),c.length>0&&e.jsx("div",{className:"org-chart-children",style:T,role:"group","aria-label":`${g.name} employees`,children:c.map(E=>e.jsx(Bt,{node:E,onSelect:i,getHealthStatus:f,getRoleIcon:u,selectedAgentId:d},E.agent.id))})]})}function pa({addToast:n,projectId:i,onOpenTaskLogs:f,agentOnboardingEnabled:u=!1}){const[d,g]=a.useState(!1),o=os()==="mobile",[b,N]=a.useState("all"),{agents:k,stats:M,isLoading:C,loadAgents:w,refreshAgents:P}=cs(i,{filterState:b,showSystemAgents:d}),[T,E]=a.useState(!1),[S,_]=a.useState(null),[p,L]=a.useState(!1),[$,ee]=a.useState(null),[Ne,oe]=a.useState(null),te=o&&!!$,[le,ce]=a.useState("dashboard"),[z,y]=a.useState(null),[xe,be]=a.useState(!1),[A,se]=a.useState(()=>{if(typeof window>"u")return"list";const t=Tt("fn-agent-view",i);return t==="list"||t==="board"||t==="org"?t:"list"}),[de,ye]=a.useState([]),[ae,U]=a.useState(!1),[ue,G]=a.useState(0),[W,V]=a.useState(!1),[ve,ie]=a.useState(!1),[K,Q]=a.useState(1),Me=a.useRef(null),Ee=a.useRef(null),{confirm:_e}=ds(),ke=a.useRef(null),me=a.useId();a.useEffect(()=>{const t=Tt("fn-agent-view",i);if(t==="list"||t==="board"||t==="org"){se(t);return}se("list")},[i]),a.useEffect(()=>{us("fn-agent-view",A,i)},[A,i]);const[we,X]=a.useState(null),$e=a.useRef(null),[H,F]=a.useState(null),[re,Z]=a.useState(null),[Ce,Y]=a.useState({}),[Se,Ae]=a.useState(1),[l,x]=a.useState(!1),[R,q]=a.useState(new Set),[I,D]=a.useState(new Map),Te=a.useRef(!0);a.useEffect(()=>(Te.current=!0,()=>{Te.current=!1}),[]),a.useEffect(()=>{ms(i).then(t=>{Te.current&&Ae(t.heartbeatMultiplier??1)}).catch(()=>{})},[i]);const Le=a.useCallback(async t=>{const r=Number.isFinite(t)&&t>0?t:1;Ae(r),x(!0);try{await gs({heartbeatMultiplier:r},i),n(`Heartbeat speed set to ×${r.toFixed(1)}`,"success")}catch(m){n(`Failed to save heartbeat multiplier: ${fe(m)}`,"error")}finally{Te.current&&x(!1)}},[i,n]),Fe=a.useMemo(()=>I.size===0?k:k.map(t=>{const r=I.get(t.id);return r?{...t,state:r}:t}),[k,I]),Ie=a.useMemo(()=>Fe.filter(t=>d||!rt(t)),[Fe,d]),Ye=a.useMemo(()=>Fe.filter(t=>t.state!=="active"&&t.state!=="running"?!1:d||!rt(t)),[Fe,d]),je=a.useMemo(()=>{if(d)return de;const t=r=>rt(r.agent)?null:{...r,children:r.children.map(t).filter(m=>m!==null)};return de.map(t).filter(r=>r!==null)},[de,d]);a.useEffect(()=>{if(A!=="org")return;const t=Ee.current;if(!t)return;const r=()=>{G(t.clientWidth)};r();const m=typeof ResizeObserver<"u"?new ResizeObserver(r):null;return m?.observe(t),window.addEventListener("resize",r),()=>{m?.disconnect(),window.removeEventListener("resize",r)}},[A,je.length]),a.useEffect(()=>{if(A!=="org")return;let t=!1;return U(!0),hs(i,{includeEphemeral:d}).then(r=>{t||ye(r)}).catch(r=>{t||(n(`Failed to load org chart: ${fe(r)}`,"error"),ye([]))}).finally(()=>{t||U(!1)}),()=>{t=!0}},[A,i,d,n]),a.useEffect(()=>{const t=setInterval(()=>{w()},3e4);return()=>{clearInterval(t)}},[w]),a.useEffect(()=>{if(!W)return;const t=m=>{const j=m.target;j&&(Me.current?.contains(j)||ke.current?.contains(j)||V(!1))},r=m=>{m.key==="Escape"&&(V(!1),ke.current?.focus())};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",r),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",r)}},[W]);const ge=async(t,r)=>{if(!R.has(t)){q(m=>new Set(m).add(t)),D(m=>{const j=new Map(m);return j.set(t,r),j});try{await Ss(t,r,i),n(`Agent state updated to ${r}`,"success"),await w(),D(m=>{const j=new Map(m);return j.delete(t),j})}catch(m){D(j=>{const O=new Map(j);return O.delete(t),O}),n(`Failed to update state: ${fe(m)}`,"error")}finally{q(m=>{const j=new Set(m);return j.delete(t),j})}}},et=async(t,r)=>{if(await _e({title:"Delete Agent",message:`Delete agent "${r}"? This cannot be undone.`,danger:!0}))try{await Ts(t,i),n(`Agent "${r}" deleted`,"success"),await w()}catch(j){n(`Failed to delete agent: ${fe(j)}`,"error")}},We=async(t,r)=>{const m=k.find(j=>j.id===t);if(m){if(m.role===r){X(null);return}try{await Ze(t,{role:r},i),n(`Agent role updated to ${qe.find(j=>j.value===r)?.label??r}`,"success"),X(null),w()}catch(j){n(`Failed to update role: ${fe(j)}`,"error")}}},Pe=(t,r)=>{t.key==="Escape"&&X(null)},He=async(t,r)=>{re===t.id&&(Z(null),Y(m=>{const j={...m};return delete j[t.id],j})),F(t.id);try{await Ze(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:r}},i),n(`Heartbeat interval updated to ${Et(r)} for ${t.name}`,"success"),w()}catch(m){n(`Failed to update heartbeat interval: ${fe(m)}`,"error")}finally{F(null)}},Oe=async t=>{const r=Ce[t.id]??"";if(r.trim()===""){n("Please enter a heartbeat interval in minutes","error");return}const m=Number(r);if(isNaN(m)){n("Heartbeat interval must be a valid number","error");return}if(m<=0){n("Heartbeat interval must be greater than 0","error");return}if(m>=1&&m<5){F(t.id);try{await Ze(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:Cs}},i),n(`Heartbeat interval set to 5 minutes (minimum). ${m} minute${m!==1?"s":""} was below the 5-minute minimum.`,"success"),Z(null),Y(O=>{const J={...O};return delete J[t.id],J}),w()}catch(O){n(`Failed to update heartbeat interval: ${fe(O)}`,"error")}finally{F(null)}return}const j=Math.round(m*6e4);F(t.id);try{await Ze(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:j}},i),n(`Heartbeat interval updated to ${Et(j)} for ${t.name}`,"success"),Z(null),Y(O=>{const J={...O};return delete J[t.id],J}),w()}catch(O){n(`Failed to update heartbeat interval: ${fe(O)}`,"error")}finally{F(null)}},Ke=t=>{const r=ht(t.runtimeConfig?.heartbeatIntervalMs),m=Math.round(r/6e4);Z(t.id),Y(j=>({...j,[t.id]:String(m)}))},s=a.useCallback((t,r)=>{ee(t),ce(r?.initialTab??"dashboard"),y(r?.initialRunId??null),be(r?.preferActiveRun??!1)},[]),v=a.useCallback(()=>{ee(null),ce("dashboard"),y(null),be(!1)},[]),he=a.useCallback(t=>{s(t)},[s]),ne=a.useCallback(t=>{oe(t),s(t)},[s]),Re=a.useCallback(async({agentId:t,deleted:r})=>{await P(),r&&$===t&&v()},[P,$,v]),Gt=a.useCallback(t=>{s(t),o&&ie(!1)},[o,s]),Vt=async(t,r)=>{D(m=>{const j=new Map(m);return j.set(t,"running"),j});try{await As(t,i,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),n(`Heartbeat run started for ${r}`,"success"),await w(),D(m=>{const j=new Map(m);return j.delete(t),j})}catch(m){D(j=>{const O=new Map(j);return O.delete(t),O}),n(`Failed to start heartbeat run: ${fe(m)}`,"error")}},tt=a.useCallback(t=>{se(t),t!=="org"&&Q(1),o&&$&&v()},[v,o,$]),Nt=t=>qe.find(r=>r.value===t)?.label??t,Ut=t=>qe.find(r=>r.value===t)?.icon??"◆",yt=gt[K],kt=a.useMemo(()=>oa({tree:je,availableWidth:ue}),[je,ue]),Wt=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],st=t=>ws(t),wt=C&&k.length===0,Be=a.useCallback(()=>{E(!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(xt,{size:24}),e.jsx("h2",{children:"Agents"})]}),e.jsxs("div",{className:"agents-view-controls",children:[e.jsxs("div",{className:"view-toggle",children:[e.jsx("button",{className:`view-toggle-btn${A==="list"?" active":""}`,onClick:()=>tt("list"),title:"List view","aria-label":"List view","aria-pressed":A==="list",children:e.jsx(ps,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="board"?" active":""}`,onClick:()=>tt("board"),title:"Board view","aria-label":"Board view","aria-pressed":A==="board",children:e.jsx(De,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="org"?" active":""}`,onClick:()=>tt("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":A==="org",children:e.jsx(xs,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:ke,className:`btn-icon agent-controls-trigger${W?" agent-controls-trigger--active":""}`,onClick:()=>V(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":W,"aria-controls":me,children:e.jsx(Hs,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void w(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Ve,{size:16,className:C?"spin":void 0})}),!o&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm agent-import-trigger",onClick:()=>{L(!0),V(!1)},"aria-label":"Import",title:"Import",children:[e.jsx(bt,{size:16}),"Import"]}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{Be(),V(!1)},"aria-label":"New Agent",title:"New Agent",children:[e.jsx(Rt,{size:16}),"New Agent"]})]}),W&&e.jsxs("div",{ref:Me,id:me,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsx("div",{className:"agent-controls",children:e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(bs,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:b,onChange:t=>N(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:d,onChange:t=>g(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]})}),o&&e.jsxs("div",{className:"agent-controls-mobile-actions",children:[e.jsxs("button",{className:"btn btn-sm agent-import-trigger",onClick:()=>{L(!0),V(!1)},"aria-label":"Import",title:"Import",children:[e.jsx(bt,{size:16}),"Import"]}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{Be(),V(!1)},"aria-label":"New Agent",title:"New Agent",children:[e.jsx(Rt,{size:16}),"New Agent"]})]}),e.jsx("div",{className:"agent-global-controls agent-controls-actions",children:e.jsxs("div",{className:"heartbeat-multiplier-group",children:[e.jsxs("div",{className:"heartbeat-multiplier-controls",children:[e.jsx("label",{htmlFor:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-label",children:"Heartbeat Speed"}),e.jsx("input",{id:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-slider touch-target",type:"range",min:.1,max:10,step:.1,value:Se,onChange:t=>{const r=Number(t.target.value);Le(Number.isFinite(r)&&r>0?r:1)},disabled:l}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",Se.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(mt.reduce((t,r)=>Math.abs(r-Se)<Math.abs(t-Se)?r:t,mt[0])),onChange:t=>{const r=Number(t.target.value);Le(Number.isFinite(r)&&r>0?r:1)},disabled:l,"aria-label":"Heartbeat speed preset",children:mt.map(t=>e.jsxs("option",{value:String(t),children:["×",t]},t))})]}),e.jsx("small",{className:"text-secondary",children:"Scales all agent heartbeat intervals. ×0.5 = twice as fast, ×2.0 = twice as slow. Default: ×1.0"})]})}),e.jsx(Us,{agents:Ie})]})]})]})]}),e.jsx(ea,{isOpen:T,onClose:()=>{E(!1),_(null)},onCreated:()=>{E(!1),_(null),w()},projectId:i,prefillDraft:S,agentOnboardingEnabled:u,existingAgents:k,onPrefillDraft:_}),e.jsx(sa,{isOpen:p,onClose:()=>L(!1),onImported:()=>void w(),projectId:i}),e.jsx(Xs,{stats:M,activeAgents:Ye,projectId:i,isOpen:ve,onToggle:()=>ie(t=>!t),onSelectAgent:Gt,onOpenTaskLogs:f}),A==="org"?e.jsx("div",{className:"agents-org-full-view",children:e.jsx("div",{className:"agents-view-content agents-view-content--org-full",children:$?e.jsxs("div",{className:"agents-org-detail-view","data-testid":"agents-org-detail-view",children:[e.jsx("button",{type:"button",className:"btn btn-sm agents-org-detail-back",onClick:v,"aria-label":"Back to org chart",children:"Back to org chart"}),e.jsx(a.Suspense,{fallback:null,children:e.jsx(Pt,{inline:!0,showInlineBackButton:!1,agentId:$,projectId:i,onClose:v,addToast:n,onChildClick:he,initialTab:le,initialRunId:z,preferActiveRun:xe},$)})]}):wt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ve,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):e.jsxs("div",{className:"agent-org-chart-shell","data-testid":"agent-org-chart-shell",children:[o?e.jsxs("div",{className:"agent-org-chart-controls","data-testid":"agent-org-chart-controls",children:[e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>Q(t=>Math.max(0,t-1)),disabled:K===0,"aria-label":"Zoom out org chart",title:"Zoom out",children:e.jsx(Vs,{size:16})}),e.jsxs("span",{className:"agent-org-chart-controls__zoom-label","aria-live":"polite",children:[Math.round(yt*100),"%"]}),e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>Q(t=>Math.min(gt.length-1,t+1)),disabled:K===gt.length-1,"aria-label":"Zoom in org chart",title:"Zoom in",children:e.jsx(Bs,{size:16})}),e.jsxs("button",{type:"button",className:"btn touch-target btn-sm agent-org-chart-controls__fit-btn",onClick:()=>Q(1),"aria-label":"Fit org chart",title:"Fit org chart",children:[e.jsx(vs,{size:16}),"Fit"]})]}):null,e.jsx("div",{ref:Ee,className:"agent-org-chart-viewport","data-testid":"agent-org-chart-viewport",children:e.jsx("div",{className:`agent-org-chart-canvas agent-org-chart-canvas--zoom-${Math.round(yt*100)}`,children:e.jsx("div",{className:`agent-org-chart${kt==="vertical"?" agent-org-chart--vertical":""}`,"data-testid":"agent-org-chart","data-layout-mode":kt,children:ae?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Ve,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):je.length===0?e.jsx(dt,{onCtaClick:Be}):je.map(t=>e.jsx(Bt,{node:t,onSelect:ne,getHealthStatus:st,getRoleIcon:Ut,selectedAgentId:Ne},t.agent.id))})})})]})})}):e.jsxs("div",{className:"agents-split-layout",children:[e.jsx("div",{className:`agents-split-sidebar${te?" agents-split-sidebar--hidden-mobile":""}`,children:e.jsx("div",{className:"agents-view-content",children:wt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ve,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):A==="board"?e.jsx("div",{className:"agent-board",children:Ie.length===0?e.jsx(dt,{onCtaClick:Be}):Ie.map(t=>{const r=st(t),m=ft(t,r),j=vt(t.state),O=jt("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${O}${$===t.id?" agent-card--selected":""}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>s(t.id),role:"button",tabIndex:0,onKeyDown:J=>{(J.key==="Enter"||J.key===" ")&&(J.key===" "&&J.preventDefault(),s(t.id))},children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:e.jsx(Xe,{agent:t,size:20})}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:Nt(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${j}`,children:t.state}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"agent-board-badge badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:r.color},title:m.title,children:[r.icon,m.label?` ${m.label}`:""]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:Ie.length===0?e.jsx(dt,{onCtaClick:Be}):Ie.map(t=>{const r=st(t),m=ft(t,r),j=vt(t.state),O=jt("agent-card",t.state),J=ht(t.runtimeConfig?.heartbeatIntervalMs),Kt=js(J),Ge=H===t.id;return e.jsxs("div",{className:`agent-card agent-card--clickable ${O}${$===t.id?" agent-card--selected":""}`,onClick:h=>{const B=h.target;if(B===h.currentTarget){s(t.id);return}const pe=B.closest('button, select, input, [role="button"]');pe&&pe!==h.currentTarget||s(t.id)},role:"button",tabIndex:0,onKeyDown:h=>{h.target===h.currentTarget&&(h.key==="Enter"||h.key===" ")&&(h.key===" "&&h.preventDefault(),s(t.id))},"aria-label":`Open details for ${t.name}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info",children:[we===t.id?e.jsx("select",{ref:$e,className:"select agent-role-select",value:t.role,onChange:h=>void We(t.id,h.target.value),onKeyDown:h=>Pe(h,t.id),onBlur:()=>X(null),autoFocus:!0,children:qe.map(h=>e.jsxs("option",{value:h.value,children:[h.icon," ",h.label]},h.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:h=>{h.stopPropagation(),X(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.stopPropagation(),X(t.id))},children:e.jsx(Xe,{agent:t,size:20})}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(zt,{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:r.color},title:m.title,children:[r.icon,m.label?` ${m.label}`:""]}),e.jsx("span",{className:"badge text-secondary",children:Nt(t.role)}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null,(()=>{const h=Wt(t);if(h.length===0)return null;const B=h.slice(0,2),pe=h.length-2;return e.jsxs(e.Fragment,{children:[B.map(at=>e.jsx("span",{className:"badge badge-skill",title:at,children:$s(at)},at)),pe>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",pe]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.state==="error"&&t.lastError?e.jsx(fs,{errorText:t.lastError,issueContext:{surface:"AgentsView list",agentId:t.id,agentName:t.name,agentState:t.state,taskId:t.taskId}}):null,t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),re===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:Ce[t.id]??"",onChange:h=>Y(B=>({...B,[t.id]:h.target.value})),onKeyDown:h=>{h.key==="Enter"?Oe(t):h.key==="Escape"&&(Z(null),Y(B=>{const pe={...B};return delete pe[t.id],pe}))},disabled:Ge,"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 Oe(t),disabled:Ge,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn-sm",onClick:()=>{Z(null),Y(h=>{const B={...h};return delete B[t.id],B})},disabled:Ge,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:J,onChange:h=>{const B=h.target.value;B==="__custom__"?Ke(t):He(t,Number(B))},disabled:Ge,"aria-label":`Set heartbeat interval for ${t.name}`,children:[Kt.map(h=>e.jsx("option",{value:h.value,children:h.label},h.value)),Ns.some(h=>h.value===J)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),Ge&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const h=new Date(t.lastHeartbeatAt),B=new Date(h.getTime()+J),pe=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:h.toLocaleString(),children:["Last: ",h.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]}),pe&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:B.toLocaleString(),children:["Next: ",B.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[e.jsxs("div",{className:"agent-card-actions-group agent-card-actions-group--primary",children:[t.state==="idle"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"active"),disabled:R.has(t.id),title:"Activate",children:[e.jsx(ot,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Start"})]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void Vt(t.id,t.name),disabled:R.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(De,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Run Now"})]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"paused"),disabled:R.has(t.id),title:"Pause",children:[e.jsx(Mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Pause"})]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"active"),disabled:R.has(t.id),title:"Resume",children:[e.jsx(ot,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Resume"})]}),t.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>s(t.id,{initialTab:"runs",initialRunId:null,preferActiveRun:!0}),title:"View live run details","aria-label":`View live run details for ${t.name}`,children:[e.jsx(De,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Running"})]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"paused"),disabled:R.has(t.id),title:"Pause",children:[e.jsx(Mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Pause"})]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"active"),disabled:R.has(t.id),title:"Retry",children:[e.jsx(ot,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Retry"})]})]}),e.jsxs("div",{className:"agent-card-actions-group agent-card-actions-group--secondary",children:[e.jsxs("button",{className:"btn btn-sm agent-card-details-btn",onClick:()=>s(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:[e.jsx(Fs,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Details"})]}),(t.state==="idle"||t.state==="paused")&&e.jsxs("button",{className:"btn btn-sm btn-danger",onClick:()=>void et(t.id,t.name),title:"Delete",children:[e.jsx(ys,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Delete"})]})]})]})]},t.id)})})})}),e.jsx("div",{className:`agents-split-detail${o&&!$?" agents-split-detail--hidden-mobile":""}`,children:$?e.jsx(a.Suspense,{fallback:null,children:e.jsx(Pt,{inline:!0,showInlineBackButton:o,agentId:$,projectId:i,onClose:v,addToast:n,onChildClick:he,initialTab:le,initialRunId:z,preferActiveRun:xe,onMutationSuccess:Re},$)}):e.jsxs("div",{className:"agents-detail-empty-state",children:[e.jsx(xt,{size:48}),e.jsx("h3",{children:"Select an agent"}),e.jsx("p",{children:"Choose an agent from the sidebar to view details"})]})})]})]})}export{pa as AgentsView};
|
|
34
|
+
Agent instructions go here...`,value:N,onChange:l=>{b("paste"),C([]),k(l.target.value),z(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",o]}),ce&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(it,{size:14}),ce]})]}),g==="preview"&&e.jsxs("div",{className:"agent-import-preview",children:[e.jsxs("div",{className:"agent-import-company",children:[e.jsx("span",{className:"agent-import-company-label",children:"Company"}),e.jsx("span",{className:"agent-import-company-name",children:w})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(pt,{size:14}),e.jsxs("span",{children:[T.length," agent",T.length!==1?"s":""," found"]})]}),T.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L(T.map(l=>l.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L([]),children:"Clear agents"})]}),T.length>0?e.jsx("div",{className:"agent-import-agent-list",children:T.map((l,x)=>e.jsxs("div",{className:"agent-import-agent-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select agent ${l.name}`,checked:p.includes(l.name),onChange:()=>Se(l.name)})}),e.jsx("span",{className:"agent-import-agent-icon",children:l.icon||"🤖"}),e.jsxs("div",{className:"agent-import-agent-details",children:[e.jsx("span",{className:"agent-import-agent-name",children:l.name}),e.jsxs("span",{className:"agent-import-agent-meta",children:[l.title&&e.jsxs("span",{className:"agent-import-agent-title",children:[l.title," · "]}),e.jsx("span",{className:"agent-import-agent-role",children:l.role}),l.reportsTo&&e.jsxs("span",{className:"agent-import-agent-reports",children:[" · reports to ",l.reportsTo]}),l.skills&&l.skills.length>0&&e.jsxs("span",{className:"agent-import-agent-model",children:[" · skills: ",l.skills.join(", ")]})]}),l.instructionsText&&e.jsxs("span",{className:"agent-import-agent-instructions",children:[l.instructionsText.slice(0,100),l.instructionsText.length>100?"...":""]})]})]},x))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),S.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(pt,{size:14}),e.jsxs("span",{children:[S.length," skill",S.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ee(S.map(l=>l.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ee([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:S.map((l,x)=>e.jsxs("div",{className:"agent-import-skill-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select skill ${l.name}`,checked:$.includes(l.name),onChange:()=>Ae(l.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:l.name}),l.description&&e.jsx("span",{className:"agent-import-skill-description",children:l.description})]})]},`${l.name}-${x}`))})]}),be&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(it,{size:14}),be]})]}),g==="result"&&y&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(Je,{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:y.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[y.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[y.created.length," created"]})}),y.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[y.skipped.length," skipped (already exist)"]})}),y.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[y.errors.length," error",y.errors.length!==1?"s":""]})})]}),y.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:y.created.map((l,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Je,{size:12}),e.jsx("span",{children:l.name})]},x))}),y.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:y.errors.map((l,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(At,{size:12}),e.jsxs("span",{children:[l.name,": ",l.error]})]},x))}),y.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:[y.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[y.skills.imported.length," skill",y.skills.imported.length!==1?"s":""," imported"]})}),y.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[y.skills.skipped.length," skill",y.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),y.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[y.skills.errors.length," skill",y.skills.errors.length!==1?"s":""," error",y.skills.errors.length!==1?"s":""]})}),y.skills.imported.length===0&&y.skills.skipped.length===0&&y.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"})})]}),y.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:y.skills.imported.map((l,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Je,{size:12}),e.jsx("span",{children:l.name})]},x))}),y.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:y.skills.errors.map((l,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(At,{size:12}),e.jsxs("span",{children:[l.name,": ",l.error]})]},x))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[g==="preview"&&e.jsx("button",{className:"btn",onClick:()=>c("input"),disabled:te,children:"Back"}),e.jsx("button",{className:"btn",onClick:_e,disabled:te,children:g==="result"?"Close":"Cancel"}),g==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void X(),disabled:Ne||(o==="directory"?M.length===0:o==="browse"?!G:!N.trim()),children:Ne?e.jsxs(e.Fragment,{children:[e.jsx(lt,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),g==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void $e(),disabled:te||H===0&&F===0,children:te?e.jsxs(e.Fragment,{children:[e.jsx(lt,{size:14,className:"spin"}),Y]}):`Import ${Ce}`})]})]})}):null}const Ht=220,aa=24,na=24,la=16;function Ot(n){return n.children.length===0?1:n.children.reduce((i,f)=>i+Ot(f),0)}function ia(n){const i=Ot(n);return i*Ht+Math.max(0,i-1)*aa}function ra(n){if(n.length===0)return Ht;const f=n.map(ia).reduce((d,g)=>d+g,0),u=Math.max(0,n.length-1)*na;return f+u+la*2}function oa(n){const i=Number.isFinite(n.availableWidth)&&n.availableWidth>0?n.availableWidth:0;return i===0||n.tree.length<=1?"horizontal":ra(n.tree)>i?"vertical":"horizontal"}const Pt=a.lazy(()=>ks(()=>import("./AgentDetailView-V32TpEe1.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])).then(n=>({default:n.AgentDetailView}))),qe=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],mt=[.1,.25,.5,1,2,3,5,10],gt=[.75,1,1.25,1.5];function vt(n){switch(n){case"running":return"agent-badge--running";case"active":return"agent-badge--active";case"paused":return"agent-badge--paused";case"error":return"agent-badge--error";case"idle":default:return"agent-badge--idle"}}function jt(n,i){switch(i){case"running":return`${n}--running`;case"active":return`${n}--active`;case"paused":return`${n}--paused`;case"error":return`${n}--error`;case"idle":default:return`${n}--idle`}}function Qe(n){return n.children.length===0?1:n.children.reduce((i,f)=>i+Qe(f),0)}function ft(n,i){return n.state==="error"?{title:void 0,label:"Error"}:{title:i.reason??i.label,label:i.stateDerived?null:i.label}}function Bt({node:n,onSelect:i,getHealthStatus:f,getRoleIcon:u,selectedAgentId:d}){const{agent:g,children:c}=n,o=f(g),b=ft(g,o),N=vt(g.state),k=jt("org-chart-node-card",g.state),M=Qe(n),C={"--org-chart-subtree-leaves":String(M)},w=c.length>0?Qe(c[0]):1,P=c.length>0?Qe(c[c.length-1]):1,T={"--org-chart-first-child-leaves":String(w),"--org-chart-last-child-leaves":String(P)};return e.jsxs("div",{className:`org-chart-node${c.length>0?" org-chart-node--has-children":""}`,style:C,children:[e.jsxs("div",{className:`${k}${d===g.id?" agent-card--selected":""}`,onClick:()=>i(g.id),role:"button",tabIndex:0,onKeyDown:E=>{(E.key==="Enter"||E.key===" ")&&(E.key===" "&&E.preventDefault(),i(g.id))},children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:e.jsx(Xe,{agent:g,size:20})}),e.jsx("span",{className:"org-chart-node__name",children:g.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${N}`,children:g.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:o.color},title:b.title,children:[o.icon,b.label&&e.jsx("span",{className:"text-secondary",children:b.label})]})]})]}),c.length>0&&e.jsx("div",{className:"org-chart-children",style:T,role:"group","aria-label":`${g.name} employees`,children:c.map(E=>e.jsx(Bt,{node:E,onSelect:i,getHealthStatus:f,getRoleIcon:u,selectedAgentId:d},E.agent.id))})]})}function pa({addToast:n,projectId:i,onOpenTaskLogs:f,agentOnboardingEnabled:u=!1}){const[d,g]=a.useState(!1),o=os()==="mobile",[b,N]=a.useState("all"),{agents:k,stats:M,isLoading:C,loadAgents:w,refreshAgents:P}=cs(i,{filterState:b,showSystemAgents:d}),[T,E]=a.useState(!1),[S,_]=a.useState(null),[p,L]=a.useState(!1),[$,ee]=a.useState(null),[Ne,oe]=a.useState(null),te=o&&!!$,[le,ce]=a.useState("dashboard"),[z,y]=a.useState(null),[xe,be]=a.useState(!1),[A,se]=a.useState(()=>{if(typeof window>"u")return"list";const t=Tt("fn-agent-view",i);return t==="list"||t==="board"||t==="org"?t:"list"}),[de,ye]=a.useState([]),[ae,U]=a.useState(!1),[ue,G]=a.useState(0),[W,V]=a.useState(!1),[ve,ie]=a.useState(!1),[K,Q]=a.useState(1),Me=a.useRef(null),Ee=a.useRef(null),{confirm:_e}=ds(),ke=a.useRef(null),me=a.useId();a.useEffect(()=>{const t=Tt("fn-agent-view",i);if(t==="list"||t==="board"||t==="org"){se(t);return}se("list")},[i]),a.useEffect(()=>{us("fn-agent-view",A,i)},[A,i]);const[we,X]=a.useState(null),$e=a.useRef(null),[H,F]=a.useState(null),[re,Z]=a.useState(null),[Ce,Y]=a.useState({}),[Se,Ae]=a.useState(1),[l,x]=a.useState(!1),[R,q]=a.useState(new Set),[I,D]=a.useState(new Map),Te=a.useRef(!0);a.useEffect(()=>(Te.current=!0,()=>{Te.current=!1}),[]),a.useEffect(()=>{ms(i).then(t=>{Te.current&&Ae(t.heartbeatMultiplier??1)}).catch(()=>{})},[i]);const Le=a.useCallback(async t=>{const r=Number.isFinite(t)&&t>0?t:1;Ae(r),x(!0);try{await gs({heartbeatMultiplier:r},i),n(`Heartbeat speed set to ×${r.toFixed(1)}`,"success")}catch(m){n(`Failed to save heartbeat multiplier: ${fe(m)}`,"error")}finally{Te.current&&x(!1)}},[i,n]),Fe=a.useMemo(()=>I.size===0?k:k.map(t=>{const r=I.get(t.id);return r?{...t,state:r}:t}),[k,I]),Ie=a.useMemo(()=>Fe.filter(t=>d||!rt(t)),[Fe,d]),Ye=a.useMemo(()=>Fe.filter(t=>t.state!=="active"&&t.state!=="running"?!1:d||!rt(t)),[Fe,d]),je=a.useMemo(()=>{if(d)return de;const t=r=>rt(r.agent)?null:{...r,children:r.children.map(t).filter(m=>m!==null)};return de.map(t).filter(r=>r!==null)},[de,d]);a.useEffect(()=>{if(A!=="org")return;const t=Ee.current;if(!t)return;const r=()=>{G(t.clientWidth)};r();const m=typeof ResizeObserver<"u"?new ResizeObserver(r):null;return m?.observe(t),window.addEventListener("resize",r),()=>{m?.disconnect(),window.removeEventListener("resize",r)}},[A,je.length]),a.useEffect(()=>{if(A!=="org")return;let t=!1;return U(!0),hs(i,{includeEphemeral:d}).then(r=>{t||ye(r)}).catch(r=>{t||(n(`Failed to load org chart: ${fe(r)}`,"error"),ye([]))}).finally(()=>{t||U(!1)}),()=>{t=!0}},[A,i,d,n]),a.useEffect(()=>{const t=setInterval(()=>{w()},3e4);return()=>{clearInterval(t)}},[w]),a.useEffect(()=>{if(!W)return;const t=m=>{const j=m.target;j&&(Me.current?.contains(j)||ke.current?.contains(j)||V(!1))},r=m=>{m.key==="Escape"&&(V(!1),ke.current?.focus())};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",r),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",r)}},[W]);const ge=async(t,r)=>{if(!R.has(t)){q(m=>new Set(m).add(t)),D(m=>{const j=new Map(m);return j.set(t,r),j});try{await Ss(t,r,i),n(`Agent state updated to ${r}`,"success"),await w(),D(m=>{const j=new Map(m);return j.delete(t),j})}catch(m){D(j=>{const O=new Map(j);return O.delete(t),O}),n(`Failed to update state: ${fe(m)}`,"error")}finally{q(m=>{const j=new Set(m);return j.delete(t),j})}}},et=async(t,r)=>{if(await _e({title:"Delete Agent",message:`Delete agent "${r}"? This cannot be undone.`,danger:!0}))try{await Ts(t,i),n(`Agent "${r}" deleted`,"success"),await w()}catch(j){n(`Failed to delete agent: ${fe(j)}`,"error")}},We=async(t,r)=>{const m=k.find(j=>j.id===t);if(m){if(m.role===r){X(null);return}try{await Ze(t,{role:r},i),n(`Agent role updated to ${qe.find(j=>j.value===r)?.label??r}`,"success"),X(null),w()}catch(j){n(`Failed to update role: ${fe(j)}`,"error")}}},Pe=(t,r)=>{t.key==="Escape"&&X(null)},He=async(t,r)=>{re===t.id&&(Z(null),Y(m=>{const j={...m};return delete j[t.id],j})),F(t.id);try{await Ze(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:r}},i),n(`Heartbeat interval updated to ${Et(r)} for ${t.name}`,"success"),w()}catch(m){n(`Failed to update heartbeat interval: ${fe(m)}`,"error")}finally{F(null)}},Oe=async t=>{const r=Ce[t.id]??"";if(r.trim()===""){n("Please enter a heartbeat interval in minutes","error");return}const m=Number(r);if(isNaN(m)){n("Heartbeat interval must be a valid number","error");return}if(m<=0){n("Heartbeat interval must be greater than 0","error");return}if(m>=1&&m<5){F(t.id);try{await Ze(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:Cs}},i),n(`Heartbeat interval set to 5 minutes (minimum). ${m} minute${m!==1?"s":""} was below the 5-minute minimum.`,"success"),Z(null),Y(O=>{const J={...O};return delete J[t.id],J}),w()}catch(O){n(`Failed to update heartbeat interval: ${fe(O)}`,"error")}finally{F(null)}return}const j=Math.round(m*6e4);F(t.id);try{await Ze(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:j}},i),n(`Heartbeat interval updated to ${Et(j)} for ${t.name}`,"success"),Z(null),Y(O=>{const J={...O};return delete J[t.id],J}),w()}catch(O){n(`Failed to update heartbeat interval: ${fe(O)}`,"error")}finally{F(null)}},Ke=t=>{const r=ht(t.runtimeConfig?.heartbeatIntervalMs),m=Math.round(r/6e4);Z(t.id),Y(j=>({...j,[t.id]:String(m)}))},s=a.useCallback((t,r)=>{ee(t),ce(r?.initialTab??"dashboard"),y(r?.initialRunId??null),be(r?.preferActiveRun??!1)},[]),v=a.useCallback(()=>{ee(null),ce("dashboard"),y(null),be(!1)},[]),he=a.useCallback(t=>{s(t)},[s]),ne=a.useCallback(t=>{oe(t),s(t)},[s]),Re=a.useCallback(async({agentId:t,deleted:r})=>{await P(),r&&$===t&&v()},[P,$,v]),Gt=a.useCallback(t=>{s(t),o&&ie(!1)},[o,s]),Vt=async(t,r)=>{D(m=>{const j=new Map(m);return j.set(t,"running"),j});try{await As(t,i,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),n(`Heartbeat run started for ${r}`,"success"),await w(),D(m=>{const j=new Map(m);return j.delete(t),j})}catch(m){D(j=>{const O=new Map(j);return O.delete(t),O}),n(`Failed to start heartbeat run: ${fe(m)}`,"error")}},tt=a.useCallback(t=>{se(t),t!=="org"&&Q(1),o&&$&&v()},[v,o,$]),Nt=t=>qe.find(r=>r.value===t)?.label??t,Ut=t=>qe.find(r=>r.value===t)?.icon??"◆",yt=gt[K],kt=a.useMemo(()=>oa({tree:je,availableWidth:ue}),[je,ue]),Wt=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],st=t=>ws(t),wt=C&&k.length===0,Be=a.useCallback(()=>{E(!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(xt,{size:24}),e.jsx("h2",{children:"Agents"})]}),e.jsxs("div",{className:"agents-view-controls",children:[e.jsxs("div",{className:"view-toggle",children:[e.jsx("button",{className:`view-toggle-btn${A==="list"?" active":""}`,onClick:()=>tt("list"),title:"List view","aria-label":"List view","aria-pressed":A==="list",children:e.jsx(ps,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="board"?" active":""}`,onClick:()=>tt("board"),title:"Board view","aria-label":"Board view","aria-pressed":A==="board",children:e.jsx(De,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="org"?" active":""}`,onClick:()=>tt("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":A==="org",children:e.jsx(xs,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:ke,className:`btn-icon agent-controls-trigger${W?" agent-controls-trigger--active":""}`,onClick:()=>V(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":W,"aria-controls":me,children:e.jsx(Hs,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void w(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Ve,{size:16,className:C?"spin":void 0})}),!o&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm agent-import-trigger",onClick:()=>{L(!0),V(!1)},"aria-label":"Import",title:"Import",children:[e.jsx(bt,{size:16}),"Import"]}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{Be(),V(!1)},"aria-label":"New Agent",title:"New Agent",children:[e.jsx(Rt,{size:16}),"New Agent"]})]}),W&&e.jsxs("div",{ref:Me,id:me,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsx("div",{className:"agent-controls",children:e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(bs,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:b,onChange:t=>N(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:d,onChange:t=>g(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]})}),o&&e.jsxs("div",{className:"agent-controls-mobile-actions",children:[e.jsxs("button",{className:"btn btn-sm agent-import-trigger",onClick:()=>{L(!0),V(!1)},"aria-label":"Import",title:"Import",children:[e.jsx(bt,{size:16}),"Import"]}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{Be(),V(!1)},"aria-label":"New Agent",title:"New Agent",children:[e.jsx(Rt,{size:16}),"New Agent"]})]}),e.jsx("div",{className:"agent-global-controls agent-controls-actions",children:e.jsxs("div",{className:"heartbeat-multiplier-group",children:[e.jsxs("div",{className:"heartbeat-multiplier-controls",children:[e.jsx("label",{htmlFor:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-label",children:"Heartbeat Speed"}),e.jsx("input",{id:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-slider touch-target",type:"range",min:.1,max:10,step:.1,value:Se,onChange:t=>{const r=Number(t.target.value);Le(Number.isFinite(r)&&r>0?r:1)},disabled:l}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",Se.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(mt.reduce((t,r)=>Math.abs(r-Se)<Math.abs(t-Se)?r:t,mt[0])),onChange:t=>{const r=Number(t.target.value);Le(Number.isFinite(r)&&r>0?r:1)},disabled:l,"aria-label":"Heartbeat speed preset",children:mt.map(t=>e.jsxs("option",{value:String(t),children:["×",t]},t))})]}),e.jsx("small",{className:"text-secondary",children:"Scales all agent heartbeat intervals. ×0.5 = twice as fast, ×2.0 = twice as slow. Default: ×1.0"})]})}),e.jsx(Us,{agents:Ie})]})]})]})]}),e.jsx(ea,{isOpen:T,onClose:()=>{E(!1),_(null)},onCreated:()=>{E(!1),_(null),w()},projectId:i,prefillDraft:S,agentOnboardingEnabled:u,existingAgents:k,onPrefillDraft:_}),e.jsx(sa,{isOpen:p,onClose:()=>L(!1),onImported:()=>void w(),projectId:i}),e.jsx(Xs,{stats:M,activeAgents:Ye,projectId:i,isOpen:ve,onToggle:()=>ie(t=>!t),onSelectAgent:Gt,onOpenTaskLogs:f}),A==="org"?e.jsx("div",{className:"agents-org-full-view",children:e.jsx("div",{className:"agents-view-content agents-view-content--org-full",children:$?e.jsxs("div",{className:"agents-org-detail-view","data-testid":"agents-org-detail-view",children:[e.jsx("button",{type:"button",className:"btn btn-sm agents-org-detail-back",onClick:v,"aria-label":"Back to org chart",children:"Back to org chart"}),e.jsx(a.Suspense,{fallback:null,children:e.jsx(Pt,{inline:!0,showInlineBackButton:!1,agentId:$,projectId:i,onClose:v,addToast:n,onChildClick:he,initialTab:le,initialRunId:z,preferActiveRun:xe},$)})]}):wt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ve,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):e.jsxs("div",{className:"agent-org-chart-shell","data-testid":"agent-org-chart-shell",children:[o?e.jsxs("div",{className:"agent-org-chart-controls","data-testid":"agent-org-chart-controls",children:[e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>Q(t=>Math.max(0,t-1)),disabled:K===0,"aria-label":"Zoom out org chart",title:"Zoom out",children:e.jsx(Vs,{size:16})}),e.jsxs("span",{className:"agent-org-chart-controls__zoom-label","aria-live":"polite",children:[Math.round(yt*100),"%"]}),e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>Q(t=>Math.min(gt.length-1,t+1)),disabled:K===gt.length-1,"aria-label":"Zoom in org chart",title:"Zoom in",children:e.jsx(Bs,{size:16})}),e.jsxs("button",{type:"button",className:"btn touch-target btn-sm agent-org-chart-controls__fit-btn",onClick:()=>Q(1),"aria-label":"Fit org chart",title:"Fit org chart",children:[e.jsx(vs,{size:16}),"Fit"]})]}):null,e.jsx("div",{ref:Ee,className:"agent-org-chart-viewport","data-testid":"agent-org-chart-viewport",children:e.jsx("div",{className:`agent-org-chart-canvas agent-org-chart-canvas--zoom-${Math.round(yt*100)}`,children:e.jsx("div",{className:`agent-org-chart${kt==="vertical"?" agent-org-chart--vertical":""}`,"data-testid":"agent-org-chart","data-layout-mode":kt,children:ae?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Ve,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):je.length===0?e.jsx(dt,{onCtaClick:Be}):je.map(t=>e.jsx(Bt,{node:t,onSelect:ne,getHealthStatus:st,getRoleIcon:Ut,selectedAgentId:Ne},t.agent.id))})})})]})})}):e.jsxs("div",{className:"agents-split-layout",children:[e.jsx("div",{className:`agents-split-sidebar${te?" agents-split-sidebar--hidden-mobile":""}`,children:e.jsx("div",{className:"agents-view-content",children:wt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ve,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):A==="board"?e.jsx("div",{className:"agent-board",children:Ie.length===0?e.jsx(dt,{onCtaClick:Be}):Ie.map(t=>{const r=st(t),m=ft(t,r),j=vt(t.state),O=jt("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${O}${$===t.id?" agent-card--selected":""}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>s(t.id),role:"button",tabIndex:0,onKeyDown:J=>{(J.key==="Enter"||J.key===" ")&&(J.key===" "&&J.preventDefault(),s(t.id))},children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:e.jsx(Xe,{agent:t,size:20})}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:Nt(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${j}`,children:t.state}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"agent-board-badge badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:r.color},title:m.title,children:[r.icon,m.label?` ${m.label}`:""]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:Ie.length===0?e.jsx(dt,{onCtaClick:Be}):Ie.map(t=>{const r=st(t),m=ft(t,r),j=vt(t.state),O=jt("agent-card",t.state),J=ht(t.runtimeConfig?.heartbeatIntervalMs),Kt=js(J),Ge=H===t.id;return e.jsxs("div",{className:`agent-card agent-card--clickable ${O}${$===t.id?" agent-card--selected":""}`,onClick:h=>{const B=h.target;if(B===h.currentTarget){s(t.id);return}const pe=B.closest('button, select, input, [role="button"]');pe&&pe!==h.currentTarget||s(t.id)},role:"button",tabIndex:0,onKeyDown:h=>{h.target===h.currentTarget&&(h.key==="Enter"||h.key===" ")&&(h.key===" "&&h.preventDefault(),s(t.id))},"aria-label":`Open details for ${t.name}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info",children:[we===t.id?e.jsx("select",{ref:$e,className:"select agent-role-select",value:t.role,onChange:h=>void We(t.id,h.target.value),onKeyDown:h=>Pe(h,t.id),onBlur:()=>X(null),autoFocus:!0,children:qe.map(h=>e.jsxs("option",{value:h.value,children:[h.icon," ",h.label]},h.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:h=>{h.stopPropagation(),X(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.stopPropagation(),X(t.id))},children:e.jsx(Xe,{agent:t,size:20})}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(zt,{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:r.color},title:m.title,children:[r.icon,m.label?` ${m.label}`:""]}),e.jsx("span",{className:"badge text-secondary",children:Nt(t.role)}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null,(()=>{const h=Wt(t);if(h.length===0)return null;const B=h.slice(0,2),pe=h.length-2;return e.jsxs(e.Fragment,{children:[B.map(at=>e.jsx("span",{className:"badge badge-skill",title:at,children:$s(at)},at)),pe>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",pe]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.state==="error"&&t.lastError?e.jsx(fs,{errorText:t.lastError,issueContext:{surface:"AgentsView list",agentId:t.id,agentName:t.name,agentState:t.state,taskId:t.taskId}}):null,t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),re===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:Ce[t.id]??"",onChange:h=>Y(B=>({...B,[t.id]:h.target.value})),onKeyDown:h=>{h.key==="Enter"?Oe(t):h.key==="Escape"&&(Z(null),Y(B=>{const pe={...B};return delete pe[t.id],pe}))},disabled:Ge,"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 Oe(t),disabled:Ge,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn-sm",onClick:()=>{Z(null),Y(h=>{const B={...h};return delete B[t.id],B})},disabled:Ge,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:J,onChange:h=>{const B=h.target.value;B==="__custom__"?Ke(t):He(t,Number(B))},disabled:Ge,"aria-label":`Set heartbeat interval for ${t.name}`,children:[Kt.map(h=>e.jsx("option",{value:h.value,children:h.label},h.value)),Ns.some(h=>h.value===J)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),Ge&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const h=new Date(t.lastHeartbeatAt),B=new Date(h.getTime()+J),pe=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:h.toLocaleString(),children:["Last: ",h.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]}),pe&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:B.toLocaleString(),children:["Next: ",B.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[e.jsxs("div",{className:"agent-card-actions-group agent-card-actions-group--primary",children:[t.state==="idle"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"active"),disabled:R.has(t.id),title:"Activate",children:[e.jsx(ot,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Start"})]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void Vt(t.id,t.name),disabled:R.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(De,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Run Now"})]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"paused"),disabled:R.has(t.id),title:"Pause",children:[e.jsx(Mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Pause"})]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"active"),disabled:R.has(t.id),title:"Resume",children:[e.jsx(ot,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Resume"})]}),t.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>s(t.id,{initialTab:"runs",initialRunId:null,preferActiveRun:!0}),title:"View live run details","aria-label":`View live run details for ${t.name}`,children:[e.jsx(De,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Running"})]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"paused"),disabled:R.has(t.id),title:"Pause",children:[e.jsx(Mt,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Pause"})]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"active"),disabled:R.has(t.id),title:"Retry",children:[e.jsx(ot,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Retry"})]})]}),e.jsxs("div",{className:"agent-card-actions-group agent-card-actions-group--secondary",children:[e.jsxs("button",{className:"btn btn-sm agent-card-details-btn",onClick:()=>s(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:[e.jsx(Fs,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Details"})]}),(t.state==="idle"||t.state==="paused")&&e.jsxs("button",{className:"btn btn-sm btn-danger",onClick:()=>void et(t.id,t.name),title:"Delete",children:[e.jsx(ys,{size:14})," ",e.jsx("span",{className:"agent-card-action-label",children:"Delete"})]})]})]})]},t.id)})})})}),e.jsx("div",{className:`agents-split-detail${o&&!$?" agents-split-detail--hidden-mobile":""}`,children:$?e.jsx(a.Suspense,{fallback:null,children:e.jsx(Pt,{inline:!0,showInlineBackButton:o,agentId:$,projectId:i,onClose:v,addToast:n,onChildClick:he,initialTab:le,initialRunId:z,preferActiveRun:xe,onMutationSuccess:Re},$)}):e.jsxs("div",{className:"agents-detail-empty-state",children:[e.jsx(xt,{size:48}),e.jsx("h3",{children:"Select an agent"}),e.jsx("p",{children:"Choose an agent from the sidebar to view details"})]})})]})]})}export{pa as AgentsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as n,a as Js,j as t,R as Ys}from"./vendor-react-K0fH_qHe.js";import{i as ft,b4 as us,t as Ms,b5 as Qs,b6 as ms,b7 as Zs,w as Ht,b8 as Oe,b9 as en,ba as tn,bb as sn,bc as nn,bd as an,be as rn,s as Rs,bf as on,bg as cn,bh as Pt,bi as ln,bj as dn,bk as un,bl as mn,k as As,bm as hn,bn as fn,p as gn,bo as pn,bp as bn,u as vn,bq as xn,ab as Es,ac as Ts,br as yn,bs as wn,S as Sn,W as Lt,P as Qe,I as lt,ao as Nn,bt as hs,bu as fs,bv as gs,B as Ze,a as ps,a8 as Cn,a9 as kn,aV as ht,bw as jn,bx as Mn,aS as Rn,by as bs,bz as An,T as En,bA as vs,bB as Tn,h as Dn,j as xs,m as In}from"./index-DiewofJh.js";import"./vendor-xterm-DzcZoU0P.js";const Ft="kb-chat-active-session";function ys(s){const r=typeof s=="string"?s.trim():"",l=r.indexOf("/");return!r||l<=0||l>=r.length-1?{}:{modelProvider:r.slice(0,l),modelId:r.slice(l+1)}}function $n(s){const r=s?.toolCalls;if(!Array.isArray(r))return;const l=r.map(i=>{if(!i||typeof i!="object")return null;const d=i,v=typeof d.toolName=="string"?d.toolName:"";if(!v)return null;const M=d.args;return{toolName:v,...M&&typeof M=="object"?{args:M}:{},isError:!!d.isError,result:d.result,status:"completed"}}).filter(i=>i!==null);return l.length>0?l:void 0}function Pn(s){const r=s?.fallback;if(!r||typeof r!="object")return;const l=r,i=typeof l.primaryModel=="string"?l.primaryModel:"",d=typeof l.fallbackModel=="string"?l.fallbackModel:"",v=l.triggerPoint;if(!(!i||!d||v!=="session-creation"&&v!=="prompt-time"))return{primaryModel:i,fallbackModel:d,triggerPoint:v}}function Ln(s){const r=s?.failureInfo;if(!r||typeof r!="object")return;const l=r,i=typeof l.summary=="string"?l.summary.trim():"";if(!i)return;const d=(()=>{const v=l.reference;if(!v||typeof v!="object")return;const M=v,T=typeof M.kind=="string"?M.kind.trim():"",D=typeof M.id=="string"?M.id.trim():"";if(!(!T||!D))return{kind:T,id:D,...typeof M.label=="string"&&M.label.trim()?{label:M.label.trim()}:{}}})();return{summary:i,...typeof l.errorClass=="string"&&l.errorClass.trim()?{errorClass:l.errorClass.trim()}:{},...typeof l.code=="string"&&l.code.trim()?{code:l.code.trim()}:{},...typeof l.detail=="string"&&l.detail.trim()?{detail:l.detail.trim()}:{},...d?{reference:d}:{}}}function ws(s){return typeof s=="string"?{summary:s.trim()||"Failed to get response"}:{summary:typeof s.summary=="string"&&s.summary.trim()?s.summary.trim():"Failed to get response",...typeof s.errorClass=="string"&&s.errorClass.trim()?{errorClass:s.errorClass.trim()}:{},...typeof s.code=="string"&&s.code.trim()?{code:s.code.trim()}:{},...typeof s.detail=="string"&&s.detail.trim()?{detail:s.detail.trim()}:{},...s.reference?{reference:s.reference}:{}}}function _t(s){return{id:s.id,sessionId:s.sessionId,role:s.role,content:s.content,thinkingOutput:s.thinkingOutput,toolCalls:$n(s.metadata),fallbackInfo:Pn(s.metadata),failureInfo:Ln(s.metadata),attachments:s.attachments,createdAt:s.createdAt}}function Fn(s,r){const[l,i]=n.useState([]),[d,v]=n.useState(null),[M,T]=n.useState(!0),[D,S]=n.useState([]),[Y,w]=n.useState(!1),[_,g]=n.useState(!1),[ee,R]=n.useState(""),[U,b]=n.useState(""),[j,I]=n.useState([]),[A,E]=n.useState(""),[V,q]=n.useState(""),[z,h]=n.useState(!0),[f,o]=n.useState(new Map),c=n.useRef(null),m=n.useRef(!1),x=n.useRef(""),k=n.useRef(null),Q=n.useRef(l),O=n.useRef(d),se=n.useRef(_);Q.current=l,O.current=d,se.current=_,n.useEffect(()=>{x.current=A},[A]);const xe=n.useRef(new Set),ue=n.useRef(0),me=n.useRef(s);me.current!==s&&(me.current=s,ue.current++),n.useEffect(()=>{const p=ue.current;ft(void 0,s).then(y=>{if(ue.current!==p)return;const C=new Map;for(const P of y)C.set(P.id,P);o(C)}).catch(()=>{})},[s]);const re=n.useCallback(async()=>{T(!0);try{const y=[...(await us(s)).sessions].sort((C,P)=>new Date(P.updatedAt).getTime()-new Date(C.updatedAt).getTime());i(y)}catch{}finally{T(!1)}},[s]);n.useEffect(()=>{re()},[re]);const $e=n.useRef(()=>{}),Te=n.useRef(!1);n.useEffect(()=>{Te.current=!1},[s]),n.useEffect(()=>{if(M||Te.current||O.current)return;const p=Ms(Ft,s);if(!p){Te.current=!0;return}const y=l.find(C=>C.id===p);if(y){Te.current=!0,$e.current(p,y);return}Te.current=!0},[M,l,s]);const ae=n.useCallback(async(p,y)=>{w(!0);try{const C=await Qs(p,{limit:50,...y},s),P=C.messages.map(_t);y?.offset&&y.offset>0?S(te=>[...P,...te]):S(P),h(C.messages.length>=50)}catch{}finally{w(!1)}},[s]),oe=n.useCallback(()=>{k.current?.(),k.current=null,x.current="",E(""),R(""),b(""),I([]),g(!1)},[]),he=n.useCallback((p,y)=>{if(c.current||!p)return!0;m.current=!1,y&&(R(y.streamingText),b(y.streamingThinking),I(y.toolCalls)),g(!0);const{handlers:C}=ms({sessionId:p,tempUserMessageId:"",setStreamingText:R,setStreamingThinking:b,setStreamingToolCalls:I,cancelStreamingFlushesRef:k,addToast:r,onFallbackSession:(te,G)=>{const Z=ys(te.fallbackModel);i(L=>L.map(X=>X.id===G?{...X,...Z}:X)),v(L=>L&&L.id===G?{...L,...Z}:L)},onDone:()=>{R(""),b(""),I([]),g(!1),se.current=!1,c.current=null,ae(p)},onError:te=>{R(""),b(""),I([]),g(!1),se.current=!1,c.current=null;const G=ws(te);r?.(G.summary,"error"),ae(p)}}),P=Zs(p,C,s,{...typeof y?.replayFromEventId=="number"?{lastEventId:y.replayFromEventId}:{}});return c.current=P,!0},[r,ae,s]),ye=n.useCallback((p,y)=>{const C=O.current?.id??null;if(p&&C===p&&!y)return;c.current&&(c.current.close(),c.current=null);const P=y??l.find(te=>te.id===p);v(P||null),oe(),h(!0),p?ae(p):S([]),P?.isGenerating&&he(P.id,P.inFlightGeneration),p?Ht(Ft,p,s):Oe(Ft,s)},[he,l,ae,s,oe]);$e.current=ye;const et=n.useCallback(async p=>{const y=await en(p,s);c.current&&(c.current.close(),c.current=null);const C={id:y.session.id,title:y.session.title,agentId:y.session.agentId,status:y.session.status,modelProvider:y.session.modelProvider,modelId:y.session.modelId,createdAt:y.session.createdAt,updatedAt:y.session.updatedAt};return i(P=>P.some(te=>te.id===C.id)?P:[C,...P]),oe(),ye(C.id,C),S([]),C},[s,oe,ye]),gt=n.useCallback(async p=>{await tn(p,{status:"archived"},s),i(y=>y.filter(C=>C.id!==p)),d?.id===p&&(v(null),S([]))},[d,s]),tt=n.useCallback(async p=>{d?.id===p&&c.current&&(c.current.close(),c.current=null),await sn(p,s),i(y=>y.filter(C=>C.id!==p)),d?.id===p&&(v(null),S([]))},[d,s]),we=n.useCallback(async()=>{!d||!z||await ae(d.id,{offset:D.length})},[d,z,ae,D.length]),Se=n.useCallback(()=>{d&&(m.current=!0,k.current?.(),k.current=null,c.current?.close(),c.current=null,nn(d.id,s).catch(()=>{}),g(!1),R(""),b(""),I([]))},[d,s]),Be=n.useCallback(()=>{x.current="",E("")},[]),Ne=n.useRef(()=>{}),Ce=an(),ke=n.useCallback((p,y)=>{if(!d)return;if(se.current){x.current=p,E(p);return}m.current=!1,c.current&&(c.current.close(),c.current=null);const C=`temp-${Date.now()}`,P={id:C,sessionId:d.id,role:"user",content:p,createdAt:new Date().toISOString()};S(G=>[...G,P]),R(""),b(""),I([]),g(!0);const{handlers:te}=ms({sessionId:d.id,tempUserMessageId:C,setStreamingText:R,setStreamingThinking:b,setStreamingToolCalls:I,cancelStreamingFlushesRef:k,addToast:r,onFallbackSession:(G,Z)=>{const L=ys(G.fallbackModel);i(X=>X.map(F=>F.id===Z?{...F,...L}:F)),v(X=>X&&X.id===Z?{...X,...L}:X)},onDone:({messageId:G,message:Z,accumulated:L})=>{const X=Z?_t(Z):{id:G||`msg-${Date.now()}`,sessionId:d.id,role:"assistant",content:L.text,thinkingOutput:L.thinking,toolCalls:L.toolCalls.length>0?L.toolCalls:void 0,fallbackInfo:L.fallbackInfo,createdAt:new Date().toISOString()};xe.current.add(X.id),S(H=>[...H,X]),R(""),b(""),I([]),g(!1),se.current=!1,c.current=null,setTimeout(()=>{xe.current.delete(X.id)},1e3),re();const F=x.current.trim();F&&(x.current="",E(""),Ne.current(F))},onError:(G,Z)=>{const L=ws(G),X=typeof G=="string"&&on(G)&&(Ce.isHiddenNow()||Ce.wasRecentlyHidden(5e3));if(S(F=>{const H=F.filter(B=>B.id!==Z);return X?H:[...H,{id:`error-${Date.now()}`,sessionId:d.id,role:"assistant",content:L.summary,failureInfo:L,createdAt:new Date().toISOString()}]}),R(""),b(""),I([]),g(!1),se.current=!1,c.current=null,console.error("[useChat] Stream error:",G),X?(console.info("[useChat] Suppressed tab-suspension stream error:",G),d?.id&&(d.isGenerating?he(d.id,d.inFlightGeneration):ae(d.id))):(r?.(L.summary,"error"),re()),!m.current){const F=x.current.trim();F&&(x.current="",E(""),Ne.current(F))}}});c.current=rn(d.id,p,te,y,s)},[d,s,re,r,ae,he,Ce]);Ne.current=ke;const je=V?l.filter(p=>p.title?.toLowerCase().includes(V.toLowerCase())||p.agentId.toLowerCase().includes(V.toLowerCase())):l;return n.useEffect(()=>{if(!O.current?.isGenerating||(c.current||he(O.current.id,O.current.inFlightGeneration),!se.current||c.current||!O.current))return;const p=setInterval(async()=>{if(!se.current||c.current||!O.current){clearInterval(p);return}try{(await us(s)).sessions.find(P=>P.id===O.current?.id)?.isGenerating||(clearInterval(p),await ae(O.current.id),R(""),b(""),I([]),g(!1))}catch{}},3e3);return()=>clearInterval(p)},[he,ae,s,d]),n.useEffect(()=>{const p=ue.current,y=s?`?projectId=${encodeURIComponent(s)}`:"",C=()=>ue.current!==p,P=F=>{if(C())return;const H=JSON.parse(F.data);i(B=>B.some(J=>J.id===H.id)?B:[H,...B])},te=F=>{if(C())return;const H=JSON.parse(F.data);i(B=>[...B.map(ce=>ce.id===H.id?H:ce)]),O.current?.id===H.id&&(v(H),H.isGenerating&&!c.current&&he(H.id,H.inFlightGeneration))},G=F=>{if(C())return;const{id:H}=JSON.parse(F.data);i(B=>B.filter(J=>J.id!==H)),O.current?.id===H&&(v(null),S([]))},Z=F=>{if(C())return;const H=JSON.parse(F.data),B=_t(H);if(!xe.current.has(B.id)){if(O.current?.id===B.sessionId&&se.current&&!c.current&&B.role==="assistant"){S(J=>J.some(ce=>ce.id===B.id)?J:[...J,B]),R(""),b(""),I([]),g(!1);return}O.current?.id===B.sessionId&&!se.current&&S(J=>{if(J.some(ce=>ce.id===B.id))return J;if(B.role==="user"){const ce=J.findIndex(fe=>fe.role==="user"&&fe.id.startsWith("temp-")&&fe.content.trim()===B.content.trim());if(ce>=0){const fe=[...J];return fe[ce]=B,fe}}return[...J,B]})}},L=F=>{if(C())return;const{id:H}=JSON.parse(F.data);S(B=>B.filter(J=>J.id!==H))};return Rs(`/api/events${y}`,{events:{"chat:session:created":P,"chat:session:updated":te,"chat:session:deleted":G,"chat:message:added":Z,"chat:message:deleted":L}})},[he,s]),n.useEffect(()=>()=>{c.current&&(c.current.close(),c.current=null)},[]),{sessions:l,activeSession:d,sessionsLoading:M,messages:D,messagesLoading:Y,isStreaming:_,streamingText:ee,streamingThinking:U,streamingToolCalls:j,pendingMessage:A,selectSession:ye,createSession:et,archiveSession:gt,deleteSession:tt,sendMessage:ke,stopStreaming:Se,clearPendingMessage:Be,loadMoreMessages:we,hasMoreMessages:z,searchQuery:V,setSearchQuery:q,filteredSessions:je,refreshSessions:re,agentsMap:f}}const Ae="fusion:chat-active-room";function Bt(s){return[...s].sort((r,l)=>new Date(l.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function Ye(s,r){const l=s.findIndex(d=>d.id===r.id);if(l===-1)return Bt([r,...s]);const i=[...s];return i[l]=r,Bt(i)}function Ee(s){try{return JSON.parse(s.data)}catch{return null}}function _n(s,r){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:s,role:"user",content:r,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],createdAt:new Date().toISOString()}}function zn(s,r){const[l,i]=n.useState([]),[d,v]=n.useState(!0),[M,T]=n.useState(null),[D,S]=n.useState(null),[Y,w]=n.useState([]),[_,g]=n.useState([]),[ee,R]=n.useState(!1),U=n.useRef(l),b=n.useRef(D),j=n.useRef(0),I=n.useRef(s);U.current=l,b.current=D,I.current!==s&&(I.current=s,j.current+=1);const A=n.useCallback(async(f,o=!0)=>{if(!f){w([]),g([]),R(!1);return}o&&g([]),R(!0);try{const[c,m]=await Promise.all([cn(f.id,s),Pt(f.id,{limit:100},s)]);w(c.members),g(m.messages)}catch{w([]),g([])}finally{R(!1)}},[s]),E=n.useCallback(async()=>{v(!0);try{const f=await ln({},s),o=Bt(f.rooms);i(o),T(null);const c=Ms(Ae,s);if(c){const m=o.find(x=>x.id===c)??null;m?(S(m),A(m,!0)):Oe(Ae,s)}}catch(f){const o=f instanceof Error?f.message:"Failed to load chat rooms";T(o),r?.(o,"error")}finally{v(!1)}},[r,A,s]),V=n.useCallback(f=>{if(!f){S(null),Oe(Ae,s),A(null,!0);return}const o=U.current.find(c=>c.id===f)??null;S(o),o&&(Ht(Ae,o.id,s),A(o,!0))},[A,s]),q=n.useCallback(async f=>{const c=(await dn({name:f.name,memberAgentIds:f.memberAgentIds},s)).room;return i(m=>Ye(m,c)),S(c),Ht(Ae,c.id,s),await A(c,!0),c},[A,s]),z=n.useCallback(async f=>{await un(f,s),i(o=>o.filter(c=>c.id!==f)),b.current?.id===f&&(S(null),w([]),g([]),Oe(Ae,s))},[s]),h=n.useCallback(async(f,o)=>{const c=b.current,m=c?.id;if(!m)throw new Error("Select a room before sending a message");const x=_n(m,f);b.current?.id===m&&g(k=>[...k,x]);try{const k=await mn(m,{content:f,...o?.attachments?{attachments:o.attachments}:{}},s);k.message?.createdAt&&c&&i(O=>Ye(O,{...c,updatedAt:k.message.createdAt})),b.current?.id===m&&g(O=>O.map(se=>se.id===x.id?k.message:se));const Q=await Pt(m,{limit:100},s);if(b.current?.id!==m)return;g(Q.messages)}catch(k){try{const Q=await Pt(m,{limit:100},s);b.current?.id===m&&g(Q.messages)}catch{b.current?.id===m&&g(Q=>Q.filter(O=>O.id!==x.id))}throw k}},[s]);return n.useEffect(()=>{E()},[E]),n.useEffect(()=>{const f=j.current,o=s?`/api/events?projectId=${encodeURIComponent(s)}`:"/api/events";return Rs(o,{onReconnect:()=>{E()},events:{"chat:room:created":c=>{if(j.current!==f)return;const m=Ee(c);m&&i(x=>Ye(x,m))},"chat:room:updated":c=>{if(j.current!==f)return;const m=Ee(c);m&&(i(x=>Ye(x,m)),b.current?.id===m.id&&S(m))},"chat:room:deleted":c=>{if(j.current!==f)return;const m=Ee(c);m?.id&&(i(x=>x.filter(k=>k.id!==m.id)),b.current?.id===m.id&&(S(null),w([]),g([]),Oe(Ae,s)))},"chat:room:member:added":c=>{if(j.current!==f)return;const m=Ee(c);!m||b.current?.id!==m.roomId||w(x=>x.some(k=>k.agentId===m.agentId)?x:[...x,m])},"chat:room:member:removed":c=>{if(j.current!==f)return;const m=Ee(c);!m||b.current?.id!==m.roomId||w(x=>x.filter(k=>k.agentId!==m.agentId))},"chat:room:message:added":c=>{if(j.current!==f)return;const m=Ee(c);m&&(i(x=>{const k=x.find(Q=>Q.id===m.roomId);return k?Ye(x,{...k,updatedAt:m.createdAt}):x}),b.current?.id===m.roomId&&g(x=>{if(x.some(k=>k.id===m.id))return x;if(m.role==="user"){const k=x.findIndex(Q=>Q.role==="user"&&Q.id.startsWith("temp-")&&Q.content.trim()===m.content.trim());if(k>=0){const Q=[...x];return Q[k]=m,Q}}return[...x,m]}))},"chat:room:message:updated":c=>{if(j.current!==f)return;const m=Ee(c);!m||b.current?.id!==m.roomId||g(x=>x.map(k=>k.id===m.id?m:k))},"chat:room:message:deleted":c=>{if(j.current!==f)return;const m=Ee(c);m?.id&&g(x=>x.filter(k=>k.id!==m.id))}}})},[s,E]),n.useEffect(()=>{D&&(l.some(f=>f.id===D.id)||(S(null),w([]),g([]),Oe(Ae,s)))},[D,s,l]),{rooms:l,roomsLoading:d,roomsError:M,activeRoom:D,activeRoomMembers:Y,messages:_,messagesLoading:ee,selectRoom:V,createRoom:q,deleteRoom:z,sendRoomMessage:h,refreshRooms:E}}function Un(s,r=[]){const l=s.trim().replace(/^#/,"");if(!l)return{ok:!1,error:"Room name is required."};if(/[A-Z]/.test(l))return{ok:!1,error:"Use lowercase letters only."};const i=l.toLowerCase();return i.length>80?{ok:!1,error:"Room names can be at most 80 characters."}:/^[a-z0-9_-]+$/.test(i)?/^[-_]|[-_]$/.test(i)?{ok:!1,error:"Room names cannot start or end with a hyphen or underscore."}:r.some(d=>d.toLowerCase()===i)?{ok:!1,error:"A room with this name already exists."}:{ok:!0,name:i}:{ok:!1,error:"Use lowercase letters, numbers, hyphens, or underscores only."}}function On({isOpen:s,onClose:r,onCreate:l,projectId:i,existingRoomNames:d=[]}){const[v,M]=n.useState(""),[T,D]=n.useState([]),[S,Y]=n.useState(""),[w,_]=n.useState([]),[g,ee]=n.useState(!1),[R,U]=n.useState(null),[b,j]=n.useState(!1),I=n.useRef(null),A=n.useRef(null);n.useEffect(()=>{s&&(A.current=document.activeElement instanceof HTMLElement?document.activeElement:null,ee(!0),U(null),ft(void 0,i).then(o=>D(o)).catch(()=>{D([]),U("Failed to load agents.")}).finally(()=>ee(!1)))},[s,i]),n.useEffect(()=>{if(!s){M(""),Y(""),_([]),U(null),j(!1);return}const o=window.requestAnimationFrame(()=>I.current?.focus());return()=>window.cancelAnimationFrame(o)},[s]),n.useEffect(()=>{if(!s)return;const o=c=>{c.key==="Escape"&&r()};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[s,r]),n.useEffect(()=>{s||A.current?.focus()},[s]);const E=n.useMemo(()=>Un(v,d),[v,d]),V=n.useMemo(()=>{const o=S.trim().toLowerCase();return o?T.filter(c=>c.name.toLowerCase().includes(o)):T},[T,S]),q=n.useMemo(()=>T.filter(o=>w.includes(o.id)),[T,w]),z=E.ok&&w.length>0&&!b&&!g;if(!s)return null;const h=o=>{b||_(c=>c.includes(o)?c.filter(m=>m!==o):[...c,o])},f=async()=>{if(!E.ok){U(E.error);return}if(w.length===0){U("Select at least one member.");return}U(null),j(!0);try{await l({name:E.name,displayName:`#${E.name}`,memberAgentIds:w}),r()}catch(o){U(o instanceof Error?o.message:"Failed to create room.")}finally{j(!1)}};return Js.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:o=>o.target===o.currentTarget&&r(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":"Create room",onClick:o=>o.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:"Create room"}),t.jsx("button",{type:"button",className:"modal-close","aria-label":"Close",onClick:r,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:"Room name"}),t.jsxs("div",{className:"create-room-modal-name-field",children:[t.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),t.jsx("input",{ref:I,id:"create-room-name",className:"input",value:v,disabled:b,onChange:o=>{const c=o.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();M(c)}})]}),!E.ok&&t.jsx("div",{className:"form-error",children:E.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:"Members"}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:"Search agents",value:S,disabled:b,onChange:o=>Y(o.target.value)})]}),q.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:q.map(o=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>h(o.id),disabled:b,children:[o.name," ×"]},o.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:g?t.jsx("div",{className:"create-room-modal-empty",children:"Loading agents..."}):V.length===0?t.jsx("div",{className:"create-room-modal-empty",children:T.length===0?"No agents in this project yet.":"No agents match your search."}):V.map(o=>{const c=w.includes(o.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${c?" create-room-modal-member-row--selected":""}`,onClick:()=>h(o.id),disabled:b,children:[t.jsx(As,{agent:o,size:20}),t.jsx("span",{children:o.name}),t.jsx("span",{className:"create-room-modal-member-role",children:o.role})]},o.id)})}),R&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:R})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:b,children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void f(),disabled:!z,children:b?"Creating...":"Create room"})]})]})}),document.body)}const Hn=320;function zt(s){return Math.min(s,Hn)}function Ds(s){const r=new Date(s),i=new Date().getTime()-r.getTime(),d=Math.floor(i/1e3),v=Math.floor(d/60),M=Math.floor(v/60),T=Math.floor(M/24);return d<60?"just now":v<60?`${v}m ago`:M<24?`${M}h ago`:T<7?`${T}d ago`:r.toLocaleDateString()}function Ss(s,r){if(!s||!r)return null;const l=r.toLowerCase();if(l.includes("claude")){let d=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 d=d.replace(/\s+/g," "),d.length>30?d.slice(0,30)+"…":d}if(l.includes("gpt")||l.includes("openai")){const d=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 d.length>30?d.slice(0,30)+"…":d}if(l.includes("gemini")){const d=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 d.length>30?d.slice(0,30)+"…":d}const i=r.replace(/-/g," ").replace(/^\w/,d=>d.toUpperCase()).replace(/\s+/g," ").trim();return i.length>30?i.slice(0,30)+"…":i}function mt(s,r){return s.length<=r?s:`${s.slice(0,r)}…`}function Bn(s){if(!s)return null;const r=Object.entries(s);return r.length===0?null:r.map(([l,i])=>{const d=typeof i=="string"?i:(()=>{try{return JSON.stringify(i)}catch{return String(i)}})();return`${l}=${mt(d,50)}`}).join(", ")}function Kn(s){if(s===void 0)return null;if(typeof s=="string")return mt(s,200);try{return mt(JSON.stringify(s),200)}catch{return mt(String(s),200)}}function Wn(s){if(!s)return null;if(s.kind==="mailbox"||s.kind==="mailbox-message"){const r=typeof window>"u"?"/":window.location.pathname||"/",l=new URLSearchParams(typeof window>"u"?"":window.location.search);return l.set("view","mailbox"),l.set("mailbox-message",s.id),`${r}?${l.toString()}#message-${encodeURIComponent(s.id)}`}return null}function Gn(s){if(!s)return null;const r=s.label??`${s.kind} ${s.id}`,l=Wn(s),i=`chat-failure-reference-${s.kind}-${s.id}`.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase();return t.jsxs("div",{className:"chat-message-failure-reference",children:[t.jsx("span",{className:"chat-message-failure-reference-label",children:"Reference"}),t.jsx("span",{className:"chat-message-failure-reference-value",children:r}),l?t.jsx("a",{className:"btn btn-sm chat-message-failure-reference-link",href:l,children:"Open mailbox message"}):t.jsxs("details",{className:"chat-message-failure-reference-details",children:[t.jsx("summary",{className:"btn btn-sm chat-message-failure-reference-link",children:"View failure details"}),t.jsxs("dl",{className:"chat-message-failure-reference-meta",id:i,children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Kind"}),t.jsx("dd",{children:s.kind})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"ID"}),t.jsx("dd",{children:s.id})]}),s.label&&t.jsxs("div",{children:[t.jsx("dt",{children:"Label"}),t.jsx("dd",{children:s.label})]})]})]})]})}function Is(s){if(!s||s.length===0)return null;const r=(w,_)=>{const g=w.status==="running",ee=w.status==="completed"&&w.isError,R=Bn(w.args),U=Kn(w.result),b=g?R:U?`result: ${U}`:R?`args: ${R}`:null,j=g?"running":ee?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${g?" chat-tool-call--running":""}${ee?" 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",title:w.toolName,children:w.toolName}),b&&t.jsx("span",{className:"chat-tool-call-preview",title:b,children:b}),t.jsx("span",{className:"chat-tool-call-status-text",children:j})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[R&&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:R})]}),U&&t.jsxs("div",{className:`chat-tool-call-row${ee?" 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:U})]})]})]},`${w.toolName}-${_}`)},l="chat-tool-calls";if(s.length===1)return t.jsxs("div",{className:l,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(vs,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),r(s[0],0)]});const i=s.filter(w=>w.status==="running").length,d=s.filter(w=>w.status==="completed"&&w.isError).length,v=i>0,M=Array.from(new Set(s.map(w=>w.toolName))),T=M.slice(0,5),D=Math.max(0,M.length-T.length),S=D>0?`${T.join(", ")}, +${D} more`:T.join(", "),Y=v?`(${i} running)`:d>0?`(${d} ${d===1?"error":"errors"})`:null;return t.jsx("div",{className:l,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:v,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(vs,{size:12,"aria-hidden":"true"}),t.jsxs("span",{className:"chat-tool-calls-count",children:[s.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:S,children:S}),Y&&t.jsx("span",{className:"chat-tool-calls-group-status",children:Y})]}),s.map((w,_)=>r(w,_))]})})}const $s={p:({children:s,...r})=>t.jsx("p",{...r,children:bs(s)}),li:({children:s,...r})=>t.jsx("li",{...r,children:bs(s)}),pre:({children:s,...r})=>t.jsx("pre",{...r,className:"chat-markdown-pre",children:s}),code:({children:s,...r})=>{const l=typeof s=="string"?s:Ys.Children.toArray(s).join(""),i=ht(l);return i.length===1&&typeof i[0]=="string"?t.jsx("code",{...r,children:s}):t.jsx("code",{...r,children:i})},table:({children:s,...r})=>t.jsx("table",{...r,className:"chat-markdown-table",children:s})},He="__fn_agent__",Vn=280,dt=180,ut=500,Ns="fusion:chat-sidebar-width",Ut="fusion:chat-scope",qn="fusion:chat-draft:";function Cs(s,r){return r?`${qn}${s}:${r}`:null}function ks(s){if(!s)return"";try{return localStorage.getItem(s)??""}catch{return""}}const Xn=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function js(s){const r=/(^|[\s])\/([^\s]*)$/.exec(s);if(!r)return null;const l=r[1]??"",i=r[2]??"",d=r.index+l.length;return{filter:i,start:d,end:s.length}}function Jn(s,r){const l=s.slice(0,r),i=/(^|[\s\n])@([\w-]*)$/.exec(l);if(!i)return null;const d=i[2]??"",v=l.length-d.length-1;return{filter:d,start:v,end:r}}function Yn({projectId:s,onClose:r,onCreate:l}){const[i,d]=n.useState("agent"),[v,M]=n.useState([]),[T,D]=n.useState(!0),[S,Y]=n.useState(""),[w,_]=n.useState([]),[g,ee]=n.useState(!0),[R,U]=n.useState(""),[b,j]=n.useState([]),[I,A]=n.useState([]);n.useEffect(()=>{let h=!1;return D(!0),ft(void 0,s).then(f=>{h||M(f)}).catch(()=>{h||M([])}).finally(()=>{h||D(!1)}),()=>{h=!0}},[s]),n.useEffect(()=>{ee(!0),Dn().then(h=>{_(h.models),j(h.favoriteProviders),A(h.favoriteModels)}).catch(()=>{_([]),j([]),A([])}).finally(()=>{ee(!1)})},[]);const E=n.useCallback(async h=>{const f=b,c=f.includes(h)?f.filter(m=>m!==h):[h,...f];j(c);try{await xs({favoriteProviders:c,favoriteModels:I})}catch{j(f)}},[b,I]),V=n.useCallback(async h=>{const f=I,c=f.includes(h)?f.filter(m=>m!==h):[h,...f];A(c);try{await xs({favoriteProviders:b,favoriteModels:c})}catch{A(f)}},[I,b]),q=h=>{if(h.preventDefault(),i==="agent"){if(!S)return;l({agentId:S});return}if(!R)return;const f=R.indexOf("/");if(f<=0)return;const o=R.slice(0,f),c=R.slice(f+1);l({agentId:He,modelProvider:o,modelId:c})},z=i==="agent"?!S:!R;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:h=>h.stopPropagation(),children:[t.jsx("h3",{children:"New Chat"}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${i==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{d("agent"),U("")},children:"Agent"}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${i==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{d("model"),Y("")},children:"Model"})]}),t.jsxs("form",{onSubmit:q,children:[i==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",T?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):v.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:v.map(h=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${S===h.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>Y(h.id),"data-testid":`agent-option-${h.id}`,children:[t.jsx(Ze,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:h.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:h.role})]},h.id))})]}),i==="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(In,{models:w,value:R,onChange:U,label:"Model",placeholder:"Select a model",favoriteProviders:b,onToggleFavorite:E,favoriteModels:I,onToggleModelFavorite:V})}),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:z,children:"Create"})]})]})]})})}const Ot=n.memo(function({message:r,forcePlain:l,agentName:i,hideAssistantIdentity:d,showAssistantModelTag:v,activeModelTag:M,activeModelProvider:T,activeSessionId:D,mentionAgentsByName:S,roomContext:Y,copyAction:w}){const _=r.role==="assistant",g=_?r.failureInfo:void 0,ee=_&&(!d||!!g),R=n.useMemo(()=>{if(_)return null;const j=r.content,I=/@([\w-]+)/g,A=[];let E=0,V=I.exec(j);for(;V;){const[q,z=""]=V,h=V.index;h>E&&A.push(j.slice(E,h));const f=z.replace(/_/g," ").toLowerCase(),o=S.get(f);if(o){const c=!!(Y&&!Y.memberIds.has(o.id)),m=c?`Not a member of ${Y?.roomName}`:void 0;A.push(t.jsxs("span",{className:`chat-mention-chip${c?" chat-mention-chip--non-member":""}`,title:m,"aria-label":m,children:["@",o.name.replace(/\s+/g,"_")]},`${o.id}-${h}`))}else A.push(q);E=h+q.length,V=I.exec(j)}return E<j.length&&A.push(j.slice(E)),A.length===0?j:A},[_,r.content,S,Y]),U=n.useMemo(()=>{const j=r.attachments;if(!j||j.length===0||!D)return null;const I=`/api/chat/sessions/${encodeURIComponent(D)}/attachments/`;return t.jsx("div",{className:"chat-message-attachments",children:j.map(A=>{const E=A.mimeType.startsWith("image/"),V=A.id||A.filename,q=`${I}${encodeURIComponent(A.filename)}`;return E?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:q,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:q,alt:A.originalName})},V):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:q,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(An,{size:14}),t.jsx("span",{children:A.originalName})]},V)})})},[r.attachments,D]),b=n.useMemo(()=>_?g?t.jsxs("div",{className:"chat-message-content chat-message-content--failure",children:[t.jsxs("div",{className:"chat-message-failure-summary-row",children:[t.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),t.jsx("span",{className:"chat-message-failure-label",children:"Response failed"})]}),t.jsx("div",{className:"chat-message-failure-summary",children:g.summary}),(g.errorClass||g.code)&&t.jsxs("div",{className:"chat-message-failure-badges",children:[g.errorClass&&t.jsx("span",{className:"chat-message-failure-badge",children:g.errorClass}),g.code&&t.jsx("span",{className:"chat-message-failure-badge",children:g.code})]}),(g.detail||g.reference)&&t.jsxs("details",{className:"chat-message-failure-details",children:[t.jsxs("summary",{children:[t.jsx(En,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:"Failure details"})]}),g.detail&&t.jsx("pre",{className:"chat-message-failure-detail",children:ht(g.detail)}),Gn(g.reference)]})]}):l?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:r.content}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(Es,{remarkPlugins:[Ts],components:$s,children:r.content})}):null,[g,l,_,r.content]);return t.jsxs("div",{className:`chat-message chat-message--${r.role}${g?" chat-message--failure":""}`,"data-testid":`chat-message-${r.id}`,children:[ee&&t.jsxs("div",{className:"chat-message-avatar",children:[T?t.jsx(Qe,{provider:T,size:"sm"}):t.jsx(Ze,{size:14}),t.jsx("span",{children:i}),v&&M&&t.jsx("span",{className:"chat-model-tag",children:M})]}),_?b:t.jsx("div",{className:"chat-message-content",children:R}),!g&&w,Is(r.toolCalls),r.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:ht(r.thinkingOutput)})]}),U,t.jsx("div",{className:"chat-message-time",children:Ds(r.createdAt)})]})});function sa({projectId:s,addToast:r,experimentalFeatures:l}){const{activeSession:i,sessionsLoading:d,messages:v,messagesLoading:M,isStreaming:T,streamingText:D,streamingThinking:S,streamingToolCalls:Y,selectSession:w,createSession:_,archiveSession:g,deleteSession:ee,sendMessage:R,stopStreaming:U,pendingMessage:b,clearPendingMessage:j,searchQuery:I,setSearchQuery:A,filteredSessions:E}=Fn(s,r),[V,q]=n.useState(!1),z=l?.chatRooms===!0,[h,f]=n.useState(()=>{try{if(localStorage.getItem(Ut)==="rooms"&&z)return"rooms"}catch{}return"direct"}),o=zn(s,r),[c,m]=n.useState(()=>{const e=Cs(h,h==="rooms"?o.activeRoom?.id:i?.id);return ks(e)}),[x,k]=n.useState(null),[Q,O]=n.useState(null),[se,xe]=n.useState(null),[ue,me]=n.useState(!0),[re,$e]=n.useState(Vn),[Te,ae]=n.useState(!1),[oe,he]=n.useState(new Map),[ye,et]=n.useState([]),[gt,tt]=n.useState(!0),[we,Se]=n.useState(!1),[Be,Ne]=n.useState(""),[Ce,ke]=n.useState(0),[je,p]=n.useState(""),[y,C]=n.useState(!1),[P,te]=n.useState(0),[G,Z]=n.useState(-1),[L,X]=n.useState(!1),[F,H]=n.useState([]),[B,J]=n.useState(!1),[ce,fe]=n.useState(!1),[Pe,Kt]=n.useState({}),[st,Le]=n.useState(!1),{pushNav:Wt}=hn(),[,Ke]=n.useState(!1),[Ps,Ls]=n.useState({top:0,left:0}),K=fn({projectId:s}),pt=n.useCallback(e=>{if(!e||!K.mentionActive)return;const a=e.getBoundingClientRect();Ls({top:a.top-260,left:a.left+8})},[K.mentionActive]),Gt=n.useRef(null),Vt=n.useRef(null),bt=n.useRef(!1),vt=n.useRef(null),ge=n.useRef(null),De=n.useRef(null),ne=n.useRef(null),qt=n.useRef(null),Xt=n.useRef([]),We=n.useRef(0),Ge=n.useRef(new Map),$=gn()==="mobile";n.useEffect(()=>{try{const e=localStorage.getItem(Ns);if(!e)return;const a=Number.parseInt(e,10);if(Number.isNaN(a))return;const u=Math.max(dt,Math.min(ut,a));$e(u)}catch{}},[]),n.useEffect(()=>{try{const e=localStorage.getItem(Ut);if(e==="direct"){f("direct");return}e==="rooms"&&z&&f("rooms")}catch{}},[z]),n.useEffect(()=>{if(!z&&h==="rooms"){f("direct");return}try{localStorage.setItem(Ut,h)}catch{}},[z,h]);const ie=Cs(h,h==="rooms"?o.activeRoom?.id:i?.id),xt=n.useRef(ie);n.useEffect(()=>{ie!==xt.current&&(xt.current=ie,m(ks(ie)))},[ie]),n.useEffect(()=>{if(!(!ie||xt.current!==ie))try{if(c){localStorage.setItem(ie,c);return}localStorage.removeItem(ie)}catch{}},[ie,c]);const pe=z&&h==="rooms"&&!!o.activeRoom,{keyboardOverlap:nt,viewportHeight:Jt,viewportOffsetTop:Yt,keyboardOpen:Ve}=pn({enabled:$&&(!!i||pe)}),Qt=nt>0||Yt>0,Zt=Ve&&Qt?{"--keyboard-overlap":`${nt}px`,"--vv-offset-top":`${Yt}px`,...Jt!==null?{"--vv-height":`${Jt}px`}:{}}:{},es=`chat-thread${Ve&&Qt?" chat-thread--keyboard-active":""}`,le=n.useMemo(()=>{const e=Be.trim().toLowerCase();return(e?ye.filter(u=>u.name.toLowerCase().includes(e)):ye).slice(0,10)},[ye,Be]),Fe=n.useMemo(()=>Array.from(oe.values()),[oe]),be=n.useMemo(()=>!z||h!=="rooms"||!o.activeRoom?null:{roomId:o.activeRoom.id,roomName:o.activeRoom.name,memberIds:new Set(o.activeRoomMembers.map(e=>e.agentId))},[z,h,o.activeRoom,o.activeRoomMembers]),Ie=n.useMemo(()=>{const e=Fe.filter(N=>bn(N.name,je));if(!be)return e;const a=e.filter(N=>be.memberIds.has(N.id));if(je.trim().length===0)return a;const u=e.filter(N=>!be.memberIds.has(N.id));return[...a,...u]},[Fe,je,be]),yt=n.useMemo(()=>{const e=new Map;for(const a of Fe)e.set(a.name.toLowerCase(),a);return e},[Fe]);n.useEffect(()=>{ke(0)},[le]),n.useEffect(()=>{te(0)},[je,y]),n.useEffect(()=>()=>{ge.current!==null&&window.clearTimeout(ge.current)},[]);const ts=n.useCallback(()=>{const e=De.current;if(!e)return;const u=e.scrollTop+e.clientHeight>=e.scrollHeight-50;fe(!u),bt.current=!u},[]),_e=n.useCallback(e=>{if(!e.isConnected)return;let a=0,u=0,N=-1;const W=6,de=()=>{if(e.isConnected){if(e.scrollTop=e.scrollHeight,e.scrollHeight===N?u+=1:(u=0,N=e.scrollHeight),a+=1,a>=W||u>=2){fe(!1),bt.current=!1;return}window.requestAnimationFrame(de)}};de()},[]),qe=n.useCallback(()=>{const e=De.current;e&&_e(e)},[_e]);n.useLayoutEffect(()=>{const e=pe?o.activeRoom?.id??null:i?.id??null;if(!e){vt.current=null;return}const a={threadId:e,loaded:pe?!o.messagesLoading:!M,hasMessages:pe?o.messages.length>0:v.length>0},u=vt.current,N=u?.threadId!==e,W=u?.threadId===e&&!u.loaded&&a.loaded,de=u?.threadId===e&&!u.hasMessages&&a.hasMessages;if(!(u===null||N||W||de))return;const ve=De.current;ve&&(_e(ve),vt.current=a)},[pe,o.activeRoom?.id,o.messages.length,o.messagesLoading,i?.id,v.length,M,_e]);const Fs=pe?o.messages:v;n.useEffect(()=>{bt.current||qe()},[Fs,D,S,T,qe]),n.useEffect(()=>{nt<=0||!De.current||qe()},[nt,qe]),vn($&&Ve),n.useEffect(()=>{const e=()=>k(null);if(x)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[x]),n.useEffect(()=>{if(!$||!Ve)return;const e=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[$,Ve]),n.useEffect(()=>{if(!$||!i)return;const e=()=>{const a=ne.current;a&&document.activeElement===a&&(a.blur(),window.setTimeout(()=>{a.focus({preventScroll:!0})},0))};return document.addEventListener("visibilitychange",e),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",e),window.removeEventListener("pageshow",e)}},[$,i]),n.useEffect(()=>{if(!$||!i&&!pe)return;const e=()=>{const u=De.current;u&&_e(u)},a=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",a),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pageshow",e)}},[$,i,pe,_e]),n.useEffect(()=>{let e=!1;const a=s;return ft(void 0,s).then(u=>{if(e||a!==s)return;const N=new Map;for(const W of u)N.set(W.id,W);he(N)}).catch(()=>{}),()=>{e=!0}},[s]),n.useEffect(()=>{let e=!1;return tt(!0),xn(s).then(a=>{e||et(a)}).catch(()=>{e||et([])}).finally(()=>{e||tt(!1)}),()=>{e=!0}},[s]),n.useEffect(()=>{Xt.current=F},[F]),n.useEffect(()=>()=>{for(const e of Xt.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of Ge.current.values())window.clearTimeout(e);Ge.current.clear()},[]);const at=n.useCallback(e=>{if(!e||e.length===0)return;const a=[];for(const u of Array.from(e)){if(!Xn.includes(u.type))continue;const N=u.type.startsWith("image/");a.push({file:u,previewUrl:N?URL.createObjectURL(u):""})}a.length>0&&H(u=>[...u,...a])},[]),_s=n.useCallback(e=>{H(a=>{const u=a[e];return u?.previewUrl&&URL.revokeObjectURL(u.previewUrl),a.filter((N,W)=>W!==e)})},[]),zs=n.useCallback(e=>{const a=e.clipboardData?.files;if(!a||a.length===0)return;const u=Array.from(a).filter(N=>N.type.startsWith("image/"));u.length!==0&&at(u)},[at]),Us=n.useCallback(async e=>{try{await _(e),q(!1),$&&me(!1)}catch{r("Failed to create chat session","error")}},[_,r,$]),Xe=n.useCallback(()=>{if(m(""),ie)try{localStorage.removeItem(ie)}catch{}Se(!1),Ne(""),C(!1),p(""),Z(-1),H(e=>{for(const a of e)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[ie]),wt=n.useCallback(()=>{const e=c.trim(),a=F.map(u=>u.file);if(!(!e&&a.length===0||!i)){if(e==="/clear"||e==="/new"){Xe(),U(),j(),_({agentId:i.agentId,modelProvider:i.modelProvider??void 0,modelId:i.modelId??void 0}).catch(()=>{r("Failed to clear conversation","error")});return}Xe(),R(e,a)}},[c,F,i,Xe,U,j,_,r,R]),St=n.useCallback(async()=>{const e=c.trim();if(e){if(z&&h==="rooms"){if(!o.activeRoom)return;const a=c;Xe();try{await o.sendRoomMessage(e)}catch(u){m(a);const N=u instanceof Error&&u.message.trim()?u.message:"Failed to send room message";r(N,"error")}return}wt()}},[c,z,h,o,Xe,r,wt]),Nt=n.useCallback(e=>{m(a=>{const u=js(a);if(!u)return a;const N=`/skill:${e.name} `,W=a.slice(0,u.start)+N+a.slice(u.end);return window.requestAnimationFrame(()=>{ne.current&&(ne.current.style.height="auto",ne.current.style.height=`${zt(ne.current.scrollHeight)}px`,ne.current.focus())}),W}),Se(!1),Ne(""),ke(0)},[]),rt=n.useCallback(e=>{const a=ne.current;if(!a||G<0)return;const u=a.selectionStart??We.current,N=a.selectionEnd??u,W=Math.max(u,N),de=Math.min(G,W),ve=`${`@${e.name.replace(/\s+/g,"_")}`} `,$t=c.slice(0,de)+ve+c.slice(W),Ue=de+ve.length;m($t),C(!1),p(""),te(0),Z(-1),window.requestAnimationFrame(()=>{ne.current&&(ne.current.style.height="auto",ne.current.style.height=`${zt(ne.current.scrollHeight)}px`,ne.current.focus(),ne.current.setSelectionRange(Ue,Ue))})},[G,c]),ss=n.useCallback(e=>{if(We.current=e.currentTarget.selectionStart??We.current,K.mentionActive&&K.files.length>0){if(K.handleKeyDown(e,c),e.key==="Enter"||e.key==="Tab"){const a=K.files[K.selectedIndex];if(a){const u=K.selectFile(a,c);m(u),K.dismissMention(),Ke(!1)}}return}if(y&&e.key==="ArrowDown"){e.preventDefault(),Ie.length>0&&te(a=>(a+1)%Ie.length);return}if(y&&e.key==="ArrowUp"){e.preventDefault(),Ie.length>0&&te(a=>a===0?Ie.length-1:a-1);return}if(y&&e.key==="Enter"){e.preventDefault();const a=Ie[P]??Ie[0];a&&rt(a);return}if(y&&e.key==="Escape"){e.preventDefault(),C(!1),p(""),Z(-1);return}if(we&&e.key==="ArrowDown"){e.preventDefault(),le.length>0&&ke(a=>(a+1)%le.length);return}if(we&&e.key==="ArrowUp"){e.preventDefault(),le.length>0&&ke(a=>a===0?le.length-1:a-1);return}if(we&&(e.key==="Enter"||e.key==="Tab")&&le.length>0){e.preventDefault();const a=le[Ce]??le[0];a&&Nt(a);return}if(we&&e.key==="Escape"){e.preventDefault(),Se(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),St())},[y,Ie,P,rt,we,le,Ce,Nt,St,K,c]),it=n.useCallback((e,a)=>{const u=Jn(e,a);if(u){C(!0),p(u.filter),Z(u.start);return}C(!1),p(""),Z(-1)},[]),ns=n.useCallback(e=>{const a=e.target,u=a.value,N=a.selectionStart??u.length;We.current=N,m(u);const W=js(u);W?(Se(!0),Ne(W.filter)):(Se(!1),Ne("")),it(u,N),K.detectMention(u,N),Ke(K.mentionActive),K.mentionActive&&pt(a),a.style.height="auto",a.style.height=`${zt(a.scrollHeight)}px`},[it]),ot=n.useCallback(e=>{const a=e.currentTarget,u=a.selectionStart??a.value.length;We.current=u,it(a.value,u),K.detectMention(a.value,u),Ke(K.mentionActive),K.mentionActive&&pt(a)},[it,K,pt]),as=n.useCallback(e=>{e.key!=="Escape"&&ot(e)},[ot]),rs=n.useCallback(()=>{ge.current!==null&&window.clearTimeout(ge.current),ge.current=window.setTimeout(()=>{Se(!1),C(!1),p(""),Z(-1),Ke(!1),K.dismissMention(),ge.current=null},120)},[K]),is=n.useCallback(()=>{ge.current!==null&&(window.clearTimeout(ge.current),ge.current=null),typeof window<"u"&&window.innerWidth<=768&&window.setTimeout(()=>{(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},0)},[]),Os=n.useCallback(async e=>{k(null);try{await g(e),r("Conversation archived","success")}catch{r("Failed to archive conversation","error")}},[g,r]),Hs=n.useCallback(async e=>{O(null),k(null);try{await ee(e),r("Conversation deleted","success")}catch{r("Failed to delete conversation","error")}},[ee,r]),Je=n.useCallback(e=>{try{localStorage.setItem(Ns,String(e))}catch{}},[]),Bs=n.useCallback(e=>{if($)return;e.preventDefault(),e.stopPropagation();const a=e.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(e.pointerId);const u=e.clientX,N=re;let W=N;document.body.style.userSelect="none";const de=ve=>{const $t=ve.clientX-u,Ue=Math.max(dt,Math.min(ut,N+$t));W=Ue,$e(Ue),Je(Ue)},ze=ve=>{typeof a.releasePointerCapture=="function"&&a.releasePointerCapture(ve.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",de),document.removeEventListener("pointerup",ze),Je(W)};document.addEventListener("pointermove",de),document.addEventListener("pointerup",ze)},[$,Je,re]),Ks=n.useCallback(e=>{if($||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const a=e.shiftKey?50:10,u=e.key==="ArrowLeft"?-a:a,N=Math.max(dt,Math.min(ut,re+u));$e(N),Je(N)},[$,Je,re]),os=n.useCallback(e=>{w(e),Le(!1),$&&me(!1)},[w,$]),Ct=n.useCallback(()=>{w(""),me(!0),Le(!1)},[w]),kt=n.useCallback(()=>{o.selectRoom(null),me(!0),Le(!1)},[o]),Ws=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(Tn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>q(!0),children:[t.jsx(lt,{size:16}),"New Chat"]})]}),Me=Ss(i?.modelProvider,i?.modelId),Re=i?.modelProvider??null,jt=!!(i||T||v.length>0),ct=h==="rooms"?pe:!!i,cs=n.useRef(ct);n.useEffect(()=>{const e=cs.current;cs.current=ct,$&&(e||!ct||Wt({type:"view",revert:h==="rooms"?kt:Ct}))},[h,Ct,kt,ct,$,Wt]);const Mt=i?.agentId===He?Me??"Fusion":i?.title||oe.get(i?.agentId??"")?.name||i?.agentId||"Chat",ls=!!(Me&&Me!==Mt),Gs=$&&h==="direct"&&!!i,Rt=oe.get(i?.agentId??"")?.name||(i?.agentId===He?Me??"Fusion":i?.agentId?.slice(0,30)??"Fusion"),At=!1,Et=i?.agentId===He,Vs=b.length>50?`${b.slice(0,50)}…`:b,qs=n.useCallback(()=>{X(e=>!e)},[]);n.useEffect(()=>{if(!st)return;const e=a=>{Vt.current?.contains(a.target)||Le(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[st]),n.useEffect(()=>{(!$||h!=="direct"||ue)&&Le(!1)},[$,h,ue]);const Tt=n.useCallback((e,a)=>{const u=Ge.current.get(e);u&&window.clearTimeout(u),Kt(W=>({...W,[e]:a}));const N=window.setTimeout(()=>{Kt(W=>{const{[e]:de,...ze}=W;return ze}),Ge.current.delete(e)},2e3);Ge.current.set(e,N)},[]),ds=n.useCallback(async(e,a)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(a),Tt(e,"success")}catch{Tt(e,"error")}},[Tt]),Xs=n.useCallback((e,a=!1)=>a?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(Es,{remarkPlugins:[Ts],components:$s,children:e})}),[]),Dt=i?.agentId===He,It=n.useCallback((e,a,u)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${Pe[e]==="success"?" chat-message-copy-action--success":""}${Pe[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":u??`chat-copy-response-${e}`,"aria-label":Pe[e]==="success"?"Response copied":Pe[e]==="error"?"Copy failed":"Copy response",onClick:()=>{ds(e,a)},children:Pe[e]==="success"?t.jsx(yn,{size:14}):t.jsx(wn,{size:14})}),[Pe,ds]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${ue?"":" chat-sidebar--hidden"}`,style:$?void 0:{width:`${re}px`},children:[z&&t.jsxs("div",{className:"chat-sidebar-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[t.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${h==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":h==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>f("direct"),children:"Direct"}),t.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${h==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":h==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>f("rooms"),children:"Rooms"})]}),!z||h==="direct"?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-sidebar-search-container",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Sn,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:I,onChange:e=>A(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:d?t.jsx("div",{className:"chat-status-copy chat-status-copy--padded",children:"Loading..."}):E.length===0?t.jsx("div",{className:"chat-status-copy chat-status-copy--padded",children:"No conversations yet"}):E.map(e=>t.jsxs("div",{className:`chat-session-item${i?.id===e.id?" chat-session-item--active":""}`,onClick:()=>os(e.id),onContextMenu:a=>{a.preventDefault(),k({sessionId:e.id,x:a.clientX,y:a.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:a=>{a.stopPropagation(),O(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(Lt,{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.jsxs("span",{className:"chat-session-meta-model",children:[e.modelProvider&&t.jsx(Qe,{provider:e.modelProvider,size:"sm"}),t.jsx("span",{children:oe.get(e.agentId)?.name||(e.agentId===He?Ss(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?Ds(e.updatedAt):""})]})]},e.id))})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[t.jsx("div",{className:"chat-sidebar-rooms-header",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>ae(!0),children:[t.jsx(lt,{size:14}),"Create room"]})}),o.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:"No rooms yet."}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:o.rooms.map(e=>{const a=o.activeRoom?.id===e.id,u=a?o.activeRoomMembers.length:null;return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${a?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{o.selectRoom(e.id),$&&me(!1)},onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),o.selectRoom(e.id),$&&me(!1))},children:[t.jsxs("span",{className:"chat-room-item-details",children:[t.jsxs("span",{className:"chat-room-item-name",children:["#",e.name]}),u!==null?t.jsxs("span",{className:"chat-room-item-meta",children:[u," ",u===1?"member":"members"]}):null]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":`Delete room ${e.name}`,onClick:N=>{N.stopPropagation(),xe(e.id)},children:t.jsx(Lt,{size:14})})]},e.id)})})]}),t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>q(!0),"data-testid":"chat-new-btn",children:[t.jsx(lt,{size:14}),"New Chat"]})})]}),!$&&ue&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":dt,"aria-valuemax":ut,"aria-valuenow":re,"aria-label":"Resize chat sidebar",tabIndex:0,onPointerDown:Bs,onKeyDown:Ks}),x&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:x.y,left:x.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Os(x.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Nn,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{k(null),O(x.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(Lt,{size:14}),"Delete"]})]}),Q&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>O(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Conversation?"}),t.jsx("p",{className:"chat-view-delete-dialog-copy",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:()=>O(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Hs(Q),children:"Delete"})]})]})}),z&&se&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>xe(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Room?"}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:"This action cannot be undone. This room and all its messages will be permanently deleted."}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>xe(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await o.deleteRoom(se),xe(null)}catch{r("Failed to delete room","error")}})()},children:"Delete"})]})]})}),z&&h==="rooms"?t.jsxs("div",{className:es,style:Zt,children:[o.activeRoom?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-room-thread-header",children:[$&&t.jsx("button",{className:"btn-icon",onClick:kt,"data-testid":"chat-back-btn",children:t.jsx(hs,{size:16})}),t.jsxs("div",{className:"chat-thread-header-title",children:["#",o.activeRoom.name]}),t.jsx("div",{className:"chat-room-thread-members",children:o.activeRoomMembers.map(e=>t.jsx(As,{agent:oe.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:De,onScroll:ts,children:[o.messagesLoading?t.jsx("div",{className:"chat-status-copy",children:"Loading messages..."}):o.messages.length===0?t.jsx("div",{className:"chat-status-copy",children:"No messages yet. Start the conversation!"}):o.messages.map(e=>{const a=e.senderAgentId?oe.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):"You",u={id:e.id,sessionId:e.roomId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:e.attachments,createdAt:e.createdAt};return t.jsx(Ot,{message:u,forcePlain:L,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:o.activeRoom?.id??null,mentionAgentsByName:yt,roomContext:be},e.id)}),t.jsx("div",{ref:Gt})]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:"Select a room or create one"}),o.activeRoom&&t.jsx("div",{className:"chat-input-area",children:t.jsxs("div",{className:"chat-input-row",children:[t.jsxs("div",{className:"chat-input-wrapper",children:[t.jsx("textarea",{ref:ne,className:"chat-input-textarea",placeholder:"Type a message...",value:c,onChange:ns,onKeyDown:ss,onKeyUp:as,onClick:ot,onBlur:rs,onFocus:is,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(fs,{agents:Fe,filter:je,highlightedIndex:P,visible:y,onSelect:rt,position:"below",roomMemberIds:be?.memberIds,roomName:be?.roomName})]}),t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{e.pointerType&&e.pointerType!=="mouse"&&e.preventDefault()},onMouseDown:e=>{e.preventDefault()},onClick:()=>{St()},disabled:!c.trim(),"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(gs,{size:16})})]})})]}):t.jsxs("div",{className:es,style:Zt,children:[(jt||!$)&&t.jsxs("div",{className:"chat-thread-header",children:[$&&jt&&t.jsx("button",{className:"btn-icon",onClick:Ct,"data-testid":"chat-back-btn",children:t.jsx(hs,{size:16})}),t.jsx("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:Gs?t.jsxs("div",{className:"chat-mobile-session-menu",ref:Vt,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":st,onClick:()=>Le(e=>!e),children:[Re?t.jsx(Qe,{provider:Re,size:"md"}):t.jsx(Ze,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Mt}),ls&&t.jsx("span",{className:"chat-model-tag",children:Me}),t.jsx(ps,{size:16,"aria-hidden":"true"})]}),st&&t.jsx("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:E.map(e=>t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${i?.id===e.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${e.id}`,onClick:()=>os(e.id),children:t.jsx("span",{className:"chat-mobile-session-option-title",children:e.title||"Untitled"})},e.id))})]}):t.jsxs(t.Fragment,{children:[Re?t.jsx(Qe,{provider:Re,size:"md"}):t.jsx(Ze,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Mt}),ls&&t.jsx("span",{className:"chat-model-tag",children:Me})]})}),jt&&t.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${L?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":L?"Show all messages as rendered Markdown":"Show all messages as plain text",onClick:qs,children:L?t.jsx(Cn,{size:14}):t.jsx(kn,{size:14})}),!$&&t.jsxs("button",{className:"btn btn-sm btn-primary chat-thread-header-new-chat",onClick:()=>q(!0),"data-testid":"chat-thread-new-chat-btn",children:[t.jsx(lt,{size:14}),"New Chat"]})]}),t.jsxs("div",{className:"chat-messages",ref:De,onScroll:ts,children:[T?t.jsxs(t.Fragment,{children:[v.map(e=>t.jsx(Ot,{message:e,forcePlain:L,agentName:Rt,hideAssistantIdentity:Et,showAssistantModelTag:At,activeModelTag:Me,activeModelProvider:Re,activeSessionId:i?.id??null,mentionAgentsByName:yt,roomContext:null,copyAction:Dt&&e.role==="assistant"?It(e.id,e.content):void 0},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!Et&&t.jsxs("div",{className:"chat-message-avatar",children:[Re?t.jsx(Qe,{provider:Re,size:"sm"}):t.jsx(Ze,{size:14}),t.jsx("span",{children:Rt}),At]}),D?Xs(D,L):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:S?"Thinking…":"Connecting…"}),Dt&&D&&It("__streaming__",D,"chat-copy-response-streaming"),Is(Y),S&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:ht(S)})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):M?t.jsx("div",{className:"chat-status-copy",children:"Loading messages..."}):v.length===0&&!i?Ws():v.length===0&&i?t.jsx("div",{className:"chat-status-copy",children:"No messages yet. Start the conversation!"}):t.jsx(t.Fragment,{children:v.map(e=>t.jsx(Ot,{message:e,forcePlain:L,agentName:Rt,hideAssistantIdentity:Et,showAssistantModelTag:At,activeModelTag:Me,activeModelProvider:Re,activeSessionId:i?.id??null,mentionAgentsByName:yt,roomContext:null,copyAction:Dt&&e.role==="assistant"?It(e.id,e.content):void 0},e.id))}),t.jsx("div",{ref:Gt})]}),ce&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:qe,children:[t.jsx(ps,{size:14}),"Latest"]}),i&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:qt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{at(e.target.files),e.target.value=""}}),we&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:gt?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):le.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:Be?"No skills found":"No skills available"}):le.map((e,a)=>t.jsxs("button",{type:"button",role:"option","aria-selected":a===Ce,className:`chat-skill-menu-item${a===Ce?" chat-skill-menu-item--highlighted":""}`,onMouseDown:u=>u.preventDefault(),onMouseEnter:()=>ke(a),onClick:()=>Nt(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))}),F.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:F.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,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:()=>_s(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),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:()=>qt.current?.click(),children:t.jsx(jn,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${B?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),J(!0)},onDragLeave:()=>J(!1),onDrop:e=>{e.preventDefault(),J(!1),at(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:ne,className:"chat-input-textarea",placeholder:"Type a message...",value:c,onChange:ns,onKeyDown:ss,onKeyUp:as,onClick:ot,onBlur:rs,onFocus:is,onPaste:zs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(fs,{agents:Fe,filter:je,highlightedIndex:P,visible:y,onSelect:rt,position:"below",roomMemberIds:be?.memberIds,roomName:be?.roomName}),t.jsx(Mn,{visible:K.mentionActive&&!y,position:Ps,files:K.files,selectedIndex:K.selectedIndex,onSelect:e=>{const a=K.selectFile(e,c);m(a),K.dismissMention(),Ke(!1),ne.current?.focus()},loading:K.loading}),b&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${Vs}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:j,children:"×"})]})]}),T?t.jsx("button",{className:"chat-input-stop",onClick:U,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(Rn,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{e.pointerType&&e.pointerType!=="mouse"&&e.preventDefault()},onMouseDown:e=>{e.preventDefault()},onClick:()=>{wt()},disabled:!c.trim()&&F.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(gs,{size:16})})]})]})]}),z&&t.jsx(On,{isOpen:Te,onClose:()=>ae(!1),projectId:s,existingRoomNames:o.rooms.map(e=>e.name),onCreate:async e=>{await o.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),h!=="rooms"&&f("rooms"),ae(!1),$&&me(!1)}}),V&&t.jsx(Yn,{projectId:s,onClose:()=>q(!1),onCreate:Us})]})}export{sa as ChatView,zt as clampChatInputHeight};
|
|
@@ -0,0 +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 be,bZ as we,b_ as xe,b$ as ye,c0 as et,c1 as ae,c2 as tt,c3 as rt,c4 as st,c5 as nt,c6 as at,c7 as ie,L as ee,S as it,M as lt,c8 as ct,by as ot,a as dt,c9 as Me,T as Ae,ca as ut,U as vt,aS as mt,aT as ft,a9 as pt,at as ht,R as gt}from"./index-DiewofJh.js";import"./vendor-xterm-DzcZoU0P.js";const ve=500,bt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function Te(e){return e.length<=ve?e:e.slice(-ve)}function le(e,i){return Te([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function Q(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function wt(e){return e?.previewUrl??null}async function Se(e){return tt(e)}async function Ne(e,i){return rt(e,i)}async function xt(e){return st(e)}async function yt(e){return nt(e)}async function je(e){return at(e)}function V(e){try{return e()}catch{return null}}function ce(){return typeof V(()=>de)=="function"&&typeof V(()=>De)=="function"}function X(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function St(e){const[i,o]=r.useState(null),[g,y]=r.useState([]),[w,f]=r.useState([]),[k,U]=r.useState([]),[C,T]=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=X(s);y([c]),R(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[R,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),U([]),T(!0),u(null),M(null),(async()=>{try{const[c,l]=await Promise.allSettled([ce()?de(e):Se(e).then(N=>[X(N)]),typeof V(()=>ae)=="function"?ae(e):je(e).then(N=>N.map(b=>({name:b.name,command:b.command,cwd:b.cwd,scriptName:b.scriptName,packagePath:b.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const b=N[0];ce()&&M(b.config.id),R(b)}}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&&T(!1)}})()},[R,e]),r.useEffect(()=>{const a=d?Ze(d,e):typeof V(()=>ue)=="function"?ue(e):null;if(!a)return;const s=n.current,c=Ue(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(Q);f(Te(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Q(v);f(b=>le(b,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Q(v);f(b=>le(b,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>le(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(b=>b&&{...b,status:N,runtime:v.pid?{...b.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:b.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=X(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&A()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,A,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{A()},bt);return()=>{clearInterval(a)}},[A,i?.status]);const _=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>be)=="function")l=await be(d,e);else{const v=await Ne({command:a,cwd:s},e);l=X(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>we)=="function")s=await we(d,e);else{const c=await xt(e);s=X(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),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 yt(e);s=X(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),P=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),b=X(N);o(b),y([b]),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 P(a)},[P]),F=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await A()},[A]),H=wt(i),x=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:g,logs:w,detectedCommands:k,previewUrl:H,isLoading:C,error:S,startServer:_,stopServer:D,restartServer:j,setPreviewUrl:P,detectCommands:h,refresh:A,candidates:k,serverState:x,loading:C,start:p,stop:E,restart:L,setManualUrl:z,detect:F,refreshStatus:O}}const ke=500,Ce=100;function Pe(e){return e.length>ke?e.slice(-ke):e}function ze(e){return e==="stderr"?"stderr":"stdout"}function K(e){try{return JSON.parse(e.data)}catch{return null}}function Z(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:ze(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Nt(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function oe(e,i){if(i.length===0)return e;const o=[...e],g=new Set(e.map(y=>y.id));for(const y of i)g.has(y.id)||(g.add(y.id),o.push(y));return o.sort((y,w)=>y.id-w.id),Pe(o)}function jt(e,i){const[o,g]=r.useState([]),[y,w]=r.useState(!1),[f,k]=r.useState(!1),[U,C]=r.useState(!1),[T,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,g([]),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=Pe(x);g(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;_.current=c,D.current=c+1},F=x=>{if(n.current||d.current!==E||!x||typeof x!="object")return;const a=x.lines;if(!Array.isArray(a))return;if(a.length>0&&typeof a[0]=="string"){const c=a.filter(l=>typeof l=="string").map((l,v)=>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),g(v=>oe(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await ie({maxLines:Ce},e);if(n.current||d.current!==E||M.current!==L)return;const s=a.lines.map((c,l)=>Z(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==E||M.current!==L)return;z([],null)}finally{!n.current&&d.current===E&&M.current===L&&w(!1)}const x=ue(e);u.current=Ue(x,{events:{"dev-server:log":a=>{const s=K(a);s&&O(s)},log:a=>{const s=K(a);s&&O(s)},history:a=>{const s=K(a);F(s)},"dev-server:history":a=>{const s=K(a);F(s)}},onReconnect:()=>{n.current||d.current!==E||ie({lastEventId:_.current,maxLines:50},e).then(a=>{if(n.current||d.current!==E)return;const s=a.lines.map((c,l)=>Z(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1)}g(c=>oe(c,s)),S(a.totalLines)}).catch(()=>{})}})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const P=r.useCallback(async()=>{if(!i||f)return;const E=d.current,L=o.length;k(!0);try{const z=await ie({maxLines:Ce,offset:L},e);if(n.current||d.current!==E)return;const F=z.lines.map((O,H)=>Z(O,H+1));g(O=>oe(F,O)),C(z.totalLines>L+F.length),S(z.totalLines)}catch{}finally{k(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{g([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:U,total:T,loadMore:P,clear:h,logs:o,isStreaming:p,clearLogs:h}}const kt="This preview appears to block iframe embedding. Open it in a new tab instead.",Ct="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Et="Preview is taking longer than expected and may block iframe embedding.";function Lt(e){return e==="blocked"?kt:e==="error"?Ct:null}function Rt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:g=null}=i,y=r.useRef(null),w=r.useRef(null),[f,k]=r.useState("unknown"),[U,C]=r.useState(null),[T]=r.useState(g),S=r.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),u=r.useCallback(j=>{k(j),C(Lt(j))},[]),n=r.useCallback(()=>{k("blocked"),C(Et)},[]);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:T,iframeRef:y,resetEmbedStatus:R,setEmbedStatus:u,retry:A,embedContext:U,handleIframeLoad:d,handleIframeError:M}}const _t=/\x1b\[[0-9;]*m/g;function me(e){return e.replace(_t,"")}function Dt(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 Ut(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Mt(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 At(e,i){if(!i)return e;const o=new RegExp(`(${Ut(i)})`,"ig"),g=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:g.map((w,f)=>w.toLowerCase()===y?t.jsx("mark",{children:w},`${w}-${f}`):t.jsx("span",{children:w},`${w}-${f}`))})}function Tt({entries:e,loading:i,loadingMore:o,hasMore:g,total:y,onLoadMore:w,isRunning:f}){const k=r.useRef(null),U=r.useRef(e.length),C=r.useRef(f),[T,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=>Mt(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,P=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)&&P(),C.current=f,U.current=e.length},[e.length,f,u,P]);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&&P()},[e,f,u,i,P]),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${T?" 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":T?"Exit fullscreen logs":"Enter fullscreen logs",children:T?t.jsx(lt,{size:14}):t.jsx(ct,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[g&&t.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:t.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick: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=Dt(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:ot(At(E,d.trim()))})]},p.id)})]}),u&&f&&t.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[t.jsx(dt,{size:14}),"New logs"]})]})]})}const Pt="devserver-preview-iframe";function zt({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:g,blockReason:y,onRetry:w,className:f=Pt,embedContext:k}){const U=y??k??null,[C,T]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(T(d=>d+1),o("loading"))},[i,o,e]);const S=r.useCallback(()=>{const d=g.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[g,o]),u=r.useCallback(d=>{d.stopPropagation(),o("error")},[o]),n=r.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?t.jsxs("div",{className:"devserver-preview-iframe-shell",children:[t.jsx("iframe",{src:e,ref:g,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:S,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${C}`),i==="loading"&&t.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading preview..."})]}),i==="blocked"&&t.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Preview cannot be embedded"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Unable to load preview"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]})]}):null}const Ee={stopped:{className:"dev-server-status-badge--stopped",label:"Stopped"},starting:{className:"dev-server-status-badge--starting",label:"Starting..."},running:{className:"dev-server-status-badge--running",label:"Running"},stopping:{className:"dev-server-status-badge--starting",label:"Stopping..."},failed:{className:"dev-server-status-badge--failed",label:"Failed"}};function Le(e){return e instanceof Error?e.message:String(e)}function $e(e){return e==="."?"root":e}function Re(e){return e?e==="root"?".":e:null}function _e(e,i,o){return!i||e.scriptName!==i?!1:o?$e(e.cwd)===o:!0}function $t(e){return e.cwd==="."?"root":e.cwd}function Ft(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Vt({addToast:e,projectId:i}){const{session:o,detectedCommands:g,previewUrl:y,isLoading:w,error:f,startServer:k,stopServer:U,restartServer:C,setPreviewUrl:T,detectCommands:S,refresh:u}=St(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:P}=jt(i,!!i),h=y,p=o?.config?.cwd??null,[E,L]=r.useState(!0),[z,F]=r.useState(""),[O,H]=r.useState(""),[x,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:b,setEmbedStatus:Fe,resetEmbedStatus:I,iframeRef:q,isEmbedded:Oe,isBlocked:te,blockReason:re,retry:fe}=Rt(N),[pe,W]=r.useState(!1),he=r.useRef(b);r.useEffect(()=>{const m=he.current!==b;te&&m&&W(!0),b==="embedded"&&W(!1),he.current=b},[b,te]),r.useEffect(()=>{W(!1)},[h]);const J=r.useMemo(()=>{if(!x)return null;const m=Re(p);return g.find($=>!($.scriptName!==x||m&&$.cwd!==m||o?.config?.command&&$.command!==o.config.command))??g.find($=>_e($,x,p))??null},[g,o?.config?.command,x,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(Le(m),"error")})},[e,S]),r.useEffect(()=>{if(x){L(!1);return}L(!0)},[x]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&F(o.config.command);return}if(J){F(J.command);return}g.length>0&&F(m=>m.trim().length>0?m:g[0]?.command??"")},[g,J,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const se=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),ge=r.useCallback(()=>{W(!1),fe()},[fe]),Be=r.useCallback(()=>{try{const m=q.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),I();return}}catch{}if(!(!h||!q.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),q.current.src=m.toString(),W(!1),I()}catch{q.current.src=h,W(!1),I()}},[h,q,I]),Y=r.useCallback(async(m,$,ne)=>{c(m);try{await $(),e(ne,"success")}catch(Ke){e(Le(Ke),"error")}finally{c(null)}},[e]),He=r.useCallback(m=>{a(m.scriptName),L(!1),F(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),Ve=r.useCallback(()=>{a(null),L(!0),e("Cleared selected dev server script.","success")},[e]),We=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const $=Re(p)??".",ne=J?.cwd??$;Y("start",()=>k(m,ne),"Dev server started.")},Xe=()=>{Y("stop",U,"Dev server stopped.")},qe=()=>{Y("restart",C,"Dev server restarted.")},Ge=()=>{const m=O.trim(),$=m.length>0?m:null;Y("preview",()=>T($),$?"Preview URL updated.":"Preview URL override cleared.")},Ie=r.useCallback(()=>{f&&u()},[f,u]),Je=n==="starting"||n==="running"||s!==null,Ye=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(ut,{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(vt,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Xe,disabled:Ye,"data-testid":"dev-server-stop-button",children:[t.jsx(mt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:qe,disabled:Qe,"data-testid":"dev-server-restart-button",children:[t.jsx(ft,{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&&g.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading dev server configuration..."})]}),f&&t.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[t.jsx("p",{children:f}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ie,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),x&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:x}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ve,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),E&&g.length===0&&t.jsxs("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:["No dev server scripts detected. Check that your project has a ",t.jsx("code",{children:"package.json"})," with a ",t.jsx("code",{children:"dev"}),", ",t.jsx("code",{children:"start"}),", or similar script."]}),E&&g.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:g.map(m=>{const $=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${$?"dev-server-candidate--selected":""}`,onClick:()=>He(m),"data-testid":`dev-server-candidate-${m.scriptName}-${$e(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:Ft(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:$t(m)})]},`${m.cwd}::${m.scriptName}::${m.command}`)})})]}),t.jsxs("div",{className:"dev-server-field-group",children:[t.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:"Command"}),t.jsx("input",{id:"dev-server-command",className:"input",value:z,onChange:m=>F(m.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:n==="running"||n==="starting"})]}),(n==="running"||n==="starting")&&o&&t.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[t.jsx("span",{className:"dev-server-label",children:"Running command"}),t.jsx("code",{children:o.config?.command??z})]}),t.jsxs("div",{className:"dev-server-preview-override",children:[t.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:"Preview URL Override"}),t.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:O,onChange:m=>H(m.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ge,disabled:s==="preview","data-testid":"dev-server-set-preview",children:"Save"})]}),h&&t.jsxs("p",{className:"dev-server-preview-hint",children:["Auto-detected: ",h]})]}),t.jsx("div",{className:"dev-server-content",children:t.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Logs"}),t.jsxs("span",{className:"dev-server-muted",children:[j??R.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(Tt,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,onLoadMore:P,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(pt,{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(ht,{})}),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(gt,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":b,"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:b==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[b==="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:b==="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:ge,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!pe&&t.jsx(zt,{url:h,embedStatus:b,onEmbedStatusChange:Fe,iframeRef:q,blockReason:re,onRetry:ge})]})]})]})}export{Vt as DevServerView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{
|
|
1
|
+
import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{ew as f,ex as g,dg as b,b as y,ad as P,a8 as H,a9 as C,L as O,aq as v}from"./index-DiewofJh.js";import{F as z}from"./folder-open-DU-Ec_iC.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};
|