@runfusion/fusion 0.17.1 → 0.17.2
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 +1706 -787
- package/dist/client/assets/{AgentDetailView-BmxnuM0D.js → AgentDetailView-17J-F0Rl.js} +1 -1
- package/dist/client/assets/{AgentsView-1xSqjJxs.js → AgentsView-sbBkb7Wd.js} +3 -3
- package/dist/client/assets/ChatView-BR5cvK_B.js +1 -0
- package/dist/client/assets/{DevServerView-DIrmWI5T.js → DevServerView-GFFVXHVP.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-Sqwdifcb.js → DirectoryPicker-WPDSBdT6.js} +1 -1
- package/dist/client/assets/{DocumentsView-Cx_02o_z.js → DocumentsView-BHpDsIIt.js} +1 -1
- package/dist/client/assets/{InsightsView-DAJSq4gV.js → InsightsView-Bxu0TJkt.js} +1 -1
- package/dist/client/assets/{MemoryView-CCIBAre3.js → MemoryView-CmnzZorw.js} +1 -1
- package/dist/client/assets/{NodesView-D02HxGCl.js → NodesView-CO9_4hCr.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-DD0fTQNf.js → PiExtensionsManager-4e3MlD62.js} +2 -2
- package/dist/client/assets/{PluginManager-Cfl0VBX9.js → PluginManager-DGN2rvOY.js} +1 -1
- package/dist/client/assets/{ResearchView-B9RqOVbr.js → ResearchView-Dsa6Gykl.js} +1 -1
- package/dist/client/assets/{RoadmapsView-DsH7Hicx.js → RoadmapsView-jHTOK0RQ.js} +1 -1
- package/dist/client/assets/{SettingsModal-Cn_CIPXu.js → SettingsModal-4Z8ZJMzD.js} +1 -1
- package/dist/client/assets/SettingsModal-D0kuJpBA.js +31 -0
- package/dist/client/assets/{SetupWizardModal-k5vqrHZU.js → SetupWizardModal-Bhumd4Rf.js} +1 -1
- package/dist/client/assets/{SkillsView-BIdt5cfB.js → SkillsView-MHweJTz4.js} +1 -1
- package/dist/client/assets/{folder-open-B3TO7t7Z.js → folder-open-BNQW9dE9.js} +1 -1
- package/dist/client/assets/{index-BIJgrHEn.css → index-DEVBHvyW.css} +1 -1
- package/dist/client/assets/index-k_85J1DS.js +682 -0
- package/dist/client/assets/{star-DW-M-BD_.js → star-7L86NZrT.js} +1 -1
- package/dist/client/assets/{upload-BzG6fknr.js → upload-DsAS6tno.js} +1 -1
- package/dist/client/assets/{users-DEicv0kj.js → users-D3u6f2Rz.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/extension.js +1215 -524
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/package.json +1 -1
- package/dist/client/assets/ChatView-CkWkEwXL.js +0 -1
- package/dist/client/assets/SettingsModal-YH_rM1ZT.js +0 -31
- package/dist/client/assets/index-BlkXZ4C5.js +0 -682
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as t,j as e}from"./vendor-react-K0fH_qHe.js";import{c as Ze,
|
|
1
|
+
import{r as t,j as e}from"./vendor-react-K0fH_qHe.js";import{c as Ze,dh as Os,di as _s,dj as Is,dk as Vs,L as I,R as Xe,ao as gs,Z as Us,ap as qe,_ as De,a as ys,b as Ss,dl as Js,dm as qs,dn as Gs,b1 as Ws,z as ks,cs as Ks,dp as Ys,I as Z,dq as Zs,dr as Rs,ds as Cs,s as Ee,B as We,W as Te,Y as fs,aK as Re,X as Xs,F as Ce,A as $e,dt as ws,du as Ms,dv as Qs,cm as et,aJ as st,bs as tt,aq as Fs,a1 as at,a4 as nt,a6 as it,dw as Ke,k as As,dx as rt,r as lt,$ as Ts,dy as ct,C as ae,dz as ot,dA as dt,dB as ut,dC as ze,ac as He,ae as Be,af as Oe,aa as Es,dD as mt,dE as ht,i as gt,h as ft,l as xt,dF as Ye,a5 as pt,dG as vt,dH as bt,dI as jt,dJ as Nt,dK as $s,dL as yt,dM as St,dN as kt,a2 as Rt,dO as Ct}from"./index-k_85J1DS.js";import{S as Ls}from"./star-7L86NZrT.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-
|
|
2
|
-
import{c as Nt,A as Re,C as Ke,Z as Rt,s as Pt,r as Ge,F as ct,f as _t,a as $t,b as It,B as dt,u as Ct,d as et,e as Ft,g as Lt,h as zt,i as Dt,j as ht,P as Ot,k as Ht,l as qt,m as Vt,n as Wt,o as Bt,p as Ut,q as Kt,t as Gt,v as pt,G as Qt,S as Jt,L as tt,T as nt,R as Qe,X as bt,w as Zt,x as Xt,y as vt,z as Yt,D as en,E as tn,H as nn,I as xe,J as at,K as an,M as sn,N as rn,O as ln,Q as on,U as cn,V as dn,W as Ne,Y as We,_ as ft,$ as st,a0 as un,a1 as mn,a2 as Be,a3 as gn,a4 as hn,a5 as pn,a6 as bn,a7 as vn}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-17J-F0Rl.js","assets/vendor-react-K0fH_qHe.js","assets/index-k_85J1DS.js","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/index-DEVBHvyW.css","assets/star-7L86NZrT.js","assets/AgentDetailView-yu8Xltqk.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{c as Nt,A as Re,C as Ke,Z as Rt,s as Pt,r as Ge,F as ct,f as _t,a as $t,b as It,B as dt,u as Ct,d as et,e as Ft,g as Lt,h as zt,i as Dt,j as ht,P as Ot,k as Ht,l as qt,m as Vt,n as Wt,o as Bt,p as Ut,q as Kt,t as Gt,v as pt,G as Qt,S as Jt,L as tt,T as nt,R as Qe,X as bt,w as Zt,x as Xt,y as vt,z as Yt,D as en,E as tn,H as nn,I as xe,J as at,K as an,M as sn,N as rn,O as ln,Q as on,U as cn,V as dn,W as Ne,Y as We,_ as ft,$ as st,a0 as un,a1 as mn,a2 as Be,a3 as gn,a4 as hn,a5 as pn,a6 as bn,a7 as vn}from"./index-k_85J1DS.js";import{r as n,j as e,a as fn}from"./vendor-react-K0fH_qHe.js";import{S as xn,r as yn}from"./AgentDetailView-17J-F0Rl.js";import{U as St}from"./upload-DsAS6tno.js";import{F as wn}from"./folder-open-BNQW9dE9.js";import"./vendor-xterm-DzcZoU0P.js";import"./star-7L86NZrT.js";/**
|
|
3
3
|
* @license lucide-react v1.7.0 - ISC
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the ISC license.
|
|
@@ -514,4 +514,4 @@ reportsTo: null
|
|
|
514
514
|
skills:
|
|
515
515
|
- review
|
|
516
516
|
---
|
|
517
|
-
Agent instructions go here...`,value:p,onChange:i=>{d("paste"),y([]),v(i.target.value),z(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",r]}),ie&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(nt,{size:14}),ie]})]}),c==="preview"&&e.jsxs("div",{className:"agent-import-preview",children:[e.jsxs("div",{className:"agent-import-company",children:[e.jsx("span",{className:"agent-import-company-label",children:"Company"}),e.jsx("span",{className:"agent-import-company-name",children:I})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(ct,{size:14}),e.jsxs("span",{children:[E.length," agent",E.length!==1?"s":""," found"]})]}),E.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>h(E.map(i=>i.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>h([]),children:"Clear agents"})]}),E.length>0?e.jsx("div",{className:"agent-import-agent-list",children:E.map((i,b)=>e.jsxs("div",{className:"agent-import-agent-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select agent ${i.name}`,checked:T.includes(i.name),onChange:()=>Pe(i.name)})}),e.jsx("span",{className:"agent-import-agent-icon",children:i.icon||"🤖"}),e.jsxs("div",{className:"agent-import-agent-details",children:[e.jsx("span",{className:"agent-import-agent-name",children:i.name}),e.jsxs("span",{className:"agent-import-agent-meta",children:[i.title&&e.jsxs("span",{className:"agent-import-agent-title",children:[i.title," · "]}),e.jsx("span",{className:"agent-import-agent-role",children:i.role}),i.reportsTo&&e.jsxs("span",{className:"agent-import-agent-reports",children:[" · reports to ",i.reportsTo]}),i.skills&&i.skills.length>0&&e.jsxs("span",{className:"agent-import-agent-model",children:[" · skills: ",i.skills.join(", ")]})]}),i.instructionsText&&e.jsxs("span",{className:"agent-import-agent-instructions",children:[i.instructionsText.slice(0,100),i.instructionsText.length>100?"...":""]})]})]},b))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),$.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(ct,{size:14}),e.jsxs("span",{children:[$.length," skill",$.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>K($.map(i=>i.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>K([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:$.map((i,b)=>e.jsxs("div",{className:"agent-import-skill-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select skill ${i.name}`,checked:M.includes(i.name),onChange:()=>je(i.name)})}),e.jsx("span",{className:"agent-import-skill-icon",children:"⚡"}),e.jsxs("div",{className:"agent-import-skill-details",children:[e.jsx("span",{className:"agent-import-skill-name",children:i.name}),i.description&&e.jsx("span",{className:"agent-import-skill-description",children:i.description})]})]},`${i.name}-${b}`))})]}),Y&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(nt,{size:14}),Y]})]}),c==="result"&&m&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(Ke,{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:m.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[m.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[m.created.length," created"]})}),m.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[m.skipped.length," skipped (already exist)"]})}),m.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[m.errors.length," error",m.errors.length!==1?"s":""]})})]}),m.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:m.created.map((i,b)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Ke,{size:12}),e.jsx("span",{children:i.name})]},b))}),m.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:m.errors.map((i,b)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(bt,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},b))}),m.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:[m.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[m.skills.imported.length," skill",m.skills.imported.length!==1?"s":""," imported"]})}),m.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[m.skills.skipped.length," skill",m.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),m.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[m.skills.errors.length," skill",m.skills.errors.length!==1?"s":""," error",m.skills.errors.length!==1?"s":""]})}),m.skills.imported.length===0&&m.skills.skipped.length===0&&m.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"})})]}),m.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:m.skills.imported.map((i,b)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Ke,{size:12}),e.jsx("span",{children:i.name})]},b))}),m.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:m.skills.errors.map((i,b)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(bt,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},b))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[c==="preview"&&e.jsx("button",{className:"btn",onClick:()=>g("input"),disabled:se,children:"Back"}),e.jsx("button",{className:"btn",onClick:me,disabled:se,children:c==="result"?"Close":"Cancel"}),c==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void te(),disabled:F||(r==="directory"?N.length===0:r==="browse"?!D:!p.trim()),children:F?e.jsxs(e.Fragment,{children:[e.jsx(tt,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),c==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void we(),disabled:se||O===0&&H===0,children:se?e.jsxs(e.Fragment,{children:[e.jsx(tt,{size:14,className:"spin"}),ne]}):`Import ${Ae}`})]})]})}):null}const ia=n.lazy(()=>vn(()=>import("./AgentDetailView-BmxnuM0D.js").then(s=>s.A),__vite__mapDeps([0,1,2,3,4,5,6,7])).then(s=>({default:s.AgentDetailView}))),Ue=[{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:"✦"}],ot=[.1,.25,.5,1,2,3,5,10],ra=/(?:^|\/)skills\/([^/]+)\/SKILL\.md$/i;function Et(s){const o=s.trim();if(!o)return s;const k=o.match(ra);return k?.[1]?k[1]:o}function Je(s){switch(s){case"running":return"agent-badge--running";case"active":return"agent-badge--active";case"paused":return"agent-badge--paused";case"error":return"agent-badge--error";case"terminated":return"agent-badge--terminated";case"idle":default:return"agent-badge--idle"}}function ut(s,o){switch(o){case"running":return`${s}--running`;case"active":return`${s}--active`;case"paused":return`${s}--paused`;case"error":return`${s}--error`;case"terminated":return`${s}--terminated`;case"idle":default:return`${s}--idle`}}function Tt({node:s,onSelect:o,getHealthStatus:k,getRoleIcon:u,getSkillBadges:c,selectedAgentId:g}){const{agent:r,children:d}=s,p=k(r),v=Je(r.state),N=ut("org-chart-node-card",r.state);return e.jsxs("div",{className:`org-chart-node${d.length>0?" org-chart-node--has-children":""}`,children:[e.jsxs("div",{className:`${N}${g===r.id?" agent-card--selected":""}`,onClick:()=>o(r.id),role:"button",tabIndex:0,onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.key===" "&&y.preventDefault(),o(r.id))},children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:u(r.role)}),e.jsx("span",{className:"org-chart-node__name",children:r.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${v}`,children:r.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:p.color},title:p.reason??p.label,children:[p.icon,!p.stateDerived&&e.jsx("span",{className:"text-secondary",children:p.label})]}),(()=>{const y=c(r);if(y.length===0)return null;const I=y.slice(0,2),f=y.length-2;return e.jsxs(e.Fragment,{children:[I.map(E=>e.jsx("span",{className:"org-chart-node__skill",children:Et(E)},E)),f>0&&e.jsxs("span",{className:"org-chart-node__skill",children:["+",f]})]})})()]})]}),d.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${r.name} employees`,children:d.map(y=>e.jsx(Tt,{node:y,onSelect:o,getHealthStatus:k,getRoleIcon:u,getSkillBadges:c,selectedAgentId:g},y.agent.id))})]})}function ha({addToast:s,projectId:o,onOpenTaskLogs:k,agentOnboardingEnabled:u=!1}){const[c,g]=n.useState(!1),d=Zt()==="mobile",[p,v]=n.useState("all"),{agents:N,stats:y,isLoading:I,loadAgents:f}=Xt(o,{filterState:p,showSystemAgents:c}),[E,R]=n.useState(!1),[$,j]=n.useState(!1),[T,h]=n.useState(null),[M,K]=n.useState(!1),[F,Z]=n.useState(null),se=d&&!!F,[G,ie]=n.useState("dashboard"),[z,m]=n.useState(null),[A,Y]=n.useState(!1),[P,Q]=n.useState(()=>{if(typeof window>"u")return"list";const t=vt("fn-agent-view",o);return t==="list"||t==="board"||t==="org"?t:"list"}),[re,pe]=n.useState([]),[ce,ee]=n.useState(!1),[de,D]=n.useState(!1),[ge,oe]=n.useState(!1),ue=n.useRef(null),{confirm:Ie}=Yt(),X=n.useRef(null),he=n.useId();n.useEffect(()=>{const t=vt("fn-agent-view",o);if(t==="list"||t==="board"||t==="org"){Q(t);return}Q("list")},[o]),n.useEffect(()=>{en("fn-agent-view",P,o)},[P,o]);const[be,le]=n.useState(null),me=n.useRef(null),[Ce,B]=n.useState(null),[ye,te]=n.useState(null),[we,O]=n.useState({}),[H,Se]=n.useState(1),[ve,Ae]=n.useState(!1),[ne,Pe]=n.useState(new Set),[je,i]=n.useState(new Map),b=n.useRef(!0);n.useEffect(()=>(b.current=!0,()=>{b.current=!1}),[]),n.useEffect(()=>{tn(o).then(t=>{b.current&&Se(t.heartbeatMultiplier??1)}).catch(()=>{})},[o]);const _=n.useCallback(async t=>{const l=Number.isFinite(t)&&t>0?t:1;Se(l),Ae(!0);try{await nn({heartbeatMultiplier:l},o),s(`Heartbeat speed set to ×${l.toFixed(1)}`,"success")}catch(w){s(`Failed to save heartbeat multiplier: ${xe(w)}`,"error")}finally{b.current&&Ae(!1)}},[o,s]),U=n.useMemo(()=>je.size===0?N:N.map(t=>{const l=je.get(t.id);return l?{...t,state:l}:t}),[N,je]),q=n.useMemo(()=>U.filter(t=>c||!at(t)),[U,c]),J=n.useMemo(()=>U.filter(t=>t.state!=="active"&&t.state!=="running"?!1:c||!at(t)),[U,c]),_e=n.useMemo(()=>{if(c)return re;const t=l=>at(l.agent)?null:{...l,children:l.children.map(t).filter(w=>w!==null)};return re.map(t).filter(l=>l!==null)},[re,c]);n.useEffect(()=>{if(P!=="org")return;let t=!1;return ee(!0),an(o,{includeEphemeral:c}).then(l=>{t||pe(l)}).catch(l=>{t||(s(`Failed to load org chart: ${xe(l)}`,"error"),pe([]))}).finally(()=>{t||ee(!1)}),()=>{t=!0}},[P,o,c,s]),n.useEffect(()=>{const t=setInterval(()=>{f()},3e4);return()=>{clearInterval(t)}},[f]),n.useEffect(()=>{if(!de)return;const t=w=>{const S=w.target;S&&(ue.current?.contains(S)||X.current?.contains(S)||D(!1))},l=w=>{w.key==="Escape"&&(D(!1),X.current?.focus())};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",l)}},[de]);const W=async(t,l)=>{if(!ne.has(t)){Pe(w=>new Set(w).add(t)),i(w=>{const S=new Map(w);return S.set(t,l),S});try{await hn(t,l,o),s(`Agent state updated to ${l}`,"success"),await f(),i(w=>{const S=new Map(w);return S.delete(t),S})}catch(w){i(S=>{const V=new Map(S);return V.delete(t),V}),s(`Failed to update state: ${xe(w)}`,"error")}finally{Pe(w=>{const S=new Set(w);return S.delete(t),S})}}},Oe=async(t,l)=>{if(await Ie({title:"Delete Agent",message:`Delete agent "${l}"? This cannot be undone.`,danger:!0}))try{await bn(t,o),s(`Agent "${l}" deleted`,"success"),f()}catch(S){s(`Failed to delete agent: ${xe(S)}`,"error")}},He=async(t,l)=>{const w=N.find(S=>S.id===t);if(w){if(w.role===l){le(null);return}try{await Be(t,{role:l},o),s(`Agent role updated to ${Ue.find(S=>S.value===l)?.label??l}`,"success"),le(null),f()}catch(S){s(`Failed to update role: ${xe(S)}`,"error")}}},$e=(t,l)=>{t.key==="Escape"&&le(null)},Le=async(t,l)=>{ye===t.id&&(te(null),O(w=>{const S={...w};return delete S[t.id],S})),B(t.id);try{await Be(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:l}},o),s(`Heartbeat interval updated to ${st(l)} for ${t.name}`,"success"),f()}catch(w){s(`Failed to update heartbeat interval: ${xe(w)}`,"error")}finally{B(null)}},ze=async t=>{const l=we[t.id]??"";if(l.trim()===""){s("Please enter a heartbeat interval in minutes","error");return}const w=Number(l);if(isNaN(w)){s("Heartbeat interval must be a valid number","error");return}if(w<=0){s("Heartbeat interval must be greater than 0","error");return}if(w>=1&&w<5){B(t.id);try{await Be(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:gn}},o),s(`Heartbeat interval set to 5 minutes (minimum). ${w} minute${w!==1?"s":""} was below the 5-minute minimum.`,"success"),te(null),O(V=>{const Te={...V};return delete Te[t.id],Te}),f()}catch(V){s(`Failed to update heartbeat interval: ${xe(V)}`,"error")}finally{B(null)}return}const S=Math.round(w*6e4);B(t.id);try{await Be(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:S}},o),s(`Heartbeat interval updated to ${st(S)} for ${t.name}`,"success"),te(null),O(V=>{const Te={...V};return delete Te[t.id],Te}),f()}catch(V){s(`Failed to update heartbeat interval: ${xe(V)}`,"error")}finally{B(null)}},qe=t=>{const l=Ge(t.runtimeConfig?.heartbeatIntervalMs),w=Math.round(l/6e4);te(t.id),O(S=>({...S,[t.id]:String(w)}))},a=n.useCallback((t,l)=>{Z(t),ie(l?.initialTab??"dashboard"),m(l?.initialRunId??null),Y(l?.preferActiveRun??!1)},[]),C=n.useCallback(()=>{Z(null),ie("dashboard"),m(null),Y(!1)},[]),Ee=n.useCallback(t=>{a(t)},[a]),ke=n.useCallback(t=>{a(t),d&&oe(!1)},[d,a]),fe=async(t,l)=>{try{await pn(t,o,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),s(`Heartbeat run started for ${l}`,"success"),f()}catch(w){s(`Failed to start heartbeat run: ${xe(w)}`,"error")}},mt=t=>Ue.find(l=>l.value===t)?.label??t,Ze=t=>Ue.find(l=>l.value===t)?.icon??"◆",L=F?q.find(t=>t.id===F)??null:null,gt=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],Xe=t=>mn(t),Mt=I&&N.length===0,Ve=n.useCallback(()=>{if(u){j(!0);return}R(!0)},[u]);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(dt,{size:24}),e.jsx("h2",{children:"Agents"})]}),e.jsxs("div",{className:"agents-view-controls",children:[e.jsxs("div",{className:"view-toggle",children:[e.jsx("button",{className:`view-toggle-btn${P==="list"?" active":""}`,onClick:()=>Q("list"),title:"List view","aria-label":"List view","aria-pressed":P==="list",children:e.jsx(sn,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="board"?" active":""}`,onClick:()=>Q("board"),title:"Board view","aria-label":"Board view","aria-pressed":P==="board",children:e.jsx(Re,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="org"?" active":""}`,onClick:()=>Q("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":P==="org",children:e.jsx(rn,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:X,className:`btn-icon agent-controls-trigger${de?" agent-controls-trigger--active":""}`,onClick:()=>D(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":de,"aria-controls":he,children:e.jsx(In,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void f(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Qe,{size:16,className:I?"spin":void 0})}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{Ve(),D(!1)},children:[e.jsx(ln,{size:16}),"New Agent"]})]})]})]}),de&&e.jsxs("div",{ref:ue,id:he,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsxs("div",{className:"agent-controls",children:[e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(on,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:p,onChange:t=>v(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"}),e.jsx("option",{value:"terminated",children:"Terminated"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:c,onChange:t=>g(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]}),e.jsx("div",{className:"agent-controls-actions",children:e.jsxs("button",{className:"btn",onClick:()=>{K(!0),D(!1)},children:[e.jsx(St,{size:16}),"Import"]})})]}),e.jsx("div",{className:"agent-global-controls",children:e.jsxs("div",{className:"heartbeat-multiplier-group",children:[e.jsxs("div",{className:"heartbeat-multiplier-controls",children:[e.jsx("label",{htmlFor:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-label",children:"Heartbeat Speed"}),e.jsx("input",{id:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-slider touch-target",type:"range",min:.1,max:10,step:.1,value:H,onChange:t=>{const l=Number(t.target.value);_(Number.isFinite(l)&&l>0?l:1)},disabled:ve}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",H.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(ot.reduce((t,l)=>Math.abs(l-H)<Math.abs(t-H)?l:t,ot[0])),onChange:t=>{const l=Number(t.target.value);_(Number.isFinite(l)&&l>0?l:1)},disabled:ve,"aria-label":"Heartbeat speed preset",children:ot.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(Cn,{agents:q})]}),e.jsx(Pn,{stats:y,activeAgents:J,projectId:o,isOpen:ge,onToggle:()=>oe(t=>!t),onSelectAgent:ke,onOpenTaskLogs:k}),e.jsxs("div",{className:"agents-split-layout",children:[e.jsxs("div",{className:`agents-split-sidebar${se?" agents-split-sidebar--hidden-mobile":""}`,children:[e.jsxs("div",{className:"agents-view-content",children:[e.jsx(ta,{isOpen:E,onClose:()=>{R(!1),h(null)},onCreated:()=>{R(!1),h(null),f()},projectId:o,prefillDraft:T}),e.jsx(na,{isOpen:$,onClose:()=>j(!1),onUseDraft:t=>{h(t),j(!1),R(!0)},projectId:o,existingAgents:N}),e.jsx(sa,{isOpen:M,onClose:()=>K(!1),onImported:()=>void f(),projectId:o}),Mt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Qe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):P==="org"?e.jsx("div",{className:"agent-org-chart","data-testid":"agent-org-chart",children:ce?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Qe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):_e.length===0?e.jsx(rt,{onCtaClick:Ve}):_e.map(t=>e.jsx(Tt,{node:t,onSelect:a,getHealthStatus:Xe,getRoleIcon:Ze,getSkillBadges:gt,selectedAgentId:F},t.agent.id))}):P==="board"?e.jsx("div",{className:"agent-board",children:q.length===0?e.jsx(rt,{onCtaClick:Ve}):q.map(t=>{const l=Xe(t),w=Je(t.state),S=ut("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${S}${F===t.id?" agent-card--selected":""}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>a(t.id),role:"button",tabIndex:0,onKeyDown:V=>{(V.key==="Enter"||V.key===" ")&&(V.key===" "&&V.preventDefault(),a(t.id))},children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:Ze(t.role)}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:mt(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${w}`,children:t.state})]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:l.color},title:l.reason??l.label,children:[l.icon,!l.stateDerived&&` ${l.label}`]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:q.length===0?e.jsx(rt,{onCtaClick:Ve}):q.map(t=>{const l=Xe(t),w=Je(t.state),S=ut("agent-card",t.state),V=Ge(t.runtimeConfig?.heartbeatIntervalMs),Te=cn(V),De=Ce===t.id;return e.jsxs("div",{className:`agent-card ${S}${F===t.id?" agent-card--selected":""}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info agent-info--clickable",onClick:()=>a(t.id),role:"button",tabIndex:0,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(x.key===" "&&x.preventDefault(),a(t.id))},children:[be===t.id?e.jsx("select",{ref:me,className:"select agent-role-select",value:t.role,onChange:x=>void He(t.id,x.target.value),onKeyDown:x=>$e(x,t.id),onBlur:()=>le(null),autoFocus:!0,children:Ue.map(x=>e.jsxs("option",{value:x.value,children:[x.icon," ",x.label]},x.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:x=>{x.stopPropagation(),le(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(x.stopPropagation(),le(t.id))},children:Ze(t.role)}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(It,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${w}`,children:t.state}),e.jsxs("span",{className:"badge",style:{color:l.color},title:l.reason??l.label,children:[l.icon,!l.stateDerived&&` ${l.label}`]}),e.jsx("span",{className:"badge text-secondary",children:mt(t.role)}),(()=>{const x=gt(t);if(x.length===0)return null;const ae=x.slice(0,2),Me=x.length-2;return e.jsxs(e.Fragment,{children:[ae.map(Ye=>e.jsx("span",{className:"badge badge-skill",title:Ye,children:Et(Ye)},Ye)),Me>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",Me]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),ye===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:we[t.id]??"",onChange:x=>O(ae=>({...ae,[t.id]:x.target.value})),onKeyDown:x=>{x.key==="Enter"?ze(t):x.key==="Escape"&&(te(null),O(ae=>{const Me={...ae};return delete Me[t.id],Me}))},disabled:De,"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 ze(t),disabled:De,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>{te(null),O(x=>{const ae={...x};return delete ae[t.id],ae})},disabled:De,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:V,onChange:x=>{const ae=x.target.value;ae==="__custom__"?qe(t):Le(t,Number(ae))},disabled:De,"aria-label":`Set heartbeat interval for ${t.name}`,children:[Te.map(x=>e.jsx("option",{value:x.value,children:x.label},x.value)),dn.some(x=>x.value===V)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),De&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const x=new Date(t.lastHeartbeatAt),ae=new Date(x.getTime()+V),Me=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:x.toLocaleString(),children:["Last: ",x.toLocaleTimeString()]}),Me&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:ae.toLocaleString(),children:["Next: ",ae.toLocaleTimeString()]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[t.state==="idle"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"active"),disabled:ne.has(t.id),title:"Activate",children:[e.jsx(Ne,{size:14})," Start"]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void fe(t.id,t.name),disabled:ne.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(Re,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"paused"),disabled:ne.has(t.id),title:"Pause",children:[e.jsx(We,{size:14})," Pause"]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"active"),disabled:ne.has(t.id),title:"Resume",children:[e.jsx(Ne,{size:14})," Resume"]}),t.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>a(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(Re,{size:14})," Running"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"paused"),disabled:ne.has(t.id),title:"Pause",children:[e.jsx(We,{size:14})," Pause"]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"active"),disabled:ne.has(t.id),title:"Retry",children:[e.jsx(Ne,{size:14})," Retry"]}),t.state==="terminated"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"active"),disabled:ne.has(t.id),title:"Start",children:[e.jsx(Ne,{size:14})," Start"]}),e.jsx("button",{className:"btn btn--sm agent-card-details-btn",onClick:()=>a(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:"View Details"}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void Oe(t.id,t.name),title:"Delete",children:[e.jsx(ft,{size:14})," Delete"]})]})]},t.id)})})]}),!d&&L&&e.jsxs("div",{className:"agents-sidebar-quick-controls",children:[e.jsxs("div",{className:"agents-sidebar-quick-controls__header",children:[e.jsx("strong",{children:L.name}),e.jsx("span",{className:`badge ${Je(L.state)}`,children:L.state})]}),e.jsxs("div",{className:"agents-sidebar-quick-controls__meta",children:[e.jsx("span",{children:st(Ge(L.runtimeConfig?.heartbeatIntervalMs))}),L.lastHeartbeatAt&&e.jsxs("span",{children:["Last ",yn(L.lastHeartbeatAt)]})]}),e.jsxs("div",{className:"agents-sidebar-quick-controls__actions",children:[L.state==="idle"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"active"),children:[e.jsx(Ne,{size:14})," Start"]}),L.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void fe(L.id,L.name),children:[e.jsx(Re,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"paused"),children:[e.jsx(We,{size:14})," Pause"]})]}),L.state==="running"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"paused"),children:[e.jsx(We,{size:14})," Pause"]}),L.state==="paused"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"active"),children:[e.jsx(Ne,{size:14})," Resume"]}),L.state==="error"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"active"),children:[e.jsx(Ne,{size:14})," Retry"]}),L.state==="terminated"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"active"),children:[e.jsx(Ne,{size:14})," Start"]}),e.jsxs("button",{className:"btn btn-danger btn-sm",onClick:()=>void Oe(L.id,L.name),children:[e.jsx(ft,{size:14})," Delete"]})]})]})]})]}),e.jsxs("div",{className:`agents-split-detail${d&&!F?" agents-split-detail--hidden-mobile":""}`,children:[se&&e.jsx("div",{className:"agents-mobile-back-row",children:e.jsxs("button",{className:"btn agents-mobile-back-btn",onClick:C,children:[e.jsx(un,{size:16}),"Agents"]})}),F?e.jsx(n.Suspense,{fallback:null,children:e.jsx(ia,{inline:!0,agentId:F,projectId:o,onClose:C,addToast:s,onChildClick:Ee,initialTab:G,initialRunId:z,preferActiveRun:A})}):e.jsxs("div",{className:"agents-detail-empty-state",children:[e.jsx(dt,{size:48}),e.jsx("h3",{children:"Select an agent"}),e.jsx("p",{children:"Choose an agent from the sidebar to view details"})]})]})]})]})}export{ha as AgentsView,Et as formatAgentSkillBadgeLabel};
|
|
517
|
+
Agent instructions go here...`,value:p,onChange:i=>{d("paste"),y([]),v(i.target.value),z(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",r]}),ie&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(nt,{size:14}),ie]})]}),c==="preview"&&e.jsxs("div",{className:"agent-import-preview",children:[e.jsxs("div",{className:"agent-import-company",children:[e.jsx("span",{className:"agent-import-company-label",children:"Company"}),e.jsx("span",{className:"agent-import-company-name",children:I})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(ct,{size:14}),e.jsxs("span",{children:[E.length," agent",E.length!==1?"s":""," found"]})]}),E.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>h(E.map(i=>i.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>h([]),children:"Clear agents"})]}),E.length>0?e.jsx("div",{className:"agent-import-agent-list",children:E.map((i,b)=>e.jsxs("div",{className:"agent-import-agent-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select agent ${i.name}`,checked:T.includes(i.name),onChange:()=>Pe(i.name)})}),e.jsx("span",{className:"agent-import-agent-icon",children:i.icon||"🤖"}),e.jsxs("div",{className:"agent-import-agent-details",children:[e.jsx("span",{className:"agent-import-agent-name",children:i.name}),e.jsxs("span",{className:"agent-import-agent-meta",children:[i.title&&e.jsxs("span",{className:"agent-import-agent-title",children:[i.title," · "]}),e.jsx("span",{className:"agent-import-agent-role",children:i.role}),i.reportsTo&&e.jsxs("span",{className:"agent-import-agent-reports",children:[" · reports to ",i.reportsTo]}),i.skills&&i.skills.length>0&&e.jsxs("span",{className:"agent-import-agent-model",children:[" · skills: ",i.skills.join(", ")]})]}),i.instructionsText&&e.jsxs("span",{className:"agent-import-agent-instructions",children:[i.instructionsText.slice(0,100),i.instructionsText.length>100?"...":""]})]})]},b))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),$.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(ct,{size:14}),e.jsxs("span",{children:[$.length," skill",$.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>K($.map(i=>i.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>K([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:$.map((i,b)=>e.jsxs("div",{className:"agent-import-skill-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select skill ${i.name}`,checked:M.includes(i.name),onChange:()=>je(i.name)})}),e.jsx("span",{className:"agent-import-skill-icon",children:"⚡"}),e.jsxs("div",{className:"agent-import-skill-details",children:[e.jsx("span",{className:"agent-import-skill-name",children:i.name}),i.description&&e.jsx("span",{className:"agent-import-skill-description",children:i.description})]})]},`${i.name}-${b}`))})]}),Y&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(nt,{size:14}),Y]})]}),c==="result"&&m&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(Ke,{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:m.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[m.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[m.created.length," created"]})}),m.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[m.skipped.length," skipped (already exist)"]})}),m.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[m.errors.length," error",m.errors.length!==1?"s":""]})})]}),m.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:m.created.map((i,b)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Ke,{size:12}),e.jsx("span",{children:i.name})]},b))}),m.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:m.errors.map((i,b)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(bt,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},b))}),m.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:[m.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[m.skills.imported.length," skill",m.skills.imported.length!==1?"s":""," imported"]})}),m.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[m.skills.skipped.length," skill",m.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),m.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[m.skills.errors.length," skill",m.skills.errors.length!==1?"s":""," error",m.skills.errors.length!==1?"s":""]})}),m.skills.imported.length===0&&m.skills.skipped.length===0&&m.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"})})]}),m.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:m.skills.imported.map((i,b)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Ke,{size:12}),e.jsx("span",{children:i.name})]},b))}),m.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:m.skills.errors.map((i,b)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(bt,{size:12}),e.jsxs("span",{children:[i.name,": ",i.error]})]},b))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[c==="preview"&&e.jsx("button",{className:"btn",onClick:()=>g("input"),disabled:se,children:"Back"}),e.jsx("button",{className:"btn",onClick:me,disabled:se,children:c==="result"?"Close":"Cancel"}),c==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void te(),disabled:F||(r==="directory"?N.length===0:r==="browse"?!D:!p.trim()),children:F?e.jsxs(e.Fragment,{children:[e.jsx(tt,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),c==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void we(),disabled:se||O===0&&H===0,children:se?e.jsxs(e.Fragment,{children:[e.jsx(tt,{size:14,className:"spin"}),ne]}):`Import ${Ae}`})]})]})}):null}const ia=n.lazy(()=>vn(()=>import("./AgentDetailView-17J-F0Rl.js").then(s=>s.A),__vite__mapDeps([0,1,2,3,4,5,6,7])).then(s=>({default:s.AgentDetailView}))),Ue=[{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:"✦"}],ot=[.1,.25,.5,1,2,3,5,10],ra=/(?:^|\/)skills\/([^/]+)\/SKILL\.md$/i;function Et(s){const o=s.trim();if(!o)return s;const k=o.match(ra);return k?.[1]?k[1]:o}function Je(s){switch(s){case"running":return"agent-badge--running";case"active":return"agent-badge--active";case"paused":return"agent-badge--paused";case"error":return"agent-badge--error";case"terminated":return"agent-badge--terminated";case"idle":default:return"agent-badge--idle"}}function ut(s,o){switch(o){case"running":return`${s}--running`;case"active":return`${s}--active`;case"paused":return`${s}--paused`;case"error":return`${s}--error`;case"terminated":return`${s}--terminated`;case"idle":default:return`${s}--idle`}}function Tt({node:s,onSelect:o,getHealthStatus:k,getRoleIcon:u,getSkillBadges:c,selectedAgentId:g}){const{agent:r,children:d}=s,p=k(r),v=Je(r.state),N=ut("org-chart-node-card",r.state);return e.jsxs("div",{className:`org-chart-node${d.length>0?" org-chart-node--has-children":""}`,children:[e.jsxs("div",{className:`${N}${g===r.id?" agent-card--selected":""}`,onClick:()=>o(r.id),role:"button",tabIndex:0,onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.key===" "&&y.preventDefault(),o(r.id))},children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:u(r.role)}),e.jsx("span",{className:"org-chart-node__name",children:r.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${v}`,children:r.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:p.color},title:p.reason??p.label,children:[p.icon,!p.stateDerived&&e.jsx("span",{className:"text-secondary",children:p.label})]}),(()=>{const y=c(r);if(y.length===0)return null;const I=y.slice(0,2),f=y.length-2;return e.jsxs(e.Fragment,{children:[I.map(E=>e.jsx("span",{className:"org-chart-node__skill",children:Et(E)},E)),f>0&&e.jsxs("span",{className:"org-chart-node__skill",children:["+",f]})]})})()]})]}),d.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${r.name} employees`,children:d.map(y=>e.jsx(Tt,{node:y,onSelect:o,getHealthStatus:k,getRoleIcon:u,getSkillBadges:c,selectedAgentId:g},y.agent.id))})]})}function ha({addToast:s,projectId:o,onOpenTaskLogs:k,agentOnboardingEnabled:u=!1}){const[c,g]=n.useState(!1),d=Zt()==="mobile",[p,v]=n.useState("all"),{agents:N,stats:y,isLoading:I,loadAgents:f}=Xt(o,{filterState:p,showSystemAgents:c}),[E,R]=n.useState(!1),[$,j]=n.useState(!1),[T,h]=n.useState(null),[M,K]=n.useState(!1),[F,Z]=n.useState(null),se=d&&!!F,[G,ie]=n.useState("dashboard"),[z,m]=n.useState(null),[A,Y]=n.useState(!1),[P,Q]=n.useState(()=>{if(typeof window>"u")return"list";const t=vt("fn-agent-view",o);return t==="list"||t==="board"||t==="org"?t:"list"}),[re,pe]=n.useState([]),[ce,ee]=n.useState(!1),[de,D]=n.useState(!1),[ge,oe]=n.useState(!1),ue=n.useRef(null),{confirm:Ie}=Yt(),X=n.useRef(null),he=n.useId();n.useEffect(()=>{const t=vt("fn-agent-view",o);if(t==="list"||t==="board"||t==="org"){Q(t);return}Q("list")},[o]),n.useEffect(()=>{en("fn-agent-view",P,o)},[P,o]);const[be,le]=n.useState(null),me=n.useRef(null),[Ce,B]=n.useState(null),[ye,te]=n.useState(null),[we,O]=n.useState({}),[H,Se]=n.useState(1),[ve,Ae]=n.useState(!1),[ne,Pe]=n.useState(new Set),[je,i]=n.useState(new Map),b=n.useRef(!0);n.useEffect(()=>(b.current=!0,()=>{b.current=!1}),[]),n.useEffect(()=>{tn(o).then(t=>{b.current&&Se(t.heartbeatMultiplier??1)}).catch(()=>{})},[o]);const _=n.useCallback(async t=>{const l=Number.isFinite(t)&&t>0?t:1;Se(l),Ae(!0);try{await nn({heartbeatMultiplier:l},o),s(`Heartbeat speed set to ×${l.toFixed(1)}`,"success")}catch(w){s(`Failed to save heartbeat multiplier: ${xe(w)}`,"error")}finally{b.current&&Ae(!1)}},[o,s]),U=n.useMemo(()=>je.size===0?N:N.map(t=>{const l=je.get(t.id);return l?{...t,state:l}:t}),[N,je]),q=n.useMemo(()=>U.filter(t=>c||!at(t)),[U,c]),J=n.useMemo(()=>U.filter(t=>t.state!=="active"&&t.state!=="running"?!1:c||!at(t)),[U,c]),_e=n.useMemo(()=>{if(c)return re;const t=l=>at(l.agent)?null:{...l,children:l.children.map(t).filter(w=>w!==null)};return re.map(t).filter(l=>l!==null)},[re,c]);n.useEffect(()=>{if(P!=="org")return;let t=!1;return ee(!0),an(o,{includeEphemeral:c}).then(l=>{t||pe(l)}).catch(l=>{t||(s(`Failed to load org chart: ${xe(l)}`,"error"),pe([]))}).finally(()=>{t||ee(!1)}),()=>{t=!0}},[P,o,c,s]),n.useEffect(()=>{const t=setInterval(()=>{f()},3e4);return()=>{clearInterval(t)}},[f]),n.useEffect(()=>{if(!de)return;const t=w=>{const S=w.target;S&&(ue.current?.contains(S)||X.current?.contains(S)||D(!1))},l=w=>{w.key==="Escape"&&(D(!1),X.current?.focus())};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",l)}},[de]);const W=async(t,l)=>{if(!ne.has(t)){Pe(w=>new Set(w).add(t)),i(w=>{const S=new Map(w);return S.set(t,l),S});try{await hn(t,l,o),s(`Agent state updated to ${l}`,"success"),await f(),i(w=>{const S=new Map(w);return S.delete(t),S})}catch(w){i(S=>{const V=new Map(S);return V.delete(t),V}),s(`Failed to update state: ${xe(w)}`,"error")}finally{Pe(w=>{const S=new Set(w);return S.delete(t),S})}}},Oe=async(t,l)=>{if(await Ie({title:"Delete Agent",message:`Delete agent "${l}"? This cannot be undone.`,danger:!0}))try{await bn(t,o),s(`Agent "${l}" deleted`,"success"),f()}catch(S){s(`Failed to delete agent: ${xe(S)}`,"error")}},He=async(t,l)=>{const w=N.find(S=>S.id===t);if(w){if(w.role===l){le(null);return}try{await Be(t,{role:l},o),s(`Agent role updated to ${Ue.find(S=>S.value===l)?.label??l}`,"success"),le(null),f()}catch(S){s(`Failed to update role: ${xe(S)}`,"error")}}},$e=(t,l)=>{t.key==="Escape"&&le(null)},Le=async(t,l)=>{ye===t.id&&(te(null),O(w=>{const S={...w};return delete S[t.id],S})),B(t.id);try{await Be(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:l}},o),s(`Heartbeat interval updated to ${st(l)} for ${t.name}`,"success"),f()}catch(w){s(`Failed to update heartbeat interval: ${xe(w)}`,"error")}finally{B(null)}},ze=async t=>{const l=we[t.id]??"";if(l.trim()===""){s("Please enter a heartbeat interval in minutes","error");return}const w=Number(l);if(isNaN(w)){s("Heartbeat interval must be a valid number","error");return}if(w<=0){s("Heartbeat interval must be greater than 0","error");return}if(w>=1&&w<5){B(t.id);try{await Be(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:gn}},o),s(`Heartbeat interval set to 5 minutes (minimum). ${w} minute${w!==1?"s":""} was below the 5-minute minimum.`,"success"),te(null),O(V=>{const Te={...V};return delete Te[t.id],Te}),f()}catch(V){s(`Failed to update heartbeat interval: ${xe(V)}`,"error")}finally{B(null)}return}const S=Math.round(w*6e4);B(t.id);try{await Be(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:S}},o),s(`Heartbeat interval updated to ${st(S)} for ${t.name}`,"success"),te(null),O(V=>{const Te={...V};return delete Te[t.id],Te}),f()}catch(V){s(`Failed to update heartbeat interval: ${xe(V)}`,"error")}finally{B(null)}},qe=t=>{const l=Ge(t.runtimeConfig?.heartbeatIntervalMs),w=Math.round(l/6e4);te(t.id),O(S=>({...S,[t.id]:String(w)}))},a=n.useCallback((t,l)=>{Z(t),ie(l?.initialTab??"dashboard"),m(l?.initialRunId??null),Y(l?.preferActiveRun??!1)},[]),C=n.useCallback(()=>{Z(null),ie("dashboard"),m(null),Y(!1)},[]),Ee=n.useCallback(t=>{a(t)},[a]),ke=n.useCallback(t=>{a(t),d&&oe(!1)},[d,a]),fe=async(t,l)=>{try{await pn(t,o,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),s(`Heartbeat run started for ${l}`,"success"),f()}catch(w){s(`Failed to start heartbeat run: ${xe(w)}`,"error")}},mt=t=>Ue.find(l=>l.value===t)?.label??t,Ze=t=>Ue.find(l=>l.value===t)?.icon??"◆",L=F?q.find(t=>t.id===F)??null:null,gt=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],Xe=t=>mn(t),Mt=I&&N.length===0,Ve=n.useCallback(()=>{if(u){j(!0);return}R(!0)},[u]);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(dt,{size:24}),e.jsx("h2",{children:"Agents"})]}),e.jsxs("div",{className:"agents-view-controls",children:[e.jsxs("div",{className:"view-toggle",children:[e.jsx("button",{className:`view-toggle-btn${P==="list"?" active":""}`,onClick:()=>Q("list"),title:"List view","aria-label":"List view","aria-pressed":P==="list",children:e.jsx(sn,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="board"?" active":""}`,onClick:()=>Q("board"),title:"Board view","aria-label":"Board view","aria-pressed":P==="board",children:e.jsx(Re,{size:16})}),e.jsx("button",{className:`view-toggle-btn${P==="org"?" active":""}`,onClick:()=>Q("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":P==="org",children:e.jsx(rn,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:X,className:`btn-icon agent-controls-trigger${de?" agent-controls-trigger--active":""}`,onClick:()=>D(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":de,"aria-controls":he,children:e.jsx(In,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void f(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Qe,{size:16,className:I?"spin":void 0})}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{Ve(),D(!1)},children:[e.jsx(ln,{size:16}),"New Agent"]})]})]})]}),de&&e.jsxs("div",{ref:ue,id:he,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsxs("div",{className:"agent-controls",children:[e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(on,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:p,onChange:t=>v(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"}),e.jsx("option",{value:"terminated",children:"Terminated"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:c,onChange:t=>g(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]}),e.jsx("div",{className:"agent-controls-actions",children:e.jsxs("button",{className:"btn",onClick:()=>{K(!0),D(!1)},children:[e.jsx(St,{size:16}),"Import"]})})]}),e.jsx("div",{className:"agent-global-controls",children:e.jsxs("div",{className:"heartbeat-multiplier-group",children:[e.jsxs("div",{className:"heartbeat-multiplier-controls",children:[e.jsx("label",{htmlFor:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-label",children:"Heartbeat Speed"}),e.jsx("input",{id:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-slider touch-target",type:"range",min:.1,max:10,step:.1,value:H,onChange:t=>{const l=Number(t.target.value);_(Number.isFinite(l)&&l>0?l:1)},disabled:ve}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",H.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(ot.reduce((t,l)=>Math.abs(l-H)<Math.abs(t-H)?l:t,ot[0])),onChange:t=>{const l=Number(t.target.value);_(Number.isFinite(l)&&l>0?l:1)},disabled:ve,"aria-label":"Heartbeat speed preset",children:ot.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(Cn,{agents:q})]}),e.jsx(Pn,{stats:y,activeAgents:J,projectId:o,isOpen:ge,onToggle:()=>oe(t=>!t),onSelectAgent:ke,onOpenTaskLogs:k}),e.jsxs("div",{className:"agents-split-layout",children:[e.jsxs("div",{className:`agents-split-sidebar${se?" agents-split-sidebar--hidden-mobile":""}`,children:[e.jsxs("div",{className:"agents-view-content",children:[e.jsx(ta,{isOpen:E,onClose:()=>{R(!1),h(null)},onCreated:()=>{R(!1),h(null),f()},projectId:o,prefillDraft:T}),e.jsx(na,{isOpen:$,onClose:()=>j(!1),onUseDraft:t=>{h(t),j(!1),R(!0)},projectId:o,existingAgents:N}),e.jsx(sa,{isOpen:M,onClose:()=>K(!1),onImported:()=>void f(),projectId:o}),Mt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Qe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):P==="org"?e.jsx("div",{className:"agent-org-chart","data-testid":"agent-org-chart",children:ce?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Qe,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):_e.length===0?e.jsx(rt,{onCtaClick:Ve}):_e.map(t=>e.jsx(Tt,{node:t,onSelect:a,getHealthStatus:Xe,getRoleIcon:Ze,getSkillBadges:gt,selectedAgentId:F},t.agent.id))}):P==="board"?e.jsx("div",{className:"agent-board",children:q.length===0?e.jsx(rt,{onCtaClick:Ve}):q.map(t=>{const l=Xe(t),w=Je(t.state),S=ut("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${S}${F===t.id?" agent-card--selected":""}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>a(t.id),role:"button",tabIndex:0,onKeyDown:V=>{(V.key==="Enter"||V.key===" ")&&(V.key===" "&&V.preventDefault(),a(t.id))},children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:Ze(t.role)}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:mt(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${w}`,children:t.state})]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:l.color},title:l.reason??l.label,children:[l.icon,!l.stateDerived&&` ${l.label}`]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:q.length===0?e.jsx(rt,{onCtaClick:Ve}):q.map(t=>{const l=Xe(t),w=Je(t.state),S=ut("agent-card",t.state),V=Ge(t.runtimeConfig?.heartbeatIntervalMs),Te=cn(V),De=Ce===t.id;return e.jsxs("div",{className:`agent-card ${S}${F===t.id?" agent-card--selected":""}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info agent-info--clickable",onClick:()=>a(t.id),role:"button",tabIndex:0,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(x.key===" "&&x.preventDefault(),a(t.id))},children:[be===t.id?e.jsx("select",{ref:me,className:"select agent-role-select",value:t.role,onChange:x=>void He(t.id,x.target.value),onKeyDown:x=>$e(x,t.id),onBlur:()=>le(null),autoFocus:!0,children:Ue.map(x=>e.jsxs("option",{value:x.value,children:[x.icon," ",x.label]},x.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:x=>{x.stopPropagation(),le(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(x.stopPropagation(),le(t.id))},children:Ze(t.role)}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(It,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${w}`,children:t.state}),e.jsxs("span",{className:"badge",style:{color:l.color},title:l.reason??l.label,children:[l.icon,!l.stateDerived&&` ${l.label}`]}),e.jsx("span",{className:"badge text-secondary",children:mt(t.role)}),(()=>{const x=gt(t);if(x.length===0)return null;const ae=x.slice(0,2),Me=x.length-2;return e.jsxs(e.Fragment,{children:[ae.map(Ye=>e.jsx("span",{className:"badge badge-skill",title:Ye,children:Et(Ye)},Ye)),Me>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",Me]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),ye===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:we[t.id]??"",onChange:x=>O(ae=>({...ae,[t.id]:x.target.value})),onKeyDown:x=>{x.key==="Enter"?ze(t):x.key==="Escape"&&(te(null),O(ae=>{const Me={...ae};return delete Me[t.id],Me}))},disabled:De,"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 ze(t),disabled:De,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>{te(null),O(x=>{const ae={...x};return delete ae[t.id],ae})},disabled:De,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:V,onChange:x=>{const ae=x.target.value;ae==="__custom__"?qe(t):Le(t,Number(ae))},disabled:De,"aria-label":`Set heartbeat interval for ${t.name}`,children:[Te.map(x=>e.jsx("option",{value:x.value,children:x.label},x.value)),dn.some(x=>x.value===V)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),De&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const x=new Date(t.lastHeartbeatAt),ae=new Date(x.getTime()+V),Me=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:x.toLocaleString(),children:["Last: ",x.toLocaleTimeString()]}),Me&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:ae.toLocaleString(),children:["Next: ",ae.toLocaleTimeString()]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[t.state==="idle"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"active"),disabled:ne.has(t.id),title:"Activate",children:[e.jsx(Ne,{size:14})," Start"]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void fe(t.id,t.name),disabled:ne.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(Re,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"paused"),disabled:ne.has(t.id),title:"Pause",children:[e.jsx(We,{size:14})," Pause"]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"active"),disabled:ne.has(t.id),title:"Resume",children:[e.jsx(Ne,{size:14})," Resume"]}),t.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>a(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(Re,{size:14})," Running"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"paused"),disabled:ne.has(t.id),title:"Pause",children:[e.jsx(We,{size:14})," Pause"]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"active"),disabled:ne.has(t.id),title:"Retry",children:[e.jsx(Ne,{size:14})," Retry"]}),t.state==="terminated"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void W(t.id,"active"),disabled:ne.has(t.id),title:"Start",children:[e.jsx(Ne,{size:14})," Start"]}),e.jsx("button",{className:"btn btn--sm agent-card-details-btn",onClick:()=>a(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:"View Details"}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void Oe(t.id,t.name),title:"Delete",children:[e.jsx(ft,{size:14})," Delete"]})]})]},t.id)})})]}),!d&&L&&e.jsxs("div",{className:"agents-sidebar-quick-controls",children:[e.jsxs("div",{className:"agents-sidebar-quick-controls__header",children:[e.jsx("strong",{children:L.name}),e.jsx("span",{className:`badge ${Je(L.state)}`,children:L.state})]}),e.jsxs("div",{className:"agents-sidebar-quick-controls__meta",children:[e.jsx("span",{children:st(Ge(L.runtimeConfig?.heartbeatIntervalMs))}),L.lastHeartbeatAt&&e.jsxs("span",{children:["Last ",yn(L.lastHeartbeatAt)]})]}),e.jsxs("div",{className:"agents-sidebar-quick-controls__actions",children:[L.state==="idle"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"active"),children:[e.jsx(Ne,{size:14})," Start"]}),L.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void fe(L.id,L.name),children:[e.jsx(Re,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"paused"),children:[e.jsx(We,{size:14})," Pause"]})]}),L.state==="running"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"paused"),children:[e.jsx(We,{size:14})," Pause"]}),L.state==="paused"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"active"),children:[e.jsx(Ne,{size:14})," Resume"]}),L.state==="error"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"active"),children:[e.jsx(Ne,{size:14})," Retry"]}),L.state==="terminated"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void W(L.id,"active"),children:[e.jsx(Ne,{size:14})," Start"]}),e.jsxs("button",{className:"btn btn-danger btn-sm",onClick:()=>void Oe(L.id,L.name),children:[e.jsx(ft,{size:14})," Delete"]})]})]})]})]}),e.jsxs("div",{className:`agents-split-detail${d&&!F?" agents-split-detail--hidden-mobile":""}`,children:[se&&e.jsx("div",{className:"agents-mobile-back-row",children:e.jsxs("button",{className:"btn agents-mobile-back-btn",onClick:C,children:[e.jsx(un,{size:16}),"Agents"]})}),F?e.jsx(n.Suspense,{fallback:null,children:e.jsx(ia,{inline:!0,agentId:F,projectId:o,onClose:C,addToast:s,onChildClick:Ee,initialTab:G,initialRunId:z,preferActiveRun:A})}):e.jsxs("div",{className:"agents-detail-empty-state",children:[e.jsx(dt,{size:48}),e.jsx("h3",{children:"Select an agent"}),e.jsx("p",{children:"Choose an agent from the sidebar to view details"})]})]})]})]})}export{ha as AgentsView,Et as formatAgentSkillBadgeLabel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as s,j as t}from"./vendor-react-K0fH_qHe.js";import{i as et,aT as Ht,y as Bt,aU as Gt,D as Vt,aV as Kt,aW as qt,aX as Xt,aY as Yt,aZ as Jt,a_ as Qt,s as Zt,a$ as es,w as ts,b0 as ss,u as ns,b1 as as,ae as pt,af as xt,S as is,_ as ot,O as Qe,ar as rs,a0 as ls,B as We,ab as vt,ac as wt,b2 as os,b3 as cs,b4 as ds,aK as us,b5 as hs,b6 as ms,b7 as ct,b8 as fs,h as gs,j as dt,l as ps}from"./index-k_85J1DS.js";import"./vendor-xterm-DzcZoU0P.js";const Ze="kb-chat-active-session";function xs(a){const i=typeof a=="string"?a.trim():"",r=i.indexOf("/");return!i||r<=0||r>=i.length-1?{}:{modelProvider:i.slice(0,r),modelId:i.slice(r+1)}}function vs(a){const i=a?.toolCalls;if(!Array.isArray(i))return;const r=i.map(c=>{if(!c||typeof c!="object")return null;const l=c,w=typeof l.toolName=="string"?l.toolName:"";if(!w)return null;const N=l.args;return{toolName:w,...N&&typeof N=="object"?{args:N}:{},isError:!!l.isError,result:l.result,status:"completed"}}).filter(c=>c!==null);return r.length>0?r:void 0}function ws(a){const i=a?.fallback;if(!i||typeof i!="object")return;const r=i,c=typeof r.primaryModel=="string"?r.primaryModel:"",l=typeof r.fallbackModel=="string"?r.fallbackModel:"",w=r.triggerPoint;if(!(!c||!l||w!=="session-creation"&&w!=="prompt-time"))return{primaryModel:c,fallbackModel:l,triggerPoint:w}}function ut(a){return{id:a.id,sessionId:a.sessionId,role:a.role,content:a.content,thinkingOutput:a.thinkingOutput,toolCalls:vs(a.metadata),fallbackInfo:ws(a.metadata),attachments:a.attachments,createdAt:a.createdAt}}function bs(a,i){const[r,c]=s.useState([]),[l,w]=s.useState(null),[N,$]=s.useState(!0),[L,b]=s.useState([]),[G,k]=s.useState(!1),[F,y]=s.useState(!1),[z,u]=s.useState(""),[C,S]=s.useState(""),[I,D]=s.useState([]),[O,Q]=s.useState(""),[U,W]=s.useState(""),[X,m]=s.useState(!0),[j,ce]=s.useState(new Map),p=s.useRef(null),se=s.useRef(!1),Y=s.useRef(""),J=s.useRef(null),Ce=s.useRef(r),Z=s.useRef(l),Me=s.useRef(F);Ce.current=r,Z.current=l,Me.current=F,s.useEffect(()=>{Y.current=O},[O]);const pe=s.useRef(new Set),de=s.useRef(0),$e=s.useRef(a);$e.current!==a&&($e.current=a,de.current++),s.useEffect(()=>{const h=de.current;et(void 0,a).then(x=>{if(de.current!==h)return;const f=new Map;for(const R of x)f.set(R.id,R);ce(f)}).catch(()=>{})},[a]);const ue=s.useCallback(async()=>{$(!0);try{const x=[...(await Ht(a)).sessions].sort((f,R)=>new Date(R.updatedAt).getTime()-new Date(f.updatedAt).getTime());c(x)}catch{}finally{$(!1)}},[a]);s.useEffect(()=>{ue()},[ue]);const re=s.useRef(()=>{});s.useEffect(()=>{if(N)return;const h=Bt(Ze,a);h&&r.find(f=>f.id===h)&&re.current(h)},[N,r,a]);const ee=s.useCallback(async(h,x)=>{k(!0);try{const f=await Gt(h,{limit:50,...x},a),R=f.messages.map(ut);x?.offset&&x.offset>0?b(_=>[...R,..._]):b(R),m(f.messages.length>=50)}catch{}finally{k(!1)}},[a]),he=s.useCallback(()=>{J.current?.(),J.current=null,Y.current="",Q(""),u(""),S(""),D([]),y(!1)},[]),le=s.useCallback((h,x)=>{p.current&&(p.current.close(),p.current=null);const f=x??r.find(R=>R.id===h);w(f||null),he(),m(!0),h?ee(h):b([]),f?.isGenerating&&(y(!0),u("")),h?Vt(Ze,h,a):Kt(Ze,a)},[r,ee,a,he]);re.current=le;const be=s.useCallback(async h=>{const x=await qt(h,a);p.current&&(p.current.close(),p.current=null);const f={id:x.session.id,title:x.session.title,agentId:x.session.agentId,status:x.session.status,modelProvider:x.session.modelProvider,modelId:x.session.modelId,createdAt:x.session.createdAt,updatedAt:x.session.updatedAt};return c(R=>R.some(_=>_.id===f.id)?R:[f,...R]),he(),le(f.id,f),b([]),f},[a,he,le]),xe=s.useCallback(async h=>{await Xt(h,{status:"archived"},a),c(x=>x.filter(f=>f.id!==h)),l?.id===h&&(w(null),b([]))},[l,a]),Se=s.useCallback(async h=>{l?.id===h&&p.current&&(p.current.close(),p.current=null),await Yt(h,a),c(x=>x.filter(f=>f.id!==h)),l?.id===h&&(w(null),b([]))},[l,a]),me=s.useCallback(async()=>{!l||!X||await ee(l.id,{offset:L.length})},[l,X,ee,L.length]),ne=s.useCallback(()=>{l&&(se.current=!0,J.current?.(),J.current=null,p.current?.close(),p.current=null,Jt(l.id,a).catch(()=>{}),y(!1),u(""),S(""),D([]))},[l,a]),fe=s.useCallback(()=>{Y.current="",Q("")},[]),ve=s.useCallback((h,x)=>{if(!l)return;if(F){Y.current=h,Q(h);return}se.current=!1,p.current&&(p.current.close(),p.current=null);const f=`temp-${Date.now()}`,R={id:f,sessionId:l.id,role:"user",content:h,createdAt:new Date().toISOString()};b(g=>[...g,R]),u(""),S(""),D([]),y(!0);let _="",oe="",K=[],ge,q=null,P=null;const E=()=>{q=null,u(_)},d=()=>{P=null,S(oe)},M=()=>{q!==null&&(cancelAnimationFrame(q),q=null),P!==null&&(cancelAnimationFrame(P),P=null)};J.current=M;const ae={onThinking:g=>{oe+=g,P===null&&(P=requestAnimationFrame(d))},onText:g=>{_+=g,q===null&&(q=requestAnimationFrame(E))},onToolStart:g=>{K=[...K,{toolName:g.toolName,args:g.args,isError:!1,status:"running"}],D(K)},onToolEnd:g=>{const T=[...K];for(let v=T.length-1;v>=0;v--){const V=T[v];if(V?.toolName===g.toolName&&V.status==="running"){T[v]={...V,status:"completed",isError:g.isError,result:g.result},K=T,D(T);return}}K=[...T,{toolName:g.toolName,isError:g.isError,result:g.result,status:"completed"}],D(K)},onFallback:g=>{ge=g;const T=xs(g.fallbackModel);c(v=>v.map(V=>V.id===l.id?{...V,...T}:V)),w(v=>v&&v.id===l.id?{...v,...T}:v),i?.(`Primary model unavailable. Switched to fallback ${g.fallbackModel}.`,"warning")},onDone:g=>{M();const T={id:g.messageId||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:_,thinkingOutput:oe,toolCalls:K.length>0?K:void 0,fallbackInfo:ge,createdAt:new Date().toISOString()};pe.current.add(T.id),b(V=>[...V,T]),u(""),S(""),D([]),y(!1),p.current=null,setTimeout(()=>{pe.current.delete(T.id)},1e3),ue();const v=Y.current.trim();v&&(Y.current="",Q(""),ve(v))},onError:g=>{if(M(),b(T=>T.filter(v=>v.id!==f)),u(""),S(""),D([]),y(!1),p.current=null,console.error("[useChat] Stream error:",g),i?.(typeof g=="string"&&g.trim()?g:"Failed to get response","error"),!se.current){const T=Y.current.trim();T&&(Y.current="",Q(""),ve(T))}}};p.current=Qt(l.id,h,ae,x,a)},[l,F,a,ue,i]),ke=U?r.filter(h=>h.title?.toLowerCase().includes(U.toLowerCase())||h.agentId.toLowerCase().includes(U.toLowerCase())):r;return s.useEffect(()=>{const h=de.current,x=a?`?projectId=${encodeURIComponent(a)}`:"",f=()=>de.current!==h,R=P=>{if(f())return;const E=JSON.parse(P.data);c(d=>d.some(M=>M.id===E.id)?d:[E,...d])},_=P=>{if(f())return;const E=JSON.parse(P.data);c(d=>[...d.map(ae=>ae.id===E.id?E:ae)]),Z.current?.id===E.id&&w(E)},oe=P=>{if(f())return;const{id:E}=JSON.parse(P.data);c(d=>d.filter(M=>M.id!==E)),Z.current?.id===E&&(w(null),b([]))},K=P=>{if(f())return;const E=JSON.parse(P.data),d=ut(E);if(!pe.current.has(d.id)){if(Z.current?.id===d.sessionId&&Me.current&&!p.current&&d.role==="assistant"){b(M=>M.some(ae=>ae.id===d.id)?M:[...M,d]),u(""),S(""),D([]),y(!1);return}Z.current?.id===d.sessionId&&!Me.current&&b(M=>M.some(ae=>ae.id===d.id)?M:[...M,d])}},ge=P=>{if(f())return;const{id:E}=JSON.parse(P.data);b(d=>d.filter(M=>M.id!==E))};return Zt(`/api/events${x}`,{events:{"chat:session:created":R,"chat:session:updated":_,"chat:session:deleted":oe,"chat:message:added":K,"chat:message:deleted":ge}})},[a]),s.useEffect(()=>()=>{p.current&&(p.current.close(),p.current=null)},[]),{sessions:r,activeSession:l,sessionsLoading:N,messages:L,messagesLoading:G,isStreaming:F,streamingText:z,streamingThinking:C,streamingToolCalls:I,pendingMessage:O,selectSession:le,createSession:be,archiveSession:xe,deleteSession:Se,sendMessage:ve,stopStreaming:ne,clearPendingMessage:fe,loadMoreMessages:me,hasMoreMessages:X,searchQuery:U,setSearchQuery:W,filteredSessions:ke,refreshSessions:ue,agentsMap:j}}function bt(a){const i=new Date(a),c=new Date().getTime()-i.getTime(),l=Math.floor(c/1e3),w=Math.floor(l/60),N=Math.floor(w/60),$=Math.floor(N/24);return l<60?"just now":w<60?`${w}m ago`:N<24?`${N}h ago`:$<7?`${$}d ago`:i.toLocaleDateString()}function ht(a,i){if(!a||!i)return null;const r=i.toLowerCase();if(r.includes("claude")){let l=i.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return l=l.replace(/\s+/g," "),l.length>30?l.slice(0,30)+"…":l}if(r.includes("gpt")||r.includes("openai")){const l=i.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return l.length>30?l.slice(0,30)+"…":l}if(r.includes("gemini")){const l=i.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}const c=i.replace(/-/g," ").replace(/^\w/,l=>l.toUpperCase()).replace(/\s+/g," ").trim();return c.length>30?c.slice(0,30)+"…":c}function Oe(a,i){return a.length<=i?a:`${a.slice(0,i)}…`}function Ss(a){if(!a)return null;const i=Object.entries(a);return i.length===0?null:i.map(([r,c])=>{const l=typeof c=="string"?c:(()=>{try{return JSON.stringify(c)}catch{return String(c)}})();return`${r}=${Oe(l,50)}`}).join(", ")}function ks(a){if(a===void 0)return null;if(typeof a=="string")return Oe(a,200);try{return Oe(JSON.stringify(a),200)}catch{return Oe(String(a),200)}}function St(a){if(!a||a.length===0)return null;const i=(k,F)=>{const y=k.status==="running",z=k.status==="completed"&&k.isError,u=Ss(k.args),C=ks(k.result),S=y?u:C?`result: ${C}`:u?`args: ${u}`:null,I=y?"running":z?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${y?" chat-tool-call--running":""}${z?" chat-tool-call--error":""}`,open:y,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",children:k.toolName}),S&&t.jsx("span",{className:"chat-tool-call-preview",title:S,children:S}),t.jsx("span",{className:"chat-tool-call-status-text",children:I})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[u&&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:u})]}),C&&t.jsxs("div",{className:`chat-tool-call-row${z?" 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:C})]})]})]},`${k.toolName}-${F}`)},r="chat-tool-calls";if(a.length===1)return t.jsxs("div",{className:r,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(ct,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),i(a[0],0)]});const c=a.filter(k=>k.status==="running").length,l=a.filter(k=>k.status==="completed"&&k.isError).length,w=c>0,N=Array.from(new Set(a.map(k=>k.toolName))),$=N.slice(0,5),L=Math.max(0,N.length-$.length),b=L>0?`${$.join(", ")}, +${L} more`:$.join(", "),G=w?`(${c} running)`:l>0?`(${l} ${l===1?"error":"errors"})`:null;return t.jsx("div",{className:r,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:w,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(ct,{size:12,"aria-hidden":"true"}),t.jsxs("span",{children:[a.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:b,children:b}),G&&t.jsx("span",{className:"chat-tool-calls-group-status",children:G})]}),a.map((k,F)=>i(k,F))]})})}const kt={pre:({children:a,...i})=>t.jsx("pre",{...i,className:"chat-markdown-pre",children:a}),table:({children:a,...i})=>t.jsx("table",{...i,className:"chat-markdown-table",children:a})},Ue="__fn_agent__",ys=280,Le=180,ze=500,mt="fusion:chat-sidebar-width",Ns=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function ft(a){const i=/(^|[\s])\/([^\s]*)$/.exec(a);if(!i)return null;const r=i[1]??"",c=i[2]??"",l=i.index+r.length;return{filter:c,start:l,end:a.length}}function js(a,i){const r=a.slice(0,i),c=/(^|[\s\n])@([\w-]*)$/.exec(r);if(!c)return null;const l=c[2]??"",w=r.length-l.length-1;return{filter:l,start:w,end:i}}function Cs({projectId:a,onClose:i,onCreate:r}){const[c,l]=s.useState("agent"),[w,N]=s.useState([]),[$,L]=s.useState(!0),[b,G]=s.useState(""),[k,F]=s.useState([]),[y,z]=s.useState(!0),[u,C]=s.useState(""),[S,I]=s.useState([]),[D,O]=s.useState([]);s.useEffect(()=>{let m=!1;return L(!0),et(void 0,a).then(j=>{m||N(j)}).catch(()=>{m||N([])}).finally(()=>{m||L(!1)}),()=>{m=!0}},[a]),s.useEffect(()=>{z(!0),gs().then(m=>{F(m.models),I(m.favoriteProviders),O(m.favoriteModels)}).catch(()=>{F([]),I([]),O([])}).finally(()=>{z(!1)})},[]);const Q=s.useCallback(async m=>{const j=S,p=j.includes(m)?j.filter(se=>se!==m):[m,...j];I(p);try{await dt({favoriteProviders:p,favoriteModels:D})}catch{I(j)}},[S,D]),U=s.useCallback(async m=>{const j=D,p=j.includes(m)?j.filter(se=>se!==m):[m,...j];O(p);try{await dt({favoriteProviders:S,favoriteModels:p})}catch{O(j)}},[D,S]),W=m=>{if(m.preventDefault(),c==="agent"){if(!b)return;r({agentId:b});return}if(!u)return;const j=u.indexOf("/");if(j<=0)return;const ce=u.slice(0,j),p=u.slice(j+1);r({agentId:Ue,modelProvider:ce,modelId:p})},X=c==="agent"?!b:!u;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:i,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:m=>m.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${c==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{l("agent"),C("")},children:"Agent"}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${c==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{l("model"),G("")},children:"Model"})]}),t.jsxs("form",{onSubmit:W,children:[c==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",$?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):w.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:w.map(m=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${b===m.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>G(m.id),"data-testid":`agent-option-${m.id}`,children:[t.jsx(We,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:m.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:m.role})]},m.id))})]}),c==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:y?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(ps,{models:k,value:u,onChange:C,label:"Model",placeholder:"Select a model",favoriteProviders:S,onToggleFavorite:Q,favoriteModels:D,onToggleModelFavorite:U})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:i,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:X,children:"Create"})]})]})]})})}const gt=s.memo(function({message:i,forcePlain:r,agentName:c,showAssistantModelTag:l,activeModelTag:w,activeSessionId:N,mentionAgentsByName:$,onToggleRender:L}){const b=i.role==="assistant",G=s.useMemo(()=>{if(b)return null;const y=i.content,z=/@([\w-]+)/g,u=[];let C=0,S=z.exec(y);for(;S;){const[I,D=""]=S,O=S.index;O>C&&u.push(y.slice(C,O));const Q=D.replace(/_/g," ").toLowerCase(),U=$.get(Q);U?u.push(t.jsxs("span",{className:"chat-mention-chip",children:["@",U.name.replace(/\s+/g,"_")]},`${U.id}-${O}`)):u.push(I),C=O+I.length,S=z.exec(y)}return C<y.length&&u.push(y.slice(C)),u.length===0?y:u},[b,i.content,$]),k=s.useMemo(()=>{const y=i.attachments;if(!y||y.length===0||!N)return null;const z=`/api/chat/sessions/${encodeURIComponent(N)}/attachments/`;return t.jsx("div",{className:"chat-message-attachments",children:y.map(u=>{const C=u.mimeType.startsWith("image/"),S=u.id||u.filename,I=`${z}${encodeURIComponent(u.filename)}`;return C?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:I,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:I,alt:u.originalName})},S):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:I,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(ms,{size:14}),t.jsx("span",{children:u.originalName})]},S)})})},[i.attachments,N]),F=s.useMemo(()=>b?r?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:i.content}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(pt,{remarkPlugins:[xt],components:kt,children:i.content})}):null,[b,r,i.content]);return t.jsxs("div",{className:`chat-message chat-message--${i.role}`,"data-testid":`chat-message-${i.id}`,children:[b&&t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(We,{size:14}),t.jsx("span",{children:c}),l&&w&&t.jsx("span",{className:"chat-model-tag",children:w}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${r?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":r?"Show rendered markdown":"Show plain text",onClick:()=>L(i.id),children:r?t.jsx(vt,{size:14}):t.jsx(wt,{size:14})})]}),b?F:t.jsx("div",{className:"chat-message-content",children:G}),St(i.toolCalls),i.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:i.thinkingOutput})]}),k,t.jsx("div",{className:"chat-message-time",children:bt(i.createdAt)})]})});function Rs({projectId:a,addToast:i}){const{activeSession:r,sessionsLoading:c,messages:l,messagesLoading:w,isStreaming:N,streamingText:$,streamingThinking:L,streamingToolCalls:b,selectSession:G,createSession:k,archiveSession:F,deleteSession:y,sendMessage:z,stopStreaming:u,pendingMessage:C,clearPendingMessage:S,searchQuery:I,setSearchQuery:D,filteredSessions:O}=bs(a,i),[Q,U]=s.useState(!1),[W,X]=s.useState(""),[m,j]=s.useState(null),[ce,p]=s.useState(null),[se,Y]=s.useState(!0),[J,Ce]=s.useState(ys),[Z,Me]=s.useState(new Map),[pe,de]=s.useState([]),[$e,ue]=s.useState(!0),[re,ee]=s.useState(!1),[he,le]=s.useState(""),[be,xe]=s.useState(0),[Se,me]=s.useState(""),[ne,fe]=s.useState(!1),[ve,ke]=s.useState(0),[h,x]=s.useState(-1),[f,R]=s.useState(()=>new Set),[_,oe]=s.useState([]),[K,ge]=s.useState(!1),[,q]=s.useState(!1),[P,E]=s.useState({top:0,left:0}),d=es({projectId:a}),M=s.useCallback(e=>{if(!e||!d.mentionActive)return;const n=e.getBoundingClientRect();E({top:n.top-260,left:n.left+8})},[d.mentionActive]),ae=s.useRef(null),g=s.useRef(null),T=s.useRef(null),v=s.useRef(null),V=s.useRef(!1),Pe=s.useRef(!1),tt=s.useRef(null),st=s.useRef([]),Te=s.useRef(0),H=ts()==="mobile";s.useEffect(()=>{try{const e=localStorage.getItem(mt);if(!e)return;const n=Number.parseInt(e,10);if(Number.isNaN(n))return;const o=Math.max(Le,Math.min(ze,n));Ce(o)}catch{}},[]);const{keyboardOverlap:He,viewportHeight:nt,viewportOffsetTop:yt,keyboardOpen:at}=ss({enabled:H&&!!r}),Nt=at?{"--keyboard-overlap":`${He}px`,"--vv-offset-top":`${yt}px`,...nt!==null?{"--vv-height":`${nt}px`}:{}}:{},te=s.useMemo(()=>{const e=he.trim().toLowerCase();return(e?pe.filter(o=>o.name.toLowerCase().includes(e)):pe).slice(0,10)},[pe,he]),ye=s.useMemo(()=>Array.from(Z.values()),[Z]),we=s.useMemo(()=>{const e=Se.trim().toLowerCase();return e?ye.filter(n=>n.name.toLowerCase().includes(e)):ye},[ye,Se]),it=s.useMemo(()=>{const e=new Map;for(const n of ye)e.set(n.name.toLowerCase(),n);return e},[ye]);s.useEffect(()=>{xe(0)},[te]),s.useEffect(()=>{ke(0)},[Se,ne]),s.useEffect(()=>()=>{g.current!==null&&window.clearTimeout(g.current)},[]),s.useEffect(()=>{const e=T.current;e&&(e.scrollTop=e.scrollHeight)},[l,$,L,N]),s.useEffect(()=>{if(He<=0)return;const e=T.current;e&&(e.scrollTop=e.scrollHeight)},[He]),ns(H&&at),s.useEffect(()=>{const e=()=>j(null);if(m)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[m]),s.useEffect(()=>{let e=!1;const n=a;return et(void 0,a).then(o=>{if(e||n!==a)return;const A=new Map;for(const B of o)A.set(B.id,B);Me(A)}).catch(()=>{}),()=>{e=!0}},[a]),s.useEffect(()=>{let e=!1;return ue(!0),as(a).then(n=>{e||de(n)}).catch(()=>{e||de([])}).finally(()=>{e||ue(!1)}),()=>{e=!0}},[a]),s.useEffect(()=>{st.current=_},[_]),s.useEffect(()=>()=>{for(const e of st.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl)},[]);const Ee=s.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const o of Array.from(e)){if(!Ns.includes(o.type))continue;const A=o.type.startsWith("image/");n.push({file:o,previewUrl:A?URL.createObjectURL(o):""})}n.length>0&&oe(o=>[...o,...n])},[]),jt=s.useCallback(e=>{oe(n=>{const o=n[e];return o?.previewUrl&&URL.revokeObjectURL(o.previewUrl),n.filter((A,B)=>B!==e)})},[]),Ct=s.useCallback(e=>{const n=e.clipboardData?.files;if(!n||n.length===0)return;const o=Array.from(n).filter(A=>A.type.startsWith("image/"));o.length!==0&&Ee(o)},[Ee]),Mt=s.useCallback(async e=>{try{await k(e),U(!1),H&&Y(!1)}catch{i("Failed to create chat session","error")}},[k,i,H]),Be=s.useCallback(()=>{X(""),ee(!1),le(""),fe(!1),me(""),x(-1),oe(e=>{for(const n of e)n.previewUrl&&URL.revokeObjectURL(n.previewUrl);return[]})},[]),Ae=s.useCallback(()=>{const e=W.trim(),n=_.map(o=>o.file);if(!(!e&&n.length===0||!r)){if(e==="/clear"){Be(),u(),S(),k({agentId:r.agentId,modelProvider:r.modelProvider??void 0,modelId:r.modelId??void 0}).catch(()=>{i("Failed to clear conversation","error")});return}Be(),z(e,n)}},[W,_,r,Be,u,S,k,i,z]),Fe=s.useCallback(()=>{if(typeof window>"u"||window.innerWidth>768)return;const e=v.current;if(!e||e.disabled)return;const n=window.scrollX,o=window.scrollY;e.focus({preventScroll:!0}),window.requestAnimationFrame(()=>{(window.scrollX!==n||window.scrollY!==o)&&window.scrollTo(n,o)})},[]),rt=s.useCallback(()=>{typeof window>"u"||window.innerWidth>768||(V.current=!0)},[]),Ge=s.useCallback(e=>{X(n=>{const o=ft(n);if(!o)return n;const A=`/skill:${e.name} `,B=n.slice(0,o.start)+A+n.slice(o.end);return window.requestAnimationFrame(()=>{v.current&&(v.current.style.height="auto",v.current.style.height=`${Math.min(v.current.scrollHeight,120)}px`,v.current.focus())}),B}),ee(!1),le(""),xe(0)},[]),Ve=s.useCallback(e=>{const n=v.current;if(!n||h<0)return;const o=n.selectionStart??Te.current,A=n.selectionEnd??o,B=Math.max(o,A),Re=Math.min(h,B),Ne=`${`@${e.name.replace(/\s+/g,"_")}`} `,Je=W.slice(0,Re)+Ne+W.slice(B),je=Re+Ne.length;X(Je),fe(!1),me(""),ke(0),x(-1),window.requestAnimationFrame(()=>{v.current&&(v.current.style.height="auto",v.current.style.height=`${Math.min(v.current.scrollHeight,120)}px`,v.current.focus(),v.current.setSelectionRange(je,je))})},[h,W]),Tt=s.useCallback(e=>{if(Te.current=e.currentTarget.selectionStart??Te.current,d.mentionActive&&d.files.length>0){if(d.handleKeyDown(e,W),e.key==="Enter"||e.key==="Tab"){const n=d.files[d.selectedIndex];if(n){const o=d.selectFile(n,W);X(o),d.dismissMention(),q(!1)}}return}if(ne&&e.key==="ArrowDown"){e.preventDefault(),we.length>0&&ke(n=>(n+1)%we.length);return}if(ne&&e.key==="ArrowUp"){e.preventDefault(),we.length>0&&ke(n=>n===0?we.length-1:n-1);return}if(ne&&e.key==="Enter"){e.preventDefault();const n=we[ve]??we[0];n&&Ve(n);return}if(ne&&e.key==="Escape"){e.preventDefault(),fe(!1),me(""),x(-1);return}if(re&&e.key==="ArrowDown"){e.preventDefault(),te.length>0&&xe(n=>(n+1)%te.length);return}if(re&&e.key==="ArrowUp"){e.preventDefault(),te.length>0&&xe(n=>n===0?te.length-1:n-1);return}if(re&&(e.key==="Enter"||e.key==="Tab")&&te.length>0){e.preventDefault();const n=te[be]??te[0];n&&Ge(n);return}if(re&&e.key==="Escape"){e.preventDefault(),ee(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Ae())},[ne,we,ve,Ve,re,te,be,Ge,Ae,d,W]),Ie=s.useCallback((e,n)=>{const o=js(e,n);if(o){fe(!0),me(o.filter),x(o.start);return}fe(!1),me(""),x(-1)},[]),At=s.useCallback(e=>{const n=e.target,o=n.value,A=n.selectionStart??o.length;Te.current=A,X(o);const B=ft(o);B?(ee(!0),le(B.filter)):(ee(!1),le("")),Ie(o,A),d.detectMention(o,A),q(d.mentionActive),d.mentionActive&&M(n),n.style.height="auto",n.style.height=`${Math.min(n.scrollHeight,120)}px`},[Ie]),Ke=s.useCallback(e=>{const n=e.currentTarget,o=n.selectionStart??n.value.length;Te.current=o,Ie(n.value,o),d.detectMention(n.value,o),q(d.mentionActive),d.mentionActive&&M(n)},[Ie,d,M]),Dt=s.useCallback(e=>{e.key!=="Escape"&&Ke(e)},[Ke]),Rt=s.useCallback(()=>{if(V.current){window.requestAnimationFrame(()=>{Fe()});return}g.current!==null&&window.clearTimeout(g.current),g.current=window.setTimeout(()=>{ee(!1),fe(!1),me(""),x(-1),q(!1),d.dismissMention(),g.current=null},120)},[d,Fe]),$t=s.useCallback(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null)},[]),Pt=s.useCallback(async e=>{j(null);try{await F(e),i("Conversation archived","success")}catch{i("Failed to archive conversation","error")}},[F,i]),Et=s.useCallback(async e=>{p(null),j(null);try{await y(e),i("Conversation deleted","success")}catch{i("Failed to delete conversation","error")}},[y,i]),De=s.useCallback(e=>{try{localStorage.setItem(mt,String(e))}catch{}},[]),Ft=s.useCallback(e=>{if(H)return;e.preventDefault(),e.stopPropagation();const n=e.currentTarget;typeof n.setPointerCapture=="function"&&n.setPointerCapture(e.pointerId);const o=e.clientX,A=J;let B=A;document.body.style.userSelect="none";const Re=Ne=>{const Je=Ne.clientX-o,je=Math.max(Le,Math.min(ze,A+Je));B=je,Ce(je),De(je)},Ye=Ne=>{typeof n.releasePointerCapture=="function"&&n.releasePointerCapture(Ne.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",Re),document.removeEventListener("pointerup",Ye),De(B)};document.addEventListener("pointermove",Re),document.addEventListener("pointerup",Ye)},[H,De,J]),It=s.useCallback(e=>{if(H||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const n=e.shiftKey?50:10,o=e.key==="ArrowLeft"?-n:n,A=Math.max(Le,Math.min(ze,J+o));Ce(A),De(A)},[H,De,J]),_t=s.useCallback(e=>{G(e),H&&Y(!1)},[G,H]),Lt=s.useCallback(()=>{G(""),Y(!0)},[G]),zt=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(fs,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>U(!0),children:[t.jsx(Qe,{size:16}),"New Chat"]})]}),ie=ht(r?.modelProvider,r?.modelId),lt=r?.agentId===Ue?ie??"Fusion":r?.title||Z.get(r?.agentId??"")?.name||r?.agentId||"Chat",Ot=!!(ie&&ie!==lt),_e=Z.get(r?.agentId??"")?.name||(r?.agentId===Ue?ie??"Fusion":r?.agentId?.slice(0,30)??"Fusion"),qe=!!(ie&&ie!==_e),Ut=C.length>50?`${C.slice(0,50)}…`:C,Xe=s.useCallback(e=>{R(n=>{const o=new Set(n);return o.has(e)?o.delete(e):o.add(e),o})},[]),Wt=s.useCallback((e,n=!1)=>n?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:e}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(pt,{remarkPlugins:[xt],components:kt,children:e})}),[]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${se?"":" chat-sidebar--hidden"}`,style:H?void 0:{width:`${J}px`},children:[t.jsx("div",{className:"chat-sidebar-search",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(is,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:I,onChange:e=>D(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:c?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):O.length===0?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):O.map(e=>t.jsxs("div",{className:`chat-session-item${r?.id===e.id?" chat-session-item--active":""}`,onClick:()=>_t(e.id),onContextMenu:n=>{n.preventDefault(),j({sessionId:e.id,x:n.clientX,y:n.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:n=>{n.stopPropagation(),p(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(ot,{size:14})}),t.jsx("div",{className:"chat-session-title",children:e.title||"Untitled"}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||"No messages"}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsx("span",{children:Z.get(e.agentId)?.name||(e.agentId===Ue?ht(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))}),t.jsx("span",{children:e.updatedAt?bt(e.updatedAt):""})]})]},e.id))}),t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>U(!0),"data-testid":"chat-new-btn",children:[t.jsx(Qe,{size:14}),"New Chat"]})})]}),!H&&se&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":Le,"aria-valuemax":ze,"aria-valuenow":J,"aria-label":"Resize chat sidebar",tabIndex:0,onPointerDown:Ft,onKeyDown:It}),m&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:m.y,left:m.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Pt(m.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(rs,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{j(null),p(m.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(ot,{size:14}),"Delete"]})]}),ce&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>p(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:()=>p(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Et(ce),children:"Delete"})]})]})}),t.jsxs("div",{className:"chat-thread",style:Nt,children:[(r||!H)&&t.jsxs("div",{className:"chat-thread-header",children:[H&&r&&t.jsx("button",{className:"btn-icon",onClick:Lt,"data-testid":"chat-back-btn",children:t.jsx(ls,{size:16})}),t.jsx(We,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:lt}),Ot&&t.jsx("span",{className:"chat-model-tag",children:ie}),!H&&t.jsxs("button",{className:"btn btn-sm btn-primary chat-thread-header-new-chat",onClick:()=>U(!0),"data-testid":"chat-thread-new-chat-btn",children:[t.jsx(Qe,{size:14}),"New Chat"]})]}),t.jsxs("div",{className:"chat-messages",ref:T,children:[N?t.jsxs(t.Fragment,{children:[l.map(e=>t.jsx(gt,{message:e,forcePlain:f.has(e.id),agentName:_e,showAssistantModelTag:qe,activeModelTag:ie,activeSessionId:r?.id??null,mentionAgentsByName:it,onToggleRender:Xe},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(We,{size:14}),t.jsx("span",{children:_e}),qe&&t.jsx("span",{className:"chat-model-tag",children:ie}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${f.has("__streaming__")?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":f.has("__streaming__")?"Show rendered markdown":"Show plain text",onClick:()=>Xe("__streaming__"),children:f.has("__streaming__")?t.jsx(vt,{size:14}):t.jsx(wt,{size:14})})]}),$?Wt($,f.has("__streaming__")):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:L?"Thinking…":"Connecting…"}),St(b),L&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:L})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):w?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):l.length===0&&!r?zt():l.length===0&&r?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):t.jsx(t.Fragment,{children:l.map(e=>t.jsx(gt,{message:e,forcePlain:f.has(e.id),agentName:_e,showAssistantModelTag:qe,activeModelTag:ie,activeSessionId:r?.id??null,mentionAgentsByName:it,onToggleRender:Xe},e.id))}),t.jsx("div",{ref:ae})]}),r&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:tt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{Ee(e.target.files),e.target.value=""}}),re&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:$e?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):te.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:he?"No skills found":"No skills available"}):te.map((e,n)=>t.jsxs("button",{type:"button",role:"option","aria-selected":n===be,className:`chat-skill-menu-item${n===be?" chat-skill-menu-item--highlighted":""}`,onMouseDown:o=>o.preventDefault(),onMouseEnter:()=>xe(n),onClick:()=>Ge(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))}),_.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:_.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>jt(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":"Attach files",onClick:()=>tt.current?.click(),children:t.jsx(os,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${K?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),ge(!0)},onDragLeave:()=>ge(!1),onDrop:e=>{e.preventDefault(),ge(!1),Ee(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:v,className:"chat-input-textarea",placeholder:"Type a message...",value:W,onChange:At,onKeyDown:Tt,onKeyUp:Dt,onClick:Ke,onBlur:Rt,onFocus:$t,onPaste:Ct,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(cs,{agents:ye,filter:Se,highlightedIndex:ve,visible:ne,onSelect:Ve,position:"below"}),t.jsx(ds,{visible:d.mentionActive&&!ne,position:P,files:d.files,selectedIndex:d.selectedIndex,onSelect:e=>{const n=d.selectFile(e,W);X(n),d.dismissMention(),q(!1),v.current?.focus()},loading:d.loading}),C&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${Ut}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:S,children:"×"})]})]}),N?t.jsx("button",{className:"chat-input-stop",onClick:u,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(us,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{typeof window>"u"||window.innerWidth>768||(e.preventDefault(),e.pointerType&&e.pointerType!=="mouse"&&(Pe.current=!0,rt(),Fe(),Ae(),window.setTimeout(()=>{V.current=!1},1500)))},onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||(e.preventDefault(),Pe.current=!0,rt(),Fe(),Ae(),window.setTimeout(()=>{V.current=!1},1500))},onMouseDown:e=>{typeof window>"u"||window.innerWidth>768||e.preventDefault()},onClick:()=>{if(Pe.current){Pe.current=!1;return}Ae()},disabled:!W.trim()&&_.length===0,"data-testid":"chat-send-btn",children:t.jsx(hs,{size:16})})]})]})]}),Q&&t.jsx(Cs,{projectId:a,onClose:()=>U(!1),onCreate:Mt})]})}export{Rs as ChatView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{bL as De,bM as de,bN as Ze,bO as ue,s as Ue,bP as ge,bQ as we,bR as xe,bS as ye,bT as et,bU as ae,bV as tt,bW as rt,bX as st,bY as nt,bZ as at,b_ as ie,L as ee,S as it,b$ as lt,c0 as ct,a as ot,c1 as Me,T as Ae,c2 as dt,W as ut,aK as vt,aL as mt,ac as ft,aq as pt,R as ht}from"./index-BlkXZ4C5.js";import"./vendor-xterm-DzcZoU0P.js";const ve=500,bt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function Pe(e){return e.length<=ve?e:e.slice(-ve)}function le(e,i){return Pe([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function Y(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function gt(e){return e?.previewUrl??null}async function Se(e){return tt(e)}async function Ne(e,i){return rt(e,i)}async function wt(e){return st(e)}async function xt(e){return nt(e)}async function je(e){return at(e)}function V(e){try{return e()}catch{return null}}function ce(){return typeof V(()=>de)=="function"&&typeof V(()=>De)=="function"}function q(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function yt(e){const[i,o]=r.useState(null),[b,y]=r.useState([]),[w,f]=r.useState([]),[k,U]=r.useState([]),[C,P]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,M]=r.useState(null),R=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-ve).map(Y);f(s)}},[]),A=r.useCallback(async()=>{const a=n.current;try{if(ce())if(d){const s=await De(d,e);if(n.current!==a)return;R(s)}else{const s=await de(e);if(n.current!==a)return;y(s),s.length>0&&(M(s[0].config.id),R(s[0]))}else{const s=await Se(e);if(n.current!==a)return;const c=q(s);y([c]),R(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[R,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),U([]),P(!0),u(null),M(null),(async()=>{try{const[c,l]=await Promise.allSettled([ce()?de(e):Se(e).then(N=>[q(N)]),typeof V(()=>ae)=="function"?ae(e):je(e).then(N=>N.map(g=>({name:g.name,command:g.command,cwd:g.cwd,scriptName:g.scriptName,packagePath:g.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const g=N[0];ce()&&M(g.config.id),R(g)}}else v=B(c.reason);l.status==="fulfilled"&&U(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&P(!1)}})()},[R,e]),r.useEffect(()=>{const a=d?Ze(d,e):typeof V(()=>ue)=="function"?ue(e):null;if(!a)return;const s=n.current,c=Ue(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(Y);f(Pe(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Y(v);f(g=>le(g,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Y(v);f(g=>le(g,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>le(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(g=>g&&{...g,status:N,runtime:v.pid?{...g.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:g.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=q(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&A()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,A,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{A()},bt);return()=>{clearInterval(a)}},[A,i?.status]);const _=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>ge)=="function")l=await ge(d,e);else{const v=await Ne({command:a,cwd:s},e);l=q(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>we)=="function")s=await we(d,e);else{const c=await wt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),j=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>xe)=="function")s=await xe(d,e);else{const c=await xt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),T=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>ye)=="function")c=await ye(d,a,e);else{const l=await et({url:a},e);c={url:l.manualUrl??l.previewUrl??l.detectedUrl??null,source:l.manualUrl?"manual":"auto"}}if(n.current!==s)return;o(l=>l?{...l,previewUrl:c.url??void 0}:null),u(null)}catch(c){if(n.current!==s)return;throw u(B(c)),c}},[e,d]),h=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;try{s=await ae(e)}catch{s=(await je(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;U(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e]),p=r.useCallback(async(a,s)=>{if(typeof a!="string"&&!d)try{const v=a,N=await Ne({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),g=q(N);o(g),y([g]),u(null);return}catch(v){throw u(B(v)),v}const c=typeof a=="string"?a:a.command,l=typeof a=="string"?s:a.cwd;await _(c,l)},[e,_,d]),E=r.useCallback(async()=>{await D()},[D]),L=r.useCallback(async()=>{await j()},[j]),z=r.useCallback(async a=>{await T(a)},[T]),F=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await A()},[A]),H=gt(i),x=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:b,logs:w,detectedCommands:k,previewUrl:H,isLoading:C,error:S,startServer:_,stopServer:D,restartServer:j,setPreviewUrl:T,detectCommands:h,refresh:A,candidates:k,serverState:x,loading:C,start:p,stop:E,restart:L,setManualUrl:z,detect:F,refreshStatus:O}}const ke=500,Ce=100;function Te(e){return e.length>ke?e.slice(-ke):e}function ze(e){return e==="stderr"?"stderr":"stdout"}function K(e){try{return JSON.parse(e.data)}catch{return null}}function Z(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:ze(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function St(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function oe(e,i){if(i.length===0)return e;const o=[...e],b=new Set(e.map(y=>y.id));for(const y of i)b.has(y.id)||(b.add(y.id),o.push(y));return o.sort((y,w)=>y.id-w.id),Te(o)}function Nt(e,i){const[o,b]=r.useState([]),[y,w]=r.useState(!1),[f,k]=r.useState(!1),[U,C]=r.useState(!1),[P,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),M=r.useRef(0),R=r.useRef(e),A=r.useRef(i),_=r.useRef(0),D=r.useRef(1);(R.current!==e||A.current!==i)&&(R.current=e,A.current=i,d.current++,n.current=!0,_.current=0,D.current=1,b([]),w(!1),k(!1),C(!1),S(null),u.current&&(u.current(),u.current=null)),r.useEffect(()=>{if(!i){u.current&&(u.current(),u.current=null);return}const E=d.current,L=++M.current;n.current=!1,w(!0);const z=(x,a)=>{const s=Te(x);b(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;_.current=c,D.current=c+1},F=x=>{if(n.current||d.current!==E||!x||typeof x!="object")return;const a=x.lines;if(!Array.isArray(a))return;if(a.length>0&&typeof a[0]=="string"){const c=a.filter(l=>typeof l=="string").map((l,v)=>St(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>Z(c,l+1));z(s,s.length)},O=x=>{if(n.current||d.current!==E)return;const a=typeof x.text=="string"?x.text:typeof x.line=="string"?x.line:null;if(!a)return;const s=D.current,c=typeof x.id=="number"&&Number.isFinite(x.id)?x.id:s,l={id:c,text:a,stream:ze(x.stream),timestamp:typeof x.timestamp=="string"?x.timestamp:""};_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1),b(v=>oe(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await ie({maxLines:Ce},e);if(n.current||d.current!==E||M.current!==L)return;const s=a.lines.map((c,l)=>Z(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==E||M.current!==L)return;z([],null)}finally{!n.current&&d.current===E&&M.current===L&&w(!1)}const x=ue(e);u.current=Ue(x,{events:{"dev-server:log":a=>{const s=K(a);s&&O(s)},log:a=>{const s=K(a);s&&O(s)},history:a=>{const s=K(a);F(s)},"dev-server:history":a=>{const s=K(a);F(s)}},onReconnect:()=>{n.current||d.current!==E||ie({lastEventId:_.current,maxLines:50},e).then(a=>{if(n.current||d.current!==E)return;const s=a.lines.map((c,l)=>Z(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1)}b(c=>oe(c,s)),S(a.totalLines)}).catch(()=>{})}})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const T=r.useCallback(async()=>{if(!i||f)return;const E=d.current,L=o.length;k(!0);try{const z=await ie({maxLines:Ce,offset:L},e);if(n.current||d.current!==E)return;const F=z.lines.map((O,H)=>Z(O,H+1));b(O=>oe(F,O)),C(z.totalLines>L+F.length),S(z.totalLines)}catch{}finally{k(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{b([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:U,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const jt="This preview appears to block iframe embedding. Open it in a new tab instead.",kt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Ct="Preview is taking longer than expected and may block iframe embedding.";function Et(e){return e==="blocked"?jt:e==="error"?kt:null}function Lt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:b=null}=i,y=r.useRef(null),w=r.useRef(null),[f,k]=r.useState("unknown"),[U,C]=r.useState(null),[P]=r.useState(b),S=r.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),u=r.useCallback(j=>{k(j),C(Et(j))},[]),n=r.useCallback(()=>{k("blocked"),C(Ct)},[]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null);let j=!1;return queueMicrotask(()=>{j||(k("loading"),C(null))}),()=>{j=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const j=setTimeout(()=>{w.current=null,n()},o);return w.current=j,()=>{clearTimeout(j),w.current===j&&(w.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const j=y.current;if(!j){u("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),M=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null)},[S]);const R=r.useCallback(()=>{S(),k("unknown"),C(null)},[S]),A=R,_=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:_,isBlocked:D,blockReason:U,detectionMethod:P,iframeRef:y,resetEmbedStatus:R,setEmbedStatus:u,retry:A,embedContext:U,handleIframeLoad:d,handleIframeError:M}}const Rt=/\x1b\[[0-9;]*m/g;function me(e){return e.replace(Rt,"")}function _t(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Dt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ut(e){if(e.stream==="stderr")return"error";const i=me(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Mt(e,i){if(!i)return e;const o=new RegExp(`(${Dt(i)})`,"ig"),b=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:b.map((w,f)=>w.toLowerCase()===y?t.jsx("mark",{children:w},`${w}-${f}`):t.jsx("span",{children:w},`${w}-${f}`))})}function At({entries:e,loading:i,loadingMore:o,hasMore:b,total:y,onLoadMore:w,isRunning:f}){const k=r.useRef(null),U=r.useRef(e.length),C=r.useRef(f),[P,S]=r.useState(!1),[u,n]=r.useState(!1),[d,M]=r.useState(""),[R,A]=r.useState("all"),_=r.useMemo(()=>R==="all"?e:e.filter(p=>Ut(p)===R),[e,R]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?_.filter(E=>me(E.text).toLowerCase().includes(p)):_},[_,d]),j=D.length,T=r.useCallback(()=>{const p=k.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,E=U.current,L=e.length>E;f&&(!p||!u&&L)&&T(),C.current=f,U.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=k.current;if(!p)return;const L=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!L)},[]);return r.useEffect(()=>{i||e.length===0||!u&&f&&T()},[e,f,u,i,T]),i&&e.length===0?t.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:t.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[t.jsx(ee,{size:16,className:"devserver-log-viewer__spinner"}),t.jsx("span",{children:"Loading logs…"})]})}):t.jsxs("section",{className:`devserver-log-viewer${P?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[t.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[t.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[t.jsx("span",{className:"devserver-log-viewer__title",children:"Logs"}),t.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[y!==null?`${e.length}/${y}`:`${e.length}`," lines"]})]}),t.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[t.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[t.jsx("span",{className:"visually-hidden",children:"Filter logs by severity"}),t.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:R,onChange:p=>A(p.target.value),"data-testid":"devserver-log-severity-filter","aria-label":"Filter logs by severity",children:[t.jsx("option",{value:"all",children:"All severities"}),t.jsx("option",{value:"info",children:"Info"}),t.jsx("option",{value:"warn",children:"Warn"}),t.jsx("option",{value:"error",children:"Error"})]})]}),t.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[t.jsx("span",{className:"visually-hidden",children:"Search logs"}),t.jsx(it,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>M(p.target.value),placeholder:"Search logs","data-testid":"devserver-log-search-input","aria-label":"Search logs"})]}),d.trim().length>0&&t.jsxs("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:[j," match",j===1?"":"es"]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>S(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":P?"Exit fullscreen logs":"Enter fullscreen logs",children:P?t.jsx(lt,{size:14}):t.jsx(ct,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[b&&t.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:t.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:w,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(ee,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:h,"data-testid":"devserver-log-content",children:[!i&&D.length===0&&t.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?"No logs yet. Start the dev server to see output.":_.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const E=me(p.text),L=_t(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[L&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:L}),p.stream==="stderr"&&t.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:"ERR"}),t.jsx("span",{className:"devserver-log-text",children:Mt(E,d.trim())})]},p.id)})]}),u&&f&&t.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:T,"data-testid":"devserver-log-jump-button",children:[t.jsx(ot,{size:14}),"New logs"]})]})]})}const Pt="devserver-preview-iframe";function Tt({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:b,blockReason:y,onRetry:w,className:f=Pt,embedContext:k}){const U=y??k??null,[C,P]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(P(d=>d+1),o("loading"))},[i,o,e]);const S=r.useCallback(()=>{const d=b.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[b,o]),u=r.useCallback(d=>{d.stopPropagation(),o("error")},[o]),n=r.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?t.jsxs("div",{className:"devserver-preview-iframe-shell",children:[t.jsx("iframe",{src:e,ref:b,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:S,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${C}`),i==="loading"&&t.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading preview..."})]}),i==="blocked"&&t.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Preview cannot be embedded"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Unable to load preview"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]})]}):null}const Ee={stopped:{className:"dev-server-status-badge--stopped",label:"Stopped"},starting:{className:"dev-server-status-badge--starting",label:"Starting..."},running:{className:"dev-server-status-badge--running",label:"Running"},stopping:{className:"dev-server-status-badge--starting",label:"Stopping..."},failed:{className:"dev-server-status-badge--failed",label:"Failed"}};function Le(e){return e instanceof Error?e.message:String(e)}function $e(e){return e==="."?"root":e}function Re(e){return e?e==="root"?".":e:null}function _e(e,i,o){return!i||e.scriptName!==i?!1:o?$e(e.cwd)===o:!0}function zt(e){return e.cwd==="."?"root":e.cwd}function $t(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Ht({addToast:e,projectId:i}){const{session:o,detectedCommands:b,previewUrl:y,isLoading:w,error:f,startServer:k,stopServer:U,restartServer:C,setPreviewUrl:P,detectCommands:S,refresh:u}=yt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",M=Ee[n]??Ee.stopped,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,loadMore:T}=Nt(i,!!i),h=y,p=o?.config?.cwd??null,[E,L]=r.useState(!0),[z,F]=r.useState(""),[O,H]=r.useState(""),[x,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:g,setEmbedStatus:Fe,resetEmbedStatus:I,iframeRef:X,isEmbedded:Oe,isBlocked:te,blockReason:re,retry:fe}=Lt(N),[pe,W]=r.useState(!1),he=r.useRef(g);r.useEffect(()=>{const m=he.current!==g;te&&m&&W(!0),g==="embedded"&&W(!1),he.current=g},[g,te]),r.useEffect(()=>{W(!1)},[h]);const J=r.useMemo(()=>{if(!x)return null;const m=Re(p);return b.find($=>!($.scriptName!==x||m&&$.cwd!==m||o?.config?.command&&$.command!==o.config.command))??b.find($=>_e($,x,p))??null},[b,o?.config?.command,x,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(Le(m),"error")})},[e,S]),r.useEffect(()=>{if(x){L(!1);return}L(!0)},[x]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&F(o.config.command);return}if(J){F(J.command);return}b.length>0&&F(m=>m.trim().length>0?m:b[0]?.command??"")},[b,J,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const se=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),be=r.useCallback(()=>{W(!1),fe()},[fe]),Be=r.useCallback(()=>{try{const m=X.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),I();return}}catch{}if(!(!h||!X.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),X.current.src=m.toString(),W(!1),I()}catch{X.current.src=h,W(!1),I()}},[h,X,I]),Q=r.useCallback(async(m,$,ne)=>{c(m);try{await $(),e(ne,"success")}catch(Ke){e(Le(Ke),"error")}finally{c(null)}},[e]),He=r.useCallback(m=>{a(m.scriptName),L(!1),F(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),Ve=r.useCallback(()=>{a(null),L(!0),e("Cleared selected dev server script.","success")},[e]),We=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const $=Re(p)??".",ne=J?.cwd??$;Q("start",()=>k(m,ne),"Dev server started.")},qe=()=>{Q("stop",U,"Dev server stopped.")},Xe=()=>{Q("restart",C,"Dev server restarted.")},Ge=()=>{const m=O.trim(),$=m.length>0?m:null;Q("preview",()=>P($),$?"Preview URL updated.":"Preview URL override cleared.")},Ie=r.useCallback(()=>{f&&u()},[f,u]),Je=n==="starting"||n==="running"||s!==null,Qe=n==="stopped"||s!==null,Ye=n==="stopped"||n==="starting"||s!==null;return t.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[t.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[t.jsxs("div",{className:"dev-server-header-title",children:[t.jsx(dt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${M.className}`,"data-testid":"dev-server-status-badge",children:M.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:We,disabled:Je,"data-testid":"dev-server-start-button",children:[t.jsx(ut,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:qe,disabled:Qe,"data-testid":"dev-server-stop-button",children:[t.jsx(vt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Xe,disabled:Ye,"data-testid":"dev-server-restart-button",children:[t.jsx(mt,{size:14}),t.jsx("span",{children:s==="restart"?"Restarting...":"Restart"})]})]})]}),t.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Configuration"}),w&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),w&&!o&&b.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading dev server configuration..."})]}),f&&t.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[t.jsx("p",{children:f}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ie,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),x&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:x}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ve,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),E&&b.length===0&&t.jsxs("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:["No dev server scripts detected. Check that your project has a ",t.jsx("code",{children:"package.json"})," with a ",t.jsx("code",{children:"dev"}),", ",t.jsx("code",{children:"start"}),", or similar script."]}),E&&b.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:b.map(m=>{const $=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${$?"dev-server-candidate--selected":""}`,onClick:()=>He(m),"data-testid":`dev-server-candidate-${m.scriptName}-${$e(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:$t(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:zt(m)})]},`${m.cwd}::${m.scriptName}::${m.command}`)})})]}),t.jsxs("div",{className:"dev-server-field-group",children:[t.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:"Command"}),t.jsx("input",{id:"dev-server-command",className:"input",value:z,onChange:m=>F(m.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:n==="running"||n==="starting"})]}),(n==="running"||n==="starting")&&o&&t.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[t.jsx("span",{className:"dev-server-label",children:"Running command"}),t.jsx("code",{children:o.config?.command??z})]}),t.jsxs("div",{className:"dev-server-preview-override",children:[t.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:"Preview URL Override"}),t.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:O,onChange:m=>H(m.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ge,disabled:s==="preview","data-testid":"dev-server-set-preview",children:"Save"})]}),h&&t.jsxs("p",{className:"dev-server-preview-hint",children:["Auto-detected: ",h]})]}),t.jsx("div",{className:"dev-server-content",children:t.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Logs"}),t.jsxs("span",{className:"dev-server-muted",children:[j??R.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(At,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,onLoadMore:T,isRunning:d})})]})}),t.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[t.jsxs("div",{className:"devserver-preview-header",children:[t.jsxs("div",{className:"devserver-preview-title",children:[t.jsx(ft,{size:14}),t.jsx("span",{children:"Preview"})]}),t.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:h??"No preview URL","data-testid":"devserver-preview-url-badge",children:["Auto",h?` · ${h}`:" · Not available"]}),t.jsxs("div",{className:"devserver-preview-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(m=>m==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:l==="embedded"?"External only":"Embedded"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Open in new tab",onClick:se,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(pt,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Be,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(ht,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":g,"data-embedded":Oe?"true":"false",children:[!h&&!d&&t.jsx("p",{className:"devserver-preview-empty",children:"Start a dev server to see a live preview here."}),!h&&d&&t.jsx("p",{className:"devserver-preview-empty",children:"No preview URL detected. Start the dev server or set a manual URL to preview your app."}),h&&l==="external"&&t.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[t.jsx("p",{children:"Embedded preview is disabled. Open your app in a separate browser tab."}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:se,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&pe&&te&&t.jsxs("div",{className:g==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[g==="error"?t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:g==="error"?"Preview failed":"Preview blocked"}),re&&t.jsx("p",{className:"devserver-preview-blocked-context",children:re})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"Open the preview in a new tab, or retry embedded mode after checking your server settings."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:se,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:be,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!pe&&t.jsx(Tt,{url:h,embedStatus:g,onEmbedStatusChange:Fe,iframeRef:X,blockReason:re,onRetry:be})]})]})]})}export{Ht as DevServerView};
|
|
1
|
+
import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{bL as De,bM as de,bN as Ze,bO as ue,s as Ue,bP as ge,bQ as we,bR as xe,bS as ye,bT as et,bU as ae,bV as tt,bW as rt,bX as st,bY as nt,bZ as at,b_ as ie,L as ee,S as it,b$ as lt,c0 as ct,a as ot,c1 as Me,T as Ae,c2 as dt,W as ut,aK as vt,aL as mt,ac as ft,aq as pt,R as ht}from"./index-k_85J1DS.js";import"./vendor-xterm-DzcZoU0P.js";const ve=500,bt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function Pe(e){return e.length<=ve?e:e.slice(-ve)}function le(e,i){return Pe([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function Y(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function gt(e){return e?.previewUrl??null}async function Se(e){return tt(e)}async function Ne(e,i){return rt(e,i)}async function wt(e){return st(e)}async function xt(e){return nt(e)}async function je(e){return at(e)}function V(e){try{return e()}catch{return null}}function ce(){return typeof V(()=>de)=="function"&&typeof V(()=>De)=="function"}function q(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function yt(e){const[i,o]=r.useState(null),[b,y]=r.useState([]),[w,f]=r.useState([]),[k,U]=r.useState([]),[C,P]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,M]=r.useState(null),R=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-ve).map(Y);f(s)}},[]),A=r.useCallback(async()=>{const a=n.current;try{if(ce())if(d){const s=await De(d,e);if(n.current!==a)return;R(s)}else{const s=await de(e);if(n.current!==a)return;y(s),s.length>0&&(M(s[0].config.id),R(s[0]))}else{const s=await Se(e);if(n.current!==a)return;const c=q(s);y([c]),R(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[R,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),U([]),P(!0),u(null),M(null),(async()=>{try{const[c,l]=await Promise.allSettled([ce()?de(e):Se(e).then(N=>[q(N)]),typeof V(()=>ae)=="function"?ae(e):je(e).then(N=>N.map(g=>({name:g.name,command:g.command,cwd:g.cwd,scriptName:g.scriptName,packagePath:g.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const g=N[0];ce()&&M(g.config.id),R(g)}}else v=B(c.reason);l.status==="fulfilled"&&U(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&P(!1)}})()},[R,e]),r.useEffect(()=>{const a=d?Ze(d,e):typeof V(()=>ue)=="function"?ue(e):null;if(!a)return;const s=n.current,c=Ue(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(Y);f(Pe(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Y(v);f(g=>le(g,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Y(v);f(g=>le(g,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>le(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(g=>g&&{...g,status:N,runtime:v.pid?{...g.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:g.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=q(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&A()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,A,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{A()},bt);return()=>{clearInterval(a)}},[A,i?.status]);const _=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>ge)=="function")l=await ge(d,e);else{const v=await Ne({command:a,cwd:s},e);l=q(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>we)=="function")s=await we(d,e);else{const c=await wt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),j=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>xe)=="function")s=await xe(d,e);else{const c=await xt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),T=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>ye)=="function")c=await ye(d,a,e);else{const l=await et({url:a},e);c={url:l.manualUrl??l.previewUrl??l.detectedUrl??null,source:l.manualUrl?"manual":"auto"}}if(n.current!==s)return;o(l=>l?{...l,previewUrl:c.url??void 0}:null),u(null)}catch(c){if(n.current!==s)return;throw u(B(c)),c}},[e,d]),h=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;try{s=await ae(e)}catch{s=(await je(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;U(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e]),p=r.useCallback(async(a,s)=>{if(typeof a!="string"&&!d)try{const v=a,N=await Ne({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),g=q(N);o(g),y([g]),u(null);return}catch(v){throw u(B(v)),v}const c=typeof a=="string"?a:a.command,l=typeof a=="string"?s:a.cwd;await _(c,l)},[e,_,d]),E=r.useCallback(async()=>{await D()},[D]),L=r.useCallback(async()=>{await j()},[j]),z=r.useCallback(async a=>{await T(a)},[T]),F=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await A()},[A]),H=gt(i),x=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:b,logs:w,detectedCommands:k,previewUrl:H,isLoading:C,error:S,startServer:_,stopServer:D,restartServer:j,setPreviewUrl:T,detectCommands:h,refresh:A,candidates:k,serverState:x,loading:C,start:p,stop:E,restart:L,setManualUrl:z,detect:F,refreshStatus:O}}const ke=500,Ce=100;function Te(e){return e.length>ke?e.slice(-ke):e}function ze(e){return e==="stderr"?"stderr":"stdout"}function K(e){try{return JSON.parse(e.data)}catch{return null}}function Z(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:ze(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function St(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function oe(e,i){if(i.length===0)return e;const o=[...e],b=new Set(e.map(y=>y.id));for(const y of i)b.has(y.id)||(b.add(y.id),o.push(y));return o.sort((y,w)=>y.id-w.id),Te(o)}function Nt(e,i){const[o,b]=r.useState([]),[y,w]=r.useState(!1),[f,k]=r.useState(!1),[U,C]=r.useState(!1),[P,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),M=r.useRef(0),R=r.useRef(e),A=r.useRef(i),_=r.useRef(0),D=r.useRef(1);(R.current!==e||A.current!==i)&&(R.current=e,A.current=i,d.current++,n.current=!0,_.current=0,D.current=1,b([]),w(!1),k(!1),C(!1),S(null),u.current&&(u.current(),u.current=null)),r.useEffect(()=>{if(!i){u.current&&(u.current(),u.current=null);return}const E=d.current,L=++M.current;n.current=!1,w(!0);const z=(x,a)=>{const s=Te(x);b(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;_.current=c,D.current=c+1},F=x=>{if(n.current||d.current!==E||!x||typeof x!="object")return;const a=x.lines;if(!Array.isArray(a))return;if(a.length>0&&typeof a[0]=="string"){const c=a.filter(l=>typeof l=="string").map((l,v)=>St(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>Z(c,l+1));z(s,s.length)},O=x=>{if(n.current||d.current!==E)return;const a=typeof x.text=="string"?x.text:typeof x.line=="string"?x.line:null;if(!a)return;const s=D.current,c=typeof x.id=="number"&&Number.isFinite(x.id)?x.id:s,l={id:c,text:a,stream:ze(x.stream),timestamp:typeof x.timestamp=="string"?x.timestamp:""};_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1),b(v=>oe(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await ie({maxLines:Ce},e);if(n.current||d.current!==E||M.current!==L)return;const s=a.lines.map((c,l)=>Z(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==E||M.current!==L)return;z([],null)}finally{!n.current&&d.current===E&&M.current===L&&w(!1)}const x=ue(e);u.current=Ue(x,{events:{"dev-server:log":a=>{const s=K(a);s&&O(s)},log:a=>{const s=K(a);s&&O(s)},history:a=>{const s=K(a);F(s)},"dev-server:history":a=>{const s=K(a);F(s)}},onReconnect:()=>{n.current||d.current!==E||ie({lastEventId:_.current,maxLines:50},e).then(a=>{if(n.current||d.current!==E)return;const s=a.lines.map((c,l)=>Z(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1)}b(c=>oe(c,s)),S(a.totalLines)}).catch(()=>{})}})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const T=r.useCallback(async()=>{if(!i||f)return;const E=d.current,L=o.length;k(!0);try{const z=await ie({maxLines:Ce,offset:L},e);if(n.current||d.current!==E)return;const F=z.lines.map((O,H)=>Z(O,H+1));b(O=>oe(F,O)),C(z.totalLines>L+F.length),S(z.totalLines)}catch{}finally{k(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{b([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:U,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const jt="This preview appears to block iframe embedding. Open it in a new tab instead.",kt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Ct="Preview is taking longer than expected and may block iframe embedding.";function Et(e){return e==="blocked"?jt:e==="error"?kt:null}function Lt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:b=null}=i,y=r.useRef(null),w=r.useRef(null),[f,k]=r.useState("unknown"),[U,C]=r.useState(null),[P]=r.useState(b),S=r.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),u=r.useCallback(j=>{k(j),C(Et(j))},[]),n=r.useCallback(()=>{k("blocked"),C(Ct)},[]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null);let j=!1;return queueMicrotask(()=>{j||(k("loading"),C(null))}),()=>{j=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const j=setTimeout(()=>{w.current=null,n()},o);return w.current=j,()=>{clearTimeout(j),w.current===j&&(w.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const j=y.current;if(!j){u("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),M=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null)},[S]);const R=r.useCallback(()=>{S(),k("unknown"),C(null)},[S]),A=R,_=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:_,isBlocked:D,blockReason:U,detectionMethod:P,iframeRef:y,resetEmbedStatus:R,setEmbedStatus:u,retry:A,embedContext:U,handleIframeLoad:d,handleIframeError:M}}const Rt=/\x1b\[[0-9;]*m/g;function me(e){return e.replace(Rt,"")}function _t(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Dt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ut(e){if(e.stream==="stderr")return"error";const i=me(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Mt(e,i){if(!i)return e;const o=new RegExp(`(${Dt(i)})`,"ig"),b=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:b.map((w,f)=>w.toLowerCase()===y?t.jsx("mark",{children:w},`${w}-${f}`):t.jsx("span",{children:w},`${w}-${f}`))})}function At({entries:e,loading:i,loadingMore:o,hasMore:b,total:y,onLoadMore:w,isRunning:f}){const k=r.useRef(null),U=r.useRef(e.length),C=r.useRef(f),[P,S]=r.useState(!1),[u,n]=r.useState(!1),[d,M]=r.useState(""),[R,A]=r.useState("all"),_=r.useMemo(()=>R==="all"?e:e.filter(p=>Ut(p)===R),[e,R]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?_.filter(E=>me(E.text).toLowerCase().includes(p)):_},[_,d]),j=D.length,T=r.useCallback(()=>{const p=k.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,E=U.current,L=e.length>E;f&&(!p||!u&&L)&&T(),C.current=f,U.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=k.current;if(!p)return;const L=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!L)},[]);return r.useEffect(()=>{i||e.length===0||!u&&f&&T()},[e,f,u,i,T]),i&&e.length===0?t.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:t.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[t.jsx(ee,{size:16,className:"devserver-log-viewer__spinner"}),t.jsx("span",{children:"Loading logs…"})]})}):t.jsxs("section",{className:`devserver-log-viewer${P?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[t.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[t.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[t.jsx("span",{className:"devserver-log-viewer__title",children:"Logs"}),t.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[y!==null?`${e.length}/${y}`:`${e.length}`," lines"]})]}),t.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[t.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[t.jsx("span",{className:"visually-hidden",children:"Filter logs by severity"}),t.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:R,onChange:p=>A(p.target.value),"data-testid":"devserver-log-severity-filter","aria-label":"Filter logs by severity",children:[t.jsx("option",{value:"all",children:"All severities"}),t.jsx("option",{value:"info",children:"Info"}),t.jsx("option",{value:"warn",children:"Warn"}),t.jsx("option",{value:"error",children:"Error"})]})]}),t.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[t.jsx("span",{className:"visually-hidden",children:"Search logs"}),t.jsx(it,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>M(p.target.value),placeholder:"Search logs","data-testid":"devserver-log-search-input","aria-label":"Search logs"})]}),d.trim().length>0&&t.jsxs("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:[j," match",j===1?"":"es"]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>S(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":P?"Exit fullscreen logs":"Enter fullscreen logs",children:P?t.jsx(lt,{size:14}):t.jsx(ct,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[b&&t.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:t.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:w,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(ee,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:h,"data-testid":"devserver-log-content",children:[!i&&D.length===0&&t.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?"No logs yet. Start the dev server to see output.":_.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const E=me(p.text),L=_t(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[L&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:L}),p.stream==="stderr"&&t.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:"ERR"}),t.jsx("span",{className:"devserver-log-text",children:Mt(E,d.trim())})]},p.id)})]}),u&&f&&t.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:T,"data-testid":"devserver-log-jump-button",children:[t.jsx(ot,{size:14}),"New logs"]})]})]})}const Pt="devserver-preview-iframe";function Tt({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:b,blockReason:y,onRetry:w,className:f=Pt,embedContext:k}){const U=y??k??null,[C,P]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(P(d=>d+1),o("loading"))},[i,o,e]);const S=r.useCallback(()=>{const d=b.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[b,o]),u=r.useCallback(d=>{d.stopPropagation(),o("error")},[o]),n=r.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?t.jsxs("div",{className:"devserver-preview-iframe-shell",children:[t.jsx("iframe",{src:e,ref:b,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:S,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${C}`),i==="loading"&&t.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading preview..."})]}),i==="blocked"&&t.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Preview cannot be embedded"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Unable to load preview"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]})]}):null}const Ee={stopped:{className:"dev-server-status-badge--stopped",label:"Stopped"},starting:{className:"dev-server-status-badge--starting",label:"Starting..."},running:{className:"dev-server-status-badge--running",label:"Running"},stopping:{className:"dev-server-status-badge--starting",label:"Stopping..."},failed:{className:"dev-server-status-badge--failed",label:"Failed"}};function Le(e){return e instanceof Error?e.message:String(e)}function $e(e){return e==="."?"root":e}function Re(e){return e?e==="root"?".":e:null}function _e(e,i,o){return!i||e.scriptName!==i?!1:o?$e(e.cwd)===o:!0}function zt(e){return e.cwd==="."?"root":e.cwd}function $t(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Ht({addToast:e,projectId:i}){const{session:o,detectedCommands:b,previewUrl:y,isLoading:w,error:f,startServer:k,stopServer:U,restartServer:C,setPreviewUrl:P,detectCommands:S,refresh:u}=yt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",M=Ee[n]??Ee.stopped,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,loadMore:T}=Nt(i,!!i),h=y,p=o?.config?.cwd??null,[E,L]=r.useState(!0),[z,F]=r.useState(""),[O,H]=r.useState(""),[x,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:g,setEmbedStatus:Fe,resetEmbedStatus:I,iframeRef:X,isEmbedded:Oe,isBlocked:te,blockReason:re,retry:fe}=Lt(N),[pe,W]=r.useState(!1),he=r.useRef(g);r.useEffect(()=>{const m=he.current!==g;te&&m&&W(!0),g==="embedded"&&W(!1),he.current=g},[g,te]),r.useEffect(()=>{W(!1)},[h]);const J=r.useMemo(()=>{if(!x)return null;const m=Re(p);return b.find($=>!($.scriptName!==x||m&&$.cwd!==m||o?.config?.command&&$.command!==o.config.command))??b.find($=>_e($,x,p))??null},[b,o?.config?.command,x,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(Le(m),"error")})},[e,S]),r.useEffect(()=>{if(x){L(!1);return}L(!0)},[x]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&F(o.config.command);return}if(J){F(J.command);return}b.length>0&&F(m=>m.trim().length>0?m:b[0]?.command??"")},[b,J,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const se=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),be=r.useCallback(()=>{W(!1),fe()},[fe]),Be=r.useCallback(()=>{try{const m=X.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),I();return}}catch{}if(!(!h||!X.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),X.current.src=m.toString(),W(!1),I()}catch{X.current.src=h,W(!1),I()}},[h,X,I]),Q=r.useCallback(async(m,$,ne)=>{c(m);try{await $(),e(ne,"success")}catch(Ke){e(Le(Ke),"error")}finally{c(null)}},[e]),He=r.useCallback(m=>{a(m.scriptName),L(!1),F(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),Ve=r.useCallback(()=>{a(null),L(!0),e("Cleared selected dev server script.","success")},[e]),We=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const $=Re(p)??".",ne=J?.cwd??$;Q("start",()=>k(m,ne),"Dev server started.")},qe=()=>{Q("stop",U,"Dev server stopped.")},Xe=()=>{Q("restart",C,"Dev server restarted.")},Ge=()=>{const m=O.trim(),$=m.length>0?m:null;Q("preview",()=>P($),$?"Preview URL updated.":"Preview URL override cleared.")},Ie=r.useCallback(()=>{f&&u()},[f,u]),Je=n==="starting"||n==="running"||s!==null,Qe=n==="stopped"||s!==null,Ye=n==="stopped"||n==="starting"||s!==null;return t.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[t.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[t.jsxs("div",{className:"dev-server-header-title",children:[t.jsx(dt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${M.className}`,"data-testid":"dev-server-status-badge",children:M.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:We,disabled:Je,"data-testid":"dev-server-start-button",children:[t.jsx(ut,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:qe,disabled:Qe,"data-testid":"dev-server-stop-button",children:[t.jsx(vt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Xe,disabled:Ye,"data-testid":"dev-server-restart-button",children:[t.jsx(mt,{size:14}),t.jsx("span",{children:s==="restart"?"Restarting...":"Restart"})]})]})]}),t.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Configuration"}),w&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),w&&!o&&b.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading dev server configuration..."})]}),f&&t.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[t.jsx("p",{children:f}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ie,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),x&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:x}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ve,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),E&&b.length===0&&t.jsxs("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:["No dev server scripts detected. Check that your project has a ",t.jsx("code",{children:"package.json"})," with a ",t.jsx("code",{children:"dev"}),", ",t.jsx("code",{children:"start"}),", or similar script."]}),E&&b.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:b.map(m=>{const $=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${$?"dev-server-candidate--selected":""}`,onClick:()=>He(m),"data-testid":`dev-server-candidate-${m.scriptName}-${$e(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:$t(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:zt(m)})]},`${m.cwd}::${m.scriptName}::${m.command}`)})})]}),t.jsxs("div",{className:"dev-server-field-group",children:[t.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:"Command"}),t.jsx("input",{id:"dev-server-command",className:"input",value:z,onChange:m=>F(m.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:n==="running"||n==="starting"})]}),(n==="running"||n==="starting")&&o&&t.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[t.jsx("span",{className:"dev-server-label",children:"Running command"}),t.jsx("code",{children:o.config?.command??z})]}),t.jsxs("div",{className:"dev-server-preview-override",children:[t.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:"Preview URL Override"}),t.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:O,onChange:m=>H(m.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ge,disabled:s==="preview","data-testid":"dev-server-set-preview",children:"Save"})]}),h&&t.jsxs("p",{className:"dev-server-preview-hint",children:["Auto-detected: ",h]})]}),t.jsx("div",{className:"dev-server-content",children:t.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Logs"}),t.jsxs("span",{className:"dev-server-muted",children:[j??R.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(At,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,onLoadMore:T,isRunning:d})})]})}),t.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[t.jsxs("div",{className:"devserver-preview-header",children:[t.jsxs("div",{className:"devserver-preview-title",children:[t.jsx(ft,{size:14}),t.jsx("span",{children:"Preview"})]}),t.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:h??"No preview URL","data-testid":"devserver-preview-url-badge",children:["Auto",h?` · ${h}`:" · Not available"]}),t.jsxs("div",{className:"devserver-preview-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(m=>m==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:l==="embedded"?"External only":"Embedded"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Open in new tab",onClick:se,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(pt,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Be,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(ht,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":g,"data-embedded":Oe?"true":"false",children:[!h&&!d&&t.jsx("p",{className:"devserver-preview-empty",children:"Start a dev server to see a live preview here."}),!h&&d&&t.jsx("p",{className:"devserver-preview-empty",children:"No preview URL detected. Start the dev server or set a manual URL to preview your app."}),h&&l==="external"&&t.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[t.jsx("p",{children:"Embedded preview is disabled. Open your app in a separate browser tab."}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:se,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&pe&&te&&t.jsxs("div",{className:g==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[g==="error"?t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:g==="error"?"Preview failed":"Preview blocked"}),re&&t.jsx("p",{className:"devserver-preview-blocked-context",children:re})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"Open the preview in a new tab, or retry embedded mode after checking your server settings."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:se,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:be,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!pe&&t.jsx(Tt,{url:h,embedStatus:g,onEmbedStatusChange:Fe,iframeRef:X,blockReason:re,onRetry:be})]})]})]})}export{Ht as DevServerView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{
|
|
1
|
+
import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{dX as f,dY as g,cX as b,b as y,ag as P,ab as H,ac as C,L as O,an as v}from"./index-k_85J1DS.js";import{F as z}from"./folder-open-BNQW9dE9.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};
|