@runfusion/fusion 0.33.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +1256 -936
- package/dist/client/.vite/manifest.json +60 -59
- package/dist/client/assets/{AgentDetailView-BACu9GYE.js → AgentDetailView-CzqwIIpv.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-tNNlcCDk.js → AgentPermissionPolicyEditor-2eoM2XQH.js} +1 -1
- package/dist/client/assets/{AgentsView-CPpHwjn3.js → AgentsView-BrtAvhJl.js} +5 -5
- package/dist/client/assets/ChatView-BuIe4MhL.js +6 -0
- package/dist/client/assets/{DevServerView-BlxSS8Uu.js → DevServerView-CF6FPLRb.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-ioTzF36r.js → DirectoryPicker-BpvHQxhu.js} +1 -1
- package/dist/client/assets/{DocumentsView-CsDb8dPw.js → DocumentsView-RMWZBJ-y.js} +1 -1
- package/dist/client/assets/{EvalsView-I0GhxVhm.js → EvalsView-DtVxpc4T.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-Cr6g_jok.js → ExperimentalAgentOnboardingModal-fzJmb-yG.js} +1 -1
- package/dist/client/assets/{GoalsView-DXJxe6D4.js → GoalsView-BAchggxo.js} +1 -1
- package/dist/client/assets/{InsightsView-BaIhzpvX.js → InsightsView-B8892IbG.js} +1 -1
- package/dist/client/assets/{MemoryView-DlmcI0ca.js → MemoryView-Cfp1WmAm.js} +1 -1
- package/dist/client/assets/{NodesView-vc4T0uCy.js → NodesView-Dt26DSEQ.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-C0ljxGbt.js → PiExtensionsManager-xHU56SMh.js} +1 -1
- package/dist/client/assets/{PluginManager-D27abRF-.js → PluginManager-37WUEOmp.js} +1 -1
- package/dist/client/assets/{ResearchView-BSpDz8YN.js → ResearchView-pu88M5xL.js} +1 -1
- package/dist/client/assets/{SecretsView-BmCemEu8.js → SecretsView-BT7ofJLN.js} +1 -1
- package/dist/client/assets/SettingsModal-Cz9MHNGg.js +31 -0
- package/dist/client/assets/{SettingsModal-DvmwpEUE.js → SettingsModal-DxYXsn08.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-CDfZpkB7.js → SetupWizardModal-yWTk3Cac.js} +1 -1
- package/dist/client/assets/{SkillsView-BCpa_vud.js → SkillsView-CWNfKNTs.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-BYLja93K.js → StashRecoveryView-D0t4IIX-.js} +1 -1
- package/dist/client/assets/{TodoView-lbnG-8cZ.js → TodoView-B4W1Lhy6.js} +1 -1
- package/dist/client/assets/{dashboard-view-CY6MGQbI.js → dashboard-view-4OCJIthP.js} +1 -1
- package/dist/client/assets/{folder-open-CZghG0dv.js → folder-open-BTdhwFQ5.js} +1 -1
- package/dist/client/assets/index-D4nQgFjo.js +742 -0
- package/dist/client/assets/index-k4s0JWir.css +1 -0
- package/dist/client/assets/{upload-L7aDk8Xn.js → upload-kESyjow_.js} +1 -1
- package/dist/client/assets/{users-DoWKt94F.js → users-DNXMrdcp.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +860 -614
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/src/dashboard/__tests__/ReportsView.test.tsx +15 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/test-setup.ts +9 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/references/extension-tools.md +2 -0
- package/dist/client/assets/ChatView-CCAUA7HB.js +0 -6
- package/dist/client/assets/SettingsModal-m3KMs_uS.js +0 -31
- package/dist/client/assets/index-lDPXOH7J.css +0 -1
- package/dist/client/assets/index-tJzhtiGM.js +0 -742
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{r as s,a as yn,j as t,R as wn}from"./vendor-react-K0fH_qHe.js";import{c as Sn,a9 as Ts,a7 as Is,bc as $s,bd as ls,aF as Rt,be as Ds,ac as Ps,bf as ts,t as Cn,bg as kn,bh as Ls,bi as jn,bj as ss,w as Nn,bk as Mn,bl as Rn,bm as An,bn as En,bo as Tn,bp as In,bq as $n,s as Dn,br as Pn,i as Ln,k as Qs,bs as Fn,bt as _n,bu as Zs,bv as zn,bw as Hn,bx as Un,p as On,by as Bn,bz as Kn,u as Gn,bA as Wn,ah as en,ai as tn,bB as Vn,bC as qn,S as Xn,_ as ns,P as dt,J as lt,av as Jn,bD as Fs,a as kt,bE as _s,bF as zs,bG as Hs,B as ut,ae as Yn,af as Qn,b1 as At,bH as Zn,bI as ea,a_ as ta,bJ as Us,bK as sa,T as na,bL as Os,bM as aa,j as Bs,m as ra}from"./index-D4nQgFjo.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";/**
|
|
2
|
+
* @license lucide-react v1.7.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const ia=[["path",{d:"M5 3h14",key:"7usisc"}],["path",{d:"m18 13-6-6-6 6",key:"1kf1n9"}],["path",{d:"M12 7v14",key:"1akyts"}]],oa=Sn("arrow-up-to-line",ia),as="kb-chat-active-session";function Ks(n){const r=typeof n=="string"?n.trim():"",d=r.indexOf("/");return!r||d<=0||d>=r.length-1?{}:{modelProvider:r.slice(0,d),modelId:r.slice(d+1)}}function ca(n){const r=n?.toolCalls;if(!Array.isArray(r))return;const d=r.map(i=>{if(!i||typeof i!="object")return null;const g=i,b=typeof g.toolName=="string"?g.toolName:"";if(!b)return null;const y=g.args;return{toolName:b,...y&&typeof y=="object"?{args:y}:{},isError:!!g.isError,result:g.result,status:"completed"}}).filter(i=>i!==null);return d.length>0?d:void 0}function la(n){const r=n?.fallback;if(!r||typeof r!="object")return;const d=r,i=typeof d.primaryModel=="string"?d.primaryModel:"",g=typeof d.fallbackModel=="string"?d.fallbackModel:"",b=d.triggerPoint;if(!(!i||!g||b!=="session-creation"&&b!=="prompt-time"))return{primaryModel:i,fallbackModel:g,triggerPoint:b}}function da(n){const r=n?.failureInfo;if(!r||typeof r!="object")return;const d=r,i=typeof d.summary=="string"?d.summary.trim():"";if(!i)return;const g=(()=>{const b=d.reference;if(!b||typeof b!="object")return;const y=b,f=typeof y.kind=="string"?y.kind.trim():"",I=typeof y.id=="string"?y.id.trim():"";if(!(!f||!I))return{kind:f,id:I,...typeof y.label=="string"&&y.label.trim()?{label:y.label.trim()}:{}}})();return{summary:i,...typeof d.errorClass=="string"&&d.errorClass.trim()?{errorClass:d.errorClass.trim()}:{},...typeof d.code=="string"&&d.code.trim()?{code:d.code.trim()}:{},...typeof d.detail=="string"&&d.detail.trim()?{detail:d.detail.trim()}:{},...g?{reference:g}:{}}}function Gs(n){return typeof n=="string"?{summary:n.trim()||"Failed to get response"}:{summary:typeof n.summary=="string"&&n.summary.trim()?n.summary.trim():"Failed to get response",...typeof n.errorClass=="string"&&n.errorClass.trim()?{errorClass:n.errorClass.trim()}:{},...typeof n.code=="string"&&n.code.trim()?{code:n.code.trim()}:{},...typeof n.detail=="string"&&n.detail.trim()?{detail:n.detail.trim()}:{},...n.reference?{reference:n.reference}:{}}}function rs(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:ca(n.metadata),fallbackInfo:la(n.metadata),failureInfo:da(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function ua(n,r){const d=s.useCallback(l=>l?`${Ts.CHAT_SESSIONS_PREFIX}${l}`:null,[]),i=s.useCallback((l,u)=>l&&u?`${Ts.CHAT_MESSAGES_PREFIX}${l}:${u}`:null,[]),g=s.useCallback(l=>{const u=d(l);return u?Is(u,{maxAgeMs:$s})??[]:[]},[d]),[b,y]=s.useState(()=>g(n)),[f,I]=s.useState(null),[Y,Q]=s.useState(()=>g(n).length===0),[w,N]=s.useState([]),[z,S]=s.useState(!1),[Z,C]=s.useState(!1),[O,j]=s.useState(""),[X,E]=s.useState(""),[_,T]=s.useState([]),[J,k]=s.useState(""),[B,te]=s.useState(""),[h,p]=s.useState(!0),{agentsMap:he}=ls(n),c=s.useRef(null),re=s.useRef(null),se=s.useRef(!1),$=s.useRef(""),ue=s.useRef(null),be=s.useRef(b),G=s.useRef(f),st=s.useRef(w),K=s.useRef(Z);be.current=b,G.current=f,st.current=w,K.current=Z,s.useEffect(()=>{$.current=J},[J]);const Ge=s.useRef(new Set),ye=s.useRef(0),Ie=s.useRef(n);Ie.current!==n&&(Rt({view:"useChat",trigger:"project-context-change",projectId:n,replayAttempted:!1,detail:{previousProjectId:Ie.current??null}}),Ie.current=n,ye.current++);const oe=s.useCallback(async()=>{be.current.length===0&&Q(!0);try{const u=[...(await Ds(n)).sessions].sort((D,H)=>new Date(H.updatedAt).getTime()-new Date(D.updatedAt).getTime());y(u);const v=d(n);v&&Ps(v,u,{maxBytes:5e5})}catch{const l=g(n);if(be.current.length===0&&l.length===0){const u=d(n);u&&ts(u)}}finally{Q(!1)}},[d,n]);s.useEffect(()=>{const l=g(n);y(l),Q(l.length===0)},[n,g]),s.useEffect(()=>{oe()},[oe,n]);const we=s.useRef(()=>{}),Se=s.useRef(!1);s.useEffect(()=>{Se.current=!1,re.current=null},[n]),s.useEffect(()=>{if(Y||Se.current||G.current)return;const l=Cn(as,n);if(!l){Se.current=!0;return}const u=b.find(v=>v.id===l);if(u){Se.current=!0,we.current(l,u);return}Se.current=!0},[Y,b,n]);const We=s.useCallback((l,u)=>{const v=i(l,u);return v?Is(v,{maxAgeMs:$s})??[]:[]},[i]),Oe=s.useCallback(l=>{const u=We(n,l);return u.length>0?(N(u),S(!1),!0):(N([]),!1)},[n,We]),ce=s.useCallback(async(l,u)=>{const v=typeof u?.offset=="number"&&u.offset>0,D=i(n,l),H=v?[]:We(n,l),A=H.length>0;!v&&A?(N(H),S(!1)):S(!0);try{const ee=await kn(l,{limit:50,...u},n),M=ee.messages.map(rs);v?G.current?.id===l&&(N(U=>[...M,...U]),p(ee.messages.length>=50)):G.current?.id===l&&(N(M),p(ee.messages.length>=50),D&&Ps(D,M,{maxBytes:5e5}))}catch{!v&&st.current.length===0&&A&&(N(H),S(!1))}finally{S(!1)}},[i,n,We]),me=s.useCallback(()=>{ue.current?.(),ue.current=null,$.current="",k(""),j(""),E(""),T([]),C(!1)},[]),mt=s.useCallback(()=>{$.current="",k("")},[]),ie=s.useCallback(()=>{const l=$.current.trim();l&&($.current="",k(""),Be.current(l))},[]),le=s.useCallback((l,u,v)=>{if(c.current||!l)return!0;se.current=!1,u&&(j(u.streamingText),E(u.streamingThinking),T(u.toolCalls)),C(!0);const{handlers:D}=Ls({sessionId:l,tempUserMessageId:"",setStreamingText:j,setStreamingThinking:E,setStreamingToolCalls:T,cancelStreamingFlushesRef:ue,addToast:v?.silent?void 0:r,onFallbackSession:(A,ee)=>{const M=Ks(A.fallbackModel);y(U=>U.map(W=>W.id===ee?{...W,...M}:W)),I(U=>U&&U.id===ee?{...U,...M}:U)},onDone:()=>{j(""),E(""),T([]),C(!1),K.current=!1,c.current=null,re.current=null,ce(l),ie()},onError:A=>{j(""),E(""),T([]),C(!1),K.current=!1,c.current=null,re.current=null;const ee=Gs(A);v?.silent||r?.(ee.summary,"error"),ce(l),ie()}});Rt({view:"useChat",trigger:"sse-open",projectId:n,replayAttempted:typeof u?.replayFromEventId=="number",replayFromEventId:u?.replayFromEventId??null,lastEventId:u?.replayFromEventId??null});const H=jn(l,D,n,{...typeof u?.replayFromEventId=="number"?{lastEventId:u.replayFromEventId}:{}});return c.current=H,re.current={sessionId:l,replayFromEventId:typeof u?.replayFromEventId=="number"?u.replayFromEventId:null},!0},[r,ce,n,ie]),$e=s.useCallback((l,u)=>{const v=G.current?.id??null;if(l&&v===l&&!u)return;c.current&&(c.current.close(),c.current=null),re.current=null;const D=u??b.find(H=>H.id===l);I(D||null),l&&ss(l,n).then(({session:H})=>{!H.isGenerating||!H.inFlightGeneration||I(A=>!A||A.id!==l?A:{...A,...H})}).catch(()=>{}),me(),p(!0),l?(Oe(l),ce(l)):N([]),D?.isGenerating&&le(D.id,D.inFlightGeneration),l?Nn(as,l,n):Mn(as,n)},[le,Oe,b,ce,n,me]);we.current=$e;const Et=s.useCallback(async l=>{const u=await Rn(l,n);c.current&&(c.current.close(),c.current=null),re.current=null;const v={id:u.session.id,title:u.session.title,agentId:u.session.agentId,status:u.session.status,modelProvider:u.session.modelProvider,modelId:u.session.modelId,createdAt:u.session.createdAt,updatedAt:u.session.updatedAt};return y(D=>D.some(H=>H.id===v.id)?D:[v,...D]),me(),$e(v.id,v),v},[n,me,$e]),De=s.useCallback(async l=>{await An(l,{status:"archived"},n),y(u=>u.filter(v=>v.id!==l)),f?.id===l&&(re.current=null,I(null),N([]))},[f,n]),Pe=s.useCallback(async l=>{f?.id===l&&c.current&&(c.current.close(),c.current=null),f?.id===l&&(re.current=null),await En(l,n);const u=i(n,l);u&&ts(u),y(v=>v.filter(D=>D.id!==l)),f?.id===l&&(I(null),N([]))},[f,i,n]),nt=s.useCallback(async()=>{!f||!h||await ce(f.id,{offset:w.length})},[f,h,ce,w.length]),Ve=s.useCallback(()=>{f&&(se.current=!0,ue.current?.(),ue.current=null,c.current?.close(),c.current=null,re.current=null,Tn(f.id,n).catch(()=>{}),C(!1),K.current=!1,j(""),E(""),T([]),ie())},[f,n,ie]),Be=s.useRef(()=>{}),Le=In(),Ce=s.useCallback(async l=>{try{await oe();const u=await ss(l,n);G.current?.id===l&&I(v=>!v||v.id!==l?v:{...v,...u.session}),u.session.isGenerating?(j(""),E(""),T([]),C(!0),K.current=!0,le(l,u.session.inFlightGeneration,{silent:!0})):(j(""),E(""),T([]),C(!1),K.current=!1,await ce(l))}catch{}},[le,ce,n,oe]),ke=s.useCallback((l,u)=>{if(!f)return;if(K.current){$.current=l,k(l);return}se.current=!1,c.current&&(c.current.close(),c.current=null),re.current=null;const v=`temp-${Date.now()}`,D={id:v,sessionId:f.id,role:"user",content:l,createdAt:new Date().toISOString()};N(A=>[...A,D]),j(""),E(""),T([]),C(!0);const{handlers:H}=Ls({sessionId:f.id,tempUserMessageId:v,setStreamingText:j,setStreamingThinking:E,setStreamingToolCalls:T,cancelStreamingFlushesRef:ue,addToast:r,onFallbackSession:(A,ee)=>{const M=Ks(A.fallbackModel);y(U=>U.map(W=>W.id===ee?{...W,...M}:W)),I(U=>U&&U.id===ee?{...U,...M}:U)},onDone:({messageId:A,message:ee,accumulated:M})=>{const U=ee?{...rs(ee),...M.text.length>0?{content:M.text}:{}}:{id:A||`msg-${Date.now()}`,sessionId:f.id,role:"assistant",content:M.text,thinkingOutput:M.thinking,toolCalls:M.toolCalls.length>0?M.toolCalls:void 0,fallbackInfo:M.fallbackInfo,createdAt:new Date().toISOString()};Ge.current.add(U.id),N(W=>[...W,U]),j(""),E(""),T([]),C(!1),K.current=!1,c.current=null,re.current=null,setTimeout(()=>{Ge.current.delete(U.id)},1e3),oe(),ie()},onError:(A,ee)=>{const M=Gs(A),U=typeof A=="string"?A:M.summary,W=Pn(U);N(V=>{const P=V.filter(q=>q.id!==ee);return W?P:[...P,{id:`error-${Date.now()}`,sessionId:f.id,role:"assistant",content:M.summary,failureInfo:M,createdAt:new Date().toISOString()}]}),j(""),E(""),T([]),C(!1),K.current=!1,c.current=null,re.current=null,console.error("[useChat] Stream error:",A),W?(console.info("[useChat] Suppressed tab-suspension stream error:",A),f?.id&&(j(""),E(""),T([]),C(!0),K.current=!0,Ce(f.id))):(r?.(M.summary,"error"),oe()),se.current||ie()}});c.current=$n(f.id,l,H,u,n)},[f,n,oe,r,le,Ce,ie]);Be.current=ke;const ve=B?b.filter(l=>l.title?.toLowerCase().includes(B.toLowerCase())||l.agentId.toLowerCase().includes(B.toLowerCase())):b;return s.useEffect(()=>{if(!f?.id||f.isGenerating!==!0||c.current)return;const l=typeof f.inFlightGeneration?.replayFromEventId=="number"?f.inFlightGeneration.replayFromEventId:null,u=re.current;u?.sessionId===f.id&&u.replayFromEventId===l||le(f.id,f.inFlightGeneration,{silent:!0})},[f?.id,f?.isGenerating,f?.inFlightGeneration,le]),s.useEffect(()=>{if(!G.current?.isGenerating||(c.current||le(G.current.id,G.current.inFlightGeneration),!K.current||c.current||!G.current))return;const l=setInterval(async()=>{if(!K.current||c.current||!G.current){clearInterval(l);return}try{(await Ds(n)).sessions.find(D=>D.id===G.current?.id)?.isGenerating||(clearInterval(l),await ce(G.current.id),j(""),E(""),T([]),C(!1),K.current=!1,ie())}catch{}},3e3);return()=>clearInterval(l)},[le,ce,n,f,ie]),s.useEffect(()=>Le.onBecameVisible(()=>{const u=G.current;if(!u||c.current)return;const v=ye.current;ss(u.id,n).then(D=>{if(!(ye.current!==v||c.current)){if(D.session.isGenerating){j(""),E(""),T([]),C(!0),K.current=!0,le(u.id,D.session.inFlightGeneration,{silent:!0});return}K.current&&(j(""),E(""),T([]),C(!1),K.current=!1,ie(),ce(u.id))}}).catch(()=>{})}),[le,ce,n,Le,ie]),s.useEffect(()=>{const l=ye.current,u=n?`?projectId=${encodeURIComponent(n)}`:"",v=()=>ye.current!==l,D=W=>{if(v())return;const V=JSON.parse(W.data);y(P=>P.some(q=>q.id===V.id)?P:[V,...P])},H=W=>{if(v())return;const V=JSON.parse(W.data);y(P=>[...P.map(ne=>ne.id===V.id?V:ne)]),G.current?.id===V.id&&(I(V),V.isGenerating&&!c.current&&le(V.id,V.inFlightGeneration))},A=W=>{if(v())return;const{id:V}=JSON.parse(W.data);y(q=>q.filter(ne=>ne.id!==V));const P=i(n,V);P&&ts(P),G.current?.id===V&&(I(null),N([]))},ee=W=>{if(v())return;const V=JSON.parse(W.data),P=rs(V);if(!Ge.current.has(P.id)){if(G.current?.id===P.sessionId&&K.current&&!c.current&&P.role==="assistant"){N(q=>q.some(ne=>ne.id===P.id)?q:[...q,P]),j(""),E(""),T([]),C(!1),K.current=!1,ie();return}G.current?.id===P.sessionId&&!K.current&&N(q=>{if(q.some(ne=>ne.id===P.id))return q;if(P.role==="user"){const ne=q.findIndex(je=>je.role==="user"&&je.id.startsWith("temp-")&&je.content.trim()===P.content.trim());if(ne>=0){const je=[...q];return je[ne]=P,je}}return[...q,P]})}},M=W=>{if(v())return;const{id:V}=JSON.parse(W.data);N(P=>P.filter(q=>q.id!==V))};return Dn(`/api/events${u}`,{events:{"chat:session:created":D,"chat:session:updated":H,"chat:session:deleted":A,"chat:message:added":ee,"chat:message:deleted":M}})},[le,i,n,ie]),s.useEffect(()=>()=>{c.current&&(c.current.close(),c.current=null),re.current=null},[]),{sessions:b,activeSession:f,sessionsLoading:Y,messages:w,messagesLoading:z,isStreaming:Z,streamingText:O,streamingThinking:X,streamingToolCalls:_,pendingMessage:J,selectSession:$e,createSession:Et,archiveSession:De,deleteSession:Pe,sendMessage:ke,stopStreaming:Ve,clearPendingMessage:mt,loadMoreMessages:nt,hasMoreMessages:h,searchQuery:B,setSearchQuery:te,filteredSessions:ve,refreshSessions:oe,agentsMap:he}}function ma(n,r=[]){const d=n.trim().replace(/^#/,"");if(!d)return{ok:!1,error:"Room name is required."};if(/[A-Z]/.test(d))return{ok:!1,error:"Use lowercase letters only."};const i=d.toLowerCase();return i.length>80?{ok:!1,error:"Room names can be at most 80 characters."}:/^[a-z0-9_-]+$/.test(i)?/^[-_]|[-_]$/.test(i)?{ok:!1,error:"Room names cannot start or end with a hyphen or underscore."}:r.some(g=>g.toLowerCase()===i)?{ok:!1,error:"A room with this name already exists."}:{ok:!0,name:i}:{ok:!1,error:"Use lowercase letters, numbers, hyphens, or underscores only."}}function ha({isOpen:n,onClose:r,onCreate:d,projectId:i,existingRoomNames:g=[]}){const[b,y]=s.useState(""),[f,I]=s.useState([]),[Y,Q]=s.useState(""),[w,N]=s.useState([]),[z,S]=s.useState(!1),[Z,C]=s.useState(null),[O,j]=s.useState(!1),X=s.useRef(null),E=s.useRef(null);s.useEffect(()=>{n&&(E.current=document.activeElement instanceof HTMLElement?document.activeElement:null,S(!0),C(null),Ln(void 0,i).then(h=>I(h)).catch(()=>{I([]),C("Failed to load agents.")}).finally(()=>S(!1)))},[n,i]),s.useEffect(()=>{if(!n){y(""),Q(""),N([]),C(null),j(!1);return}const h=window.requestAnimationFrame(()=>X.current?.focus());return()=>window.cancelAnimationFrame(h)},[n]),s.useEffect(()=>{if(!n)return;const h=p=>{p.key==="Escape"&&r()};return document.addEventListener("keydown",h),()=>document.removeEventListener("keydown",h)},[n,r]),s.useEffect(()=>{n||E.current?.focus()},[n]);const _=s.useMemo(()=>ma(b,g),[b,g]),T=s.useMemo(()=>{const h=Y.trim().toLowerCase();return h?f.filter(p=>p.name.toLowerCase().includes(h)):f},[f,Y]),J=s.useMemo(()=>f.filter(h=>w.includes(h.id)),[f,w]),k=_.ok&&w.length>0&&!O&&!z;if(!n)return null;const B=h=>{O||N(p=>p.includes(h)?p.filter(he=>he!==h):[...p,h])},te=async()=>{if(!_.ok){C(_.error);return}if(w.length===0){C("Select at least one member.");return}C(null),j(!0);try{await d({name:_.name,displayName:`#${_.name}`,memberAgentIds:w}),r()}catch(h){C(h instanceof Error?h.message:"Failed to create room.")}finally{j(!1)}};return yn.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:h=>h.target===h.currentTarget&&r(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":"Create room",onClick:h=>h.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:"Create room"}),t.jsx("button",{type:"button",className:"modal-close","aria-label":"Close",onClick:r,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:"Room name"}),t.jsxs("div",{className:"create-room-modal-name-field",children:[t.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),t.jsx("input",{ref:X,id:"create-room-name",className:"input",value:b,disabled:O,onChange:h=>{const p=h.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();y(p)}})]}),!_.ok&&t.jsx("div",{className:"form-error",children:_.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:"Members"}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:"Search agents",value:Y,disabled:O,onChange:h=>Q(h.target.value)})]}),J.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:J.map(h=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>B(h.id),disabled:O,children:[h.name," ×"]},h.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:z?t.jsx("div",{className:"create-room-modal-empty",children:"Loading agents..."}):T.length===0?t.jsx("div",{className:"create-room-modal-empty",children:f.length===0?"No agents in this project yet.":"No agents match your search."}):T.map(h=>{const p=w.includes(h.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${p?" create-room-modal-member-row--selected":""}`,onClick:()=>B(h.id),disabled:O,children:[t.jsx(Qs,{agent:h,size:20}),t.jsx("span",{children:h.name}),t.jsx("span",{className:"create-room-modal-member-role",children:h.role})]},h.id)})}),Z&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:Z})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:O,children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void te(),disabled:!k,children:O?"Creating...":"Create room"})]})]})}),document.body)}const fa=640;let is=!1;function ga(n){return Math.max(40,Math.min(n,fa))}function sn(n){const r=new Date(n),i=new Date().getTime()-r.getTime(),g=Math.floor(i/1e3),b=Math.floor(g/60),y=Math.floor(b/60),f=Math.floor(y/24);return g<60?"just now":b<60?`${b}m ago`:y<24?`${y}h ago`:f<7?`${f}d ago`:r.toLocaleDateString()}function Ws(n,r){if(!n||!r)return null;const d=r.toLowerCase();if(d.includes("claude")){let g=r.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return g=g.replace(/\s+/g," "),g.length>30?g.slice(0,30)+"…":g}if(d.includes("gpt")||d.includes("openai")){const g=r.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return g.length>30?g.slice(0,30)+"…":g}if(d.includes("gemini")){const g=r.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return g.length>30?g.slice(0,30)+"…":g}const i=r.replace(/-/g," ").replace(/^\w/,g=>g.toUpperCase()).replace(/\s+/g," ").trim();return i.length>30?i.slice(0,30)+"…":i}function Mt(n,r){return n.length<=r?n:`${n.slice(0,r)}…`}function pa(n){if(!n)return null;const r=Object.entries(n);return r.length===0?null:r.map(([d,i])=>{const g=typeof i=="string"?i:(()=>{try{return JSON.stringify(i)}catch{return String(i)}})();return`${d}=${Mt(g,50)}`}).join(", ")}function ba(n){if(n===void 0)return null;if(typeof n=="string")return Mt(n,200);try{return Mt(JSON.stringify(n),200)}catch{return Mt(String(n),200)}}function va(n){if(!n)return null;if(n.kind==="mailbox"||n.kind==="mailbox-message"){const r=typeof window>"u"?"/":window.location.pathname||"/",d=new URLSearchParams(typeof window>"u"?"":window.location.search);return d.set("view","mailbox"),d.set("mailbox-message",n.id),`${r}?${d.toString()}#message-${encodeURIComponent(n.id)}`}return null}function xa(n){if(!n)return null;const r=n.label??`${n.kind} ${n.id}`,d=va(n),i=`chat-failure-reference-${n.kind}-${n.id}`.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase();return t.jsxs("div",{className:"chat-message-failure-reference",children:[t.jsx("span",{className:"chat-message-failure-reference-label",children:"Reference"}),t.jsx("span",{className:"chat-message-failure-reference-value",children:r}),d?t.jsx("a",{className:"btn btn-sm chat-message-failure-reference-link",href:d,children:"Open mailbox message"}):t.jsxs("details",{className:"chat-message-failure-reference-details",children:[t.jsx("summary",{className:"btn btn-sm chat-message-failure-reference-link",children:"View failure details"}),t.jsxs("dl",{className:"chat-message-failure-reference-meta",id:i,children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Kind"}),t.jsx("dd",{children:n.kind})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"ID"}),t.jsx("dd",{children:n.id})]}),n.label&&t.jsxs("div",{children:[t.jsx("dt",{children:"Label"}),t.jsx("dd",{children:n.label})]})]})]})]})}function nn(n){if(!n||n.length===0)return null;const r=(w,N)=>{const z=w.status==="running",S=w.status==="completed"&&w.isError,Z=pa(w.args),C=ba(w.result),O=z?Z:C?`result: ${C}`:Z?`args: ${Z}`:null,j=z?"running":S?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${z?" chat-tool-call--running":""}${S?" chat-tool-call--error":""}`,open:z,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",title:w.toolName,children:w.toolName}),O&&t.jsx("span",{className:"chat-tool-call-preview",title:O,children:O}),t.jsx("span",{className:"chat-tool-call-status-text",children:j})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[Z&&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:Z})]}),C&&t.jsxs("div",{className:`chat-tool-call-row${S?" 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})]})]})]},`${w.toolName}-${N}`)},d="chat-tool-calls";if(n.length===1)return t.jsxs("div",{className:d,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(Os,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),r(n[0],0)]});const i=n.filter(w=>w.status==="running").length,g=n.filter(w=>w.status==="completed"&&w.isError).length,b=i>0,y=Array.from(new Set(n.map(w=>w.toolName))),f=y.slice(0,5),I=Math.max(0,y.length-f.length),Y=I>0?`${f.join(", ")}, +${I} more`:f.join(", "),Q=b?`(${i} running)`:g>0?`(${g} ${g===1?"error":"errors"})`:null;return t.jsx("div",{className:d,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:b,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(Os,{size:12,"aria-hidden":"true"}),t.jsxs("span",{className:"chat-tool-calls-count",children:[n.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:Y,children:Y}),Q&&t.jsx("span",{className:"chat-tool-calls-group-status",children:Q})]}),n.map((w,N)=>r(w,N))]})})}const an={p:({children:n,...r})=>t.jsx("p",{...r,children:Us(n)}),li:({children:n,...r})=>t.jsx("li",{...r,children:Us(n)}),pre:({children:n,...r})=>t.jsx("pre",{...r,className:"chat-markdown-pre",children:n}),code:({children:n,...r})=>{const d=typeof n=="string"?n:wn.Children.toArray(n).join(""),i=At(d);return i.length===1&&typeof i[0]=="string"?t.jsx("code",{...r,children:n}):t.jsx("code",{...r,children:i})},table:({children:n,...r})=>t.jsx("table",{...r,className:"chat-markdown-table",children:n})},tt="__fn_agent__",ya=280,jt=180,Nt=500,Vs="fusion:chat-sidebar-width",os="fusion:chat-scope",wa="fusion:chat-draft:";function qs(n,r){return r?`${wa}${n}:${r}`:null}function Xs(n){if(!n)return"";try{return localStorage.getItem(n)??""}catch{return""}}const Sa=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function Js(n){const r=/(^|[\s])\/([^\s]*)$/.exec(n);if(!r)return null;const d=r[1]??"",i=r[2]??"",g=r.index+d.length;return{filter:i,start:g,end:n.length}}function Ca(n,r){const d=n.slice(0,r),i=/(^|[\s\n])@([\w-]*)$/.exec(d);if(!i)return null;const g=i[2]??"",b=d.length-g.length-1;return{filter:g,start:b,end:r}}function ka(n){const r=n?.runtimeConfig;if(!r||typeof r!="object")return null;const d=Reflect.get(r,"modelProvider"),i=Reflect.get(r,"modelId");return typeof d!="string"||d.trim().length===0||typeof i!="string"||i.trim().length===0?null:{provider:d,modelId:i}}function Ys(n,r,d){if(n?.modelProvider&&n?.modelId)return{provider:n.modelProvider,modelId:n.modelId};const i=ka(r??void 0);return i||(d.provider&&d.modelId?{provider:d.provider,modelId:d.modelId}:null)}function ja({projectId:n,onClose:r,onCreate:d}){const[i,g]=s.useState("agent"),{agents:b,loading:y}=ls(n),[f,I]=s.useState(""),{models:Y,favoriteProviders:Q,favoriteModels:w,loading:N,refresh:z}=Zs(),[S,Z]=s.useState(""),[C,O]=s.useState(Q),[j,X]=s.useState(w);s.useEffect(()=>{O(Q)},[Q]),s.useEffect(()=>{X(w)},[w]);const E=s.useCallback(async k=>{const B=C,h=B.includes(k)?B.filter(p=>p!==k):[k,...B];O(h);try{await Bs({favoriteProviders:h,favoriteModels:j}),await z()}catch{O(B)}},[C,j,z]),_=s.useCallback(async k=>{const B=j,h=B.includes(k)?B.filter(p=>p!==k):[k,...B];X(h);try{await Bs({favoriteProviders:C,favoriteModels:h}),await z()}catch{X(B)}},[j,C,z]),T=k=>{if(k.preventDefault(),i==="agent"){if(!f)return;d({agentId:f});return}if(!S)return;const B=S.indexOf("/");if(B<=0)return;const te=S.slice(0,B),h=S.slice(B+1);d({agentId:tt,modelProvider:te,modelId:h})},J=i==="agent"?!f:!S;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:k=>k.stopPropagation(),children:[t.jsx("h3",{children:"New Chat"}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${i==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{g("agent"),Z("")},children:"Agent"}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${i==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{g("model"),I("")},children:"Model"})]}),t.jsxs("form",{onSubmit:T,children:[i==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",y?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):b.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:b.map(k=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${f===k.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>I(k.id),"data-testid":`agent-option-${k.id}`,children:[t.jsx(ut,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:k.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:k.role})]},k.id))})]}),i==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:N?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(ra,{models:Y,value:S,onChange:Z,label:"Model",placeholder:"Select a model",favoriteProviders:C,onToggleFavorite:E,favoriteModels:j,onToggleModelFavorite:_})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:J,children:"Create"})]})]})]})})}const cs=s.memo(function({message:r,forcePlain:d,agentName:i,hideAssistantIdentity:g,showAssistantModelTag:b,activeModelTag:y,activeModelProvider:f,activeSessionId:I,mentionAgentsByName:Y,roomContext:Q,copyAction:w,onScrollToTop:N}){const z=r.role==="assistant",S=z?r.failureInfo:void 0,Z=z&&(!g||!!S),C=s.useMemo(()=>{if(z)return null;const X=r.content,E=/@([\w-]+)/g,_=[];let T=0,J=E.exec(X);for(;J;){const[k,B=""]=J,te=J.index;te>T&&_.push(X.slice(T,te));const h=B.replace(/_/g," ").toLowerCase(),p=Y.get(h);if(p){const he=!!(Q&&!Q.memberIds.has(p.id)),c=he?`Not a member of ${Q?.roomName}`:void 0;_.push(t.jsxs("span",{className:`chat-mention-chip${he?" chat-mention-chip--non-member":""}`,title:c,"aria-label":c,children:["@",p.name.replace(/\s+/g,"_")]},`${p.id}-${te}`))}else _.push(k);T=te+k.length,J=E.exec(X)}return T<X.length&&_.push(X.slice(T)),_.length===0?X:_},[z,r.content,Y,Q]),O=s.useMemo(()=>{const X=r.attachments;if(!X||X.length===0)return null;const E=r.roomId?`/api/chat/rooms/${encodeURIComponent(r.roomId)}/attachments/`:I?`/api/chat/sessions/${encodeURIComponent(I)}/attachments/`:null;return E?t.jsx("div",{className:"chat-message-attachments",children:X.map(_=>{const T=_.mimeType.startsWith("image/"),J=_.id||_.filename,k=`${E}${encodeURIComponent(_.filename)}`;return T?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:k,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:k,alt:_.originalName})},J):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:k,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(sa,{size:14}),t.jsx("span",{children:_.originalName})]},J)})}):null},[r.attachments,r.roomId,I]),j=s.useMemo(()=>z?S?t.jsxs("div",{className:"chat-message-content chat-message-content--failure",children:[t.jsxs("div",{className:"chat-message-failure-summary-row",children:[t.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),t.jsx("span",{className:"chat-message-failure-label",children:"Response failed"})]}),t.jsx("div",{className:"chat-message-failure-summary",children:S.summary}),(S.errorClass||S.code)&&t.jsxs("div",{className:"chat-message-failure-badges",children:[S.errorClass&&t.jsx("span",{className:"chat-message-failure-badge",children:S.errorClass}),S.code&&t.jsx("span",{className:"chat-message-failure-badge",children:S.code})]}),(S.detail||S.reference)&&t.jsxs("details",{className:"chat-message-failure-details",children:[t.jsxs("summary",{children:[t.jsx(na,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:"Failure details"})]}),S.detail&&t.jsx("pre",{className:"chat-message-failure-detail",children:At(S.detail)}),xa(S.reference)]})]}):d?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:r.content}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(en,{remarkPlugins:[tn],components:an,children:r.content})}):null,[S,d,z,r.content]);return t.jsxs("div",{className:`chat-message chat-message--${r.role}${S?" chat-message--failure":""}`,"data-testid":`chat-message-${r.id}`,"data-message-id":r.id,children:[Z&&t.jsxs("div",{className:"chat-message-avatar",children:[f?t.jsx(dt,{provider:f,size:"sm"}):t.jsx(ut,{size:14}),t.jsx("span",{children:i}),b&&y&&t.jsx("span",{className:"chat-model-tag",children:y})]}),z?j:t.jsx("div",{className:"chat-message-content",children:C}),z&&!S&&(w||N)&&t.jsxs("div",{className:"chat-message-actions",children:[w,N&&t.jsx("button",{type:"button",className:"btn-icon chat-message-scroll-to-top-action","aria-label":"Scroll message to top","data-testid":`chat-message-scroll-to-top-${r.id}`,onClick:()=>N(r.id),children:t.jsx(oa,{size:14})})]}),nn(r.toolCalls),r.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:At(r.thinkingOutput)})]}),O,t.jsx("div",{className:"chat-message-time",children:sn(r.createdAt)})]})});function Ta({projectId:n,addToast:r,experimentalFeatures:d}){s.useEffect(()=>(Rt({view:"ChatView",trigger:is?"route-active":"remount",projectId:n,replayAttempted:!1}),is=!1,()=>{is=!0,Rt({view:"ChatView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{activeSession:i,sessionsLoading:g,messages:b,messagesLoading:y,isStreaming:f,streamingText:I,streamingThinking:Y,streamingToolCalls:Q,selectSession:w,createSession:N,archiveSession:z,deleteSession:S,sendMessage:Z,stopStreaming:C,pendingMessage:O,clearPendingMessage:j,loadMoreMessages:X,hasMoreMessages:E,searchQuery:_,setSearchQuery:T,filteredSessions:J,agentsMap:k}=ua(n,r),[B,te]=s.useState(!1),h=d?.chatRooms===!0,[p,he]=s.useState(()=>{try{if(localStorage.getItem(os)==="rooms"&&h)return"rooms"}catch{}return"direct"}),c=Fn(n,r),{isUnread:re,markRead:se}=_n(n),[$,ue]=s.useState(()=>{const e=qs(p,p==="rooms"?c.activeRoom?.id:i?.id);return Xs(e)}),[be,G]=s.useState(null),[st,K]=s.useState(null),[Ge,ye]=s.useState(null),[Ie,oe]=s.useState(!0),[we,Se]=s.useState(ya),[We,Oe]=s.useState(!1),{agentsMap:ce}=ls(n),me=s.useMemo(()=>k.size>0?k:ce,[ce,k]),{defaultProvider:mt,defaultModelId:ie}=Zs(),le=s.useMemo(()=>({provider:mt,modelId:ie}),[ie,mt]),{skills:$e,loading:Et}=zn(n),[De,Pe]=s.useState(!1),[nt,Ve]=s.useState(""),[Be,Le]=s.useState(0),[Ce,ke]=s.useState(""),[ve,l]=s.useState(!1),[u,v]=s.useState(0),[D,H]=s.useState(-1),[A,ee]=s.useState(!1),[M,U]=s.useState([]),[W,V]=s.useState(!1),[P,q]=s.useState(!1),[ne,je]=s.useState({}),[ht,qe]=s.useState(!1),[ft,at]=s.useState(!1),{pushNav:ds}=Hn(),[,gt]=s.useState(!1),[rn,on]=s.useState({top:0,left:0}),L=Un({projectId:n}),Tt=s.useCallback(e=>{if(!e||!L.mentionActive)return;const a=e.getBoundingClientRect();on({top:a.top-260,left:a.left+8})},[L.mentionActive]),us=s.useRef(null),ms=s.useRef(null),hs=s.useRef(null),fs=s.useRef(null),Ne=s.useRef(!1),It=s.useRef(null),gs=s.useRef(null),Fe=s.useRef(null),pt=s.useRef(0),$t=s.useRef(null),Dt=s.useRef(null),Me=s.useRef(null),ge=s.useRef(null),Pt=s.useRef(null),bt=s.useRef(!1),Re=s.useRef(null),de=s.useRef(null),ps=s.useRef(null),bs=s.useRef([]),Xe=s.useRef(0),rt=s.useRef(new Map),R=On()==="mobile";s.useEffect(()=>{i?.id&&se("direct",i.id,i.lastMessageAt??i.updatedAt)},[i?.id,i?.lastMessageAt,i?.updatedAt,se]),s.useEffect(()=>{c.activeRoom?.id&&se("room",c.activeRoom.id,c.activeRoom.updatedAt)},[c.activeRoom?.id,c.activeRoom?.updatedAt,se]),s.useEffect(()=>{if(!i?.id||b.length===0)return;const e=b[b.length-1];se("direct",i.id,e?.createdAt??i.lastMessageAt??i.updatedAt)},[i?.id,i?.lastMessageAt,i?.updatedAt,se,b]),s.useEffect(()=>{if(!c.activeRoom?.id||c.messages.length===0)return;const e=c.messages[c.messages.length-1];se("room",c.activeRoom.id,e?.createdAt??c.activeRoom.updatedAt)},[se,c.activeRoom?.id,c.activeRoom?.updatedAt,c.messages]),s.useEffect(()=>{try{const e=localStorage.getItem(Vs);if(!e)return;const a=Number.parseInt(e,10);if(Number.isNaN(a))return;const o=Math.max(jt,Math.min(Nt,a));Se(o)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(os);if(e==="direct"){he("direct");return}e==="rooms"&&h&&he("rooms")}catch{}},[h]),s.useEffect(()=>{if(!h&&p==="rooms"){he("direct");return}try{localStorage.setItem(os,p)}catch{}},[h,p]);const fe=qs(p,p==="rooms"?c.activeRoom?.id:i?.id),Lt=s.useRef(fe);s.useEffect(()=>{fe!==Lt.current&&(Lt.current=fe,ue(Xs(fe)))},[fe]),s.useEffect(()=>{if(!(!fe||Lt.current!==fe))try{if($){localStorage.setItem(fe,$);return}localStorage.removeItem(fe)}catch{}},[fe,$]);const ae=h&&p==="rooms"&&!!c.activeRoom,{keyboardOverlap:vs,keyboardOpen:Ft}=Bn({enabled:R&&(!!i||ae)}),xe=s.useMemo(()=>{const e=nt.trim().toLowerCase();return(e?$e.filter(o=>o.name.toLowerCase().includes(e)):$e).slice(0,10)},[$e,nt]),Je=s.useMemo(()=>Array.from(me.values()),[me]),Ae=s.useMemo(()=>!h||p!=="rooms"||!c.activeRoom?null:{roomId:c.activeRoom.id,roomName:c.activeRoom.name,memberIds:new Set(c.activeRoomMembers.map(e=>e.agentId))},[h,p,c.activeRoom,c.activeRoomMembers]),Ke=s.useMemo(()=>{const e=Je.filter(m=>Kn(m.name,Ce));if(!Ae)return e;const a=e.filter(m=>Ae.memberIds.has(m.id));if(Ce.trim().length===0)return a;const o=e.filter(m=>!Ae.memberIds.has(m.id));return[...a,...o]},[Je,Ce,Ae]),_t=s.useMemo(()=>{const e=new Map;for(const a of Je)e.set(a.name.toLowerCase(),a);return e},[Je]);s.useEffect(()=>{Le(0)},[xe]),s.useEffect(()=>{v(0)},[Ce,ve]),s.useEffect(()=>()=>{Me.current!==null&&window.clearTimeout(Me.current)},[]),s.useEffect(()=>{const e=ms.current;if(!e||!E)return;const a=new IntersectionObserver(o=>{o[0].isIntersecting&&X()},{threshold:.1});return a.observe(e),()=>a.disconnect()},[E,X]);const Ye=s.useCallback(()=>ae?c.activeRoom?.id??null:i?.id??null,[ae,c.activeRoom?.id,i?.id]),xs=s.useCallback((e,a)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(a)}"]`):e.querySelector(`.chat-message[data-message-id="${a.replace(/"/g,'\\"')}"]`),[]),vt=s.useCallback(()=>{const e=ge.current,a=Ye();if(!e||!a)return;const o=e.querySelector(".chat-message[data-message-id]"),m=o?.getAttribute("data-message-id")??null,x=o?o.offsetTop-e.scrollTop:0;Dt.current={threadId:a,scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:m,anchorOffset:x,wasPinnedBefore:!Ne.current}},[Ye]),ys=s.useCallback(()=>{const e=ge.current;if(!e)return;const o=e.scrollTop+e.clientHeight>=e.scrollHeight-50;q(!o),Ne.current=!o,vt()},[vt]),Ee=s.useCallback(e=>{if(!e.isConnected)return;let a=0,o=0,m=-1;const x=6,F=()=>{if(e.isConnected){if(e.scrollTop=e.scrollHeight,e.scrollHeight===m?o+=1:(o=0,m=e.scrollHeight),a+=1,a>=x||o>=2){q(!1),Ne.current=!1;return}window.requestAnimationFrame(F)}};F()},[]),it=ae?c.messages:b;s.useLayoutEffect(()=>{const e=ge.current,a=Ye(),o=Dt.current;if(!e||!a||!o||o.threadId!==a||o.wasPinnedBefore)return;let m=o.scrollTop;if(o.anchorMessageId){const x=xs(e,o.anchorMessageId);x?m=x.offsetTop-o.anchorOffset:m=o.scrollTop+(e.scrollHeight-o.scrollHeight)}else m=o.scrollTop+(e.scrollHeight-o.scrollHeight);e.scrollTop=Math.max(0,m),Ne.current=!0,q(!0),Dt.current=null},[it,Ye,xs]);const zt=s.useCallback(e=>{},[it.length,ae]),_e=s.useCallback(e=>{zt(e);const a=ge.current;a&&Ee(a)},[Ee,zt]);s.useLayoutEffect(()=>{Fe.current!==null&&(window.clearTimeout(Fe.current),Fe.current=null);const e=ae?c.activeRoom?.id??null:i?.id??null;if(!e){It.current=null;return}const a={threadId:e,loaded:ae?!c.messagesLoading:!y,hasMessages:ae?c.messages.length>0:b.length>0},o=It.current,m=o?.threadId!==e,x=o?.threadId===e&&!o.loaded&&a.loaded,F=o?.threadId===e&&!o.hasMessages&&a.hasMessages;if(!(o===null||m||x||F))return;const Te=ge.current;if(Te)return zt(m?"thread-change":x?"finished-loading":F?"first-messages":"mount"),Ee(Te),ae||(Fe.current=window.setTimeout(()=>{if(Fe.current=null,Ne.current)return;const Ze=ge.current;Ze&&Ee(Ze)},250)),It.current=a,()=>{Fe.current!==null&&(window.clearTimeout(Fe.current),Fe.current=null)}},[ae,c.activeRoom?.id,c.messages.length,c.messagesLoading,i?.id,b.length,y,Ee]),s.useEffect(()=>{!f||Ne.current||_e("streaming")},[f,I,Y,_e]),s.useEffect(()=>{const e=Ye();if(!e){pt.current=0,$t.current=null;return}if($t.current!==e){$t.current=e,pt.current=it.length;return}const a=pt.current,o=it.length,m=o>a,x=!Ne.current;pt.current=o,m&&x&&_e("new-message")},[it,Ye,_e]),s.useEffect(()=>{vs<=0||!ge.current||_e("keyboard")},[vs,_e]),Gn(R&&Ft),s.useLayoutEffect(()=>{if(!R||!i&&!ae||typeof window>"u")return;const e=Pt.current,a=window.visualViewport;if(!e||!a)return;const o=x=>{if(!(x instanceof HTMLElement))return!1;if(x.tagName==="TEXTAREA")return!0;if(x.tagName!=="INPUT")return!1;const F=x.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(F)},m=()=>{if(bt.current){e.classList.remove("chat-thread--keyboard-active");return}const x=Math.max(0,window.innerHeight-a.offsetTop-a.height),F=a.offsetTop||0;e.style.setProperty("--vv-height",`${a.height}px`),e.style.setProperty("--vv-offset-top",`${F}px`),e.style.setProperty("--keyboard-overlap",`${x}px`);const Ue=(x>0||F>0)&&o(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",Ue)};return m(),a.addEventListener("resize",m),a.addEventListener("scroll",m),document.addEventListener("focusin",m),document.addEventListener("focusout",m),window.addEventListener("pageshow",m),document.addEventListener("visibilitychange",m),()=>{a.removeEventListener("resize",m),a.removeEventListener("scroll",m),document.removeEventListener("focusin",m),document.removeEventListener("focusout",m),window.removeEventListener("pageshow",m),document.removeEventListener("visibilitychange",m),e.classList.remove("chat-thread--keyboard-active")}},[i,R,ae]),s.useEffect(()=>{const e=()=>G(null);if(be)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[be]),s.useEffect(()=>{if(!R||!Ft)return;const e=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[R,Ft]),s.useEffect(()=>{if(!R||!i)return;const e=()=>{const a=de.current;a&&document.activeElement===a&&(a.blur(),window.setTimeout(()=>{a.focus({preventScroll:!0})},0))};return document.addEventListener("visibilitychange",e),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",e),window.removeEventListener("pageshow",e)}},[R,i]),s.useEffect(()=>{const e=gs.current;if(gs.current=p,p!=="direct"||e!==null&&e!=="rooms")return;const a=ge.current;a&&(Ee(a),Ne.current=!1,q(!1))},[p,Ee]),s.useEffect(()=>{if(!i&&!ae||ae&&!R)return;const e=()=>{vt()},a=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",a),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pageshow",e)}},[R,i,ae,vt]),s.useEffect(()=>{if(ae||typeof ResizeObserver>"u")return;const e=ge.current;if(!e)return;const a=new ResizeObserver(()=>{Ne.current||Ee(e)});return a.observe(e),()=>{a.disconnect()}},[ae,Ee,i?.id,p]),s.useEffect(()=>{bs.current=M},[M]),s.useEffect(()=>()=>{for(const e of bs.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of rt.current.values())window.clearTimeout(e);rt.current.clear()},[]);const xt=s.useCallback(e=>{if(!e||e.length===0)return;const a=[];for(const o of Array.from(e)){if(!Sa.includes(o.type))continue;const m=o.type.startsWith("image/");a.push({file:o,previewUrl:m?URL.createObjectURL(o):""})}a.length>0&&U(o=>[...o,...a])},[]),cn=s.useCallback(e=>{U(a=>{const o=a[e];return o?.previewUrl&&URL.revokeObjectURL(o.previewUrl),a.filter((m,x)=>x!==e)})},[]),ln=s.useCallback(e=>{const a=e.clipboardData?.files;if(!a||a.length===0)return;const o=Array.from(a).filter(m=>m.type.startsWith("image/"));o.length!==0&&xt(o)},[xt]),dn=s.useCallback(async e=>{try{await N(e),te(!1),R&&oe(!1)}catch{r("Failed to create chat session","error")}},[N,r,R]),pe=s.useCallback(e=>{const a=e??de.current;a&&(a.style.height="auto",a.style.height=`${ga(a.scrollHeight)}px`)},[]),ws=s.useCallback(e=>{de.current=e,e&&pe(e)},[pe]);s.useLayoutEffect(()=>{pe()},[p,$,i?.id,c.activeRoom?.id,pe]);const Qe=s.useCallback(()=>{if(ue(""),fe)try{localStorage.removeItem(fe)}catch{}Pe(!1),Ve(""),l(!1),ke(""),H(-1),U(e=>{for(const a of e)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[fe]),Ht=s.useCallback(()=>{const e=$.trim(),a=M.map(o=>o.file);if(!(!e&&a.length===0||!i)){if(e==="/clear"||e==="/new"){Qe(),j(),C(),N({agentId:i.agentId,modelProvider:i.modelProvider??void 0,modelId:i.modelId??void 0}).catch(()=>{r("Failed to clear conversation","error")});return}Qe(),Z(e,a)}},[$,M,i,Qe,C,j,N,r,Z]),Ut=s.useCallback(async()=>{const e=$.trim();if(e){if(h&&p==="rooms"){if(!c.activeRoom)return;if(e==="/clear"||e==="/new"){Qe();try{await c.clearRoom(c.activeRoom.id)}catch{r("Failed to clear room conversation","error")}return}const a=$;Qe();try{await c.sendRoomMessage(e,{files:M.map(o=>o.file)})}catch(o){if(o instanceof Wn){const x=o.message.trim()?o.message:"Message sent, but assistant reply failed";r(`Message sent, but assistant reply failed: ${x}`,"error");return}ue(a);const m=o instanceof Error&&o.message.trim()?o.message:"Failed to send room message";r(m,"error")}return}Ht()}},[$,M,h,p,c,c.clearRoom,Qe,r,Ht]),Ot=s.useCallback(e=>{ue(a=>{const o=Js(a);if(!o)return a;const m=`/skill:${e.name} `,x=a.slice(0,o.start)+m+a.slice(o.end);return window.requestAnimationFrame(()=>{de.current&&(pe(de.current),de.current.focus())}),x}),Pe(!1),Ve(""),Le(0)},[pe]),yt=s.useCallback(e=>{const a=de.current;if(!a||D<0)return;const o=a.selectionStart??Xe.current,m=a.selectionEnd??o,x=Math.max(o,m),F=Math.min(D,x),Te=`${`@${e.name.replace(/\s+/g,"_")}`} `,Ze=$.slice(0,F)+Te+$.slice(x),et=F+Te.length;ue(Ze),l(!1),ke(""),v(0),H(-1),window.requestAnimationFrame(()=>{de.current&&(pe(de.current),de.current.focus(),de.current.setSelectionRange(et,et))})},[D,$,pe]),ot=s.useCallback((e,a)=>{const m=de.current?.selectionStart??Xe.current,x=$.lastIndexOf("#",m),F=x>=0?x+a.length:e.length;ue(e),L.dismissMention(),gt(!1),window.requestAnimationFrame(()=>{de.current&&(pe(de.current),de.current.focus(),de.current.setSelectionRange(F,F))})},[L,$,pe]),Ss=s.useCallback(e=>{if(Xe.current=e.currentTarget.selectionStart??Xe.current,L.mentionActive&&L.combinedItems.length>0){if(L.handleKeyDown(e,$),e.key==="Enter"||e.key==="Tab"){const a=L.combinedItems[L.selectedIndex];a?.kind==="task"?ot(L.selectTask(a.task,$),`#${a.task.id}`):a?.kind==="file"&&ot(L.selectFile(a.file,$),`#${a.file.path}`)}return}if(ve&&e.key==="ArrowDown"){e.preventDefault(),Ke.length>0&&v(a=>(a+1)%Ke.length);return}if(ve&&e.key==="ArrowUp"){e.preventDefault(),Ke.length>0&&v(a=>a===0?Ke.length-1:a-1);return}if(ve&&e.key==="Enter"){e.preventDefault();const a=Ke[u]??Ke[0];a&&yt(a);return}if(ve&&e.key==="Escape"){e.preventDefault(),l(!1),ke(""),H(-1);return}if(De&&e.key==="ArrowDown"){e.preventDefault(),xe.length>0&&Le(a=>(a+1)%xe.length);return}if(De&&e.key==="ArrowUp"){e.preventDefault(),xe.length>0&&Le(a=>a===0?xe.length-1:a-1);return}if(De&&(e.key==="Enter"||e.key==="Tab")&&xe.length>0){e.preventDefault();const a=xe[Be]??xe[0];a&&Ot(a);return}if(De&&e.key==="Escape"){e.preventDefault(),Pe(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Ut())},[ve,Ke,u,yt,De,xe,Be,Ot,Ut,L,ot,$]),wt=s.useCallback((e,a)=>{const o=Ca(e,a);if(o){l(!0),ke(o.filter),H(o.start);return}l(!1),ke(""),H(-1)},[]),Cs=s.useCallback(e=>{const a=e.target,o=a.value,m=a.selectionStart??o.length;pe(a),Xe.current=m,ue(o);const x=Js(o);x?(Pe(!0),Ve(x.filter)):(Pe(!1),Ve("")),wt(o,m),L.detectMention(o,m),gt(L.mentionActive),L.mentionActive&&Tt(a)},[wt,pe]),St=s.useCallback(e=>{const a=e.currentTarget,o=a.selectionStart??a.value.length;Xe.current=o,wt(a.value,o),L.detectMention(a.value,o),gt(L.mentionActive),L.mentionActive&&Tt(a)},[wt,L,Tt]),ks=s.useCallback(e=>{e.key!=="Escape"&&St(e)},[St]),js=s.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(bt.current=!0,Re.current!==null&&window.clearTimeout(Re.current),Re.current=window.setTimeout(()=>{bt.current=!1,Re.current=null},450)),Me.current!==null&&window.clearTimeout(Me.current),Me.current=window.setTimeout(()=>{Pe(!1),l(!1),ke(""),H(-1),gt(!1),L.dismissMention(),Me.current=null},120)},[L]),Ns=s.useCallback(()=>{bt.current=!1,Re.current!==null&&(window.clearTimeout(Re.current),Re.current=null),Me.current!==null&&(window.clearTimeout(Me.current),Me.current=null),typeof window<"u"&&window.innerWidth<=768&&queueMicrotask(()=>{(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)})},[]);s.useEffect(()=>()=>{Re.current!==null&&window.clearTimeout(Re.current)},[]);const un=s.useCallback(async e=>{G(null);try{await z(e),r("Conversation archived","success")}catch{r("Failed to archive conversation","error")}},[z,r]),mn=s.useCallback(async e=>{K(null),G(null);try{await S(e),r("Conversation deleted","success")}catch{r("Failed to delete conversation","error")}},[S,r]),ct=s.useCallback(e=>{try{localStorage.setItem(Vs,String(e))}catch{}},[]),hn=s.useCallback(e=>{if(R)return;e.preventDefault(),e.stopPropagation();const a=e.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(e.pointerId);const o=e.clientX,m=we;let x=m;document.body.style.userSelect="none";const F=Te=>{const Ze=Te.clientX-o,et=Math.max(jt,Math.min(Nt,m+Ze));x=et,Se(et),ct(et)},Ue=Te=>{typeof a.releasePointerCapture=="function"&&a.releasePointerCapture(Te.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",F),document.removeEventListener("pointerup",Ue),ct(x)};document.addEventListener("pointermove",F),document.addEventListener("pointerup",Ue)},[R,ct,we]),fn=s.useCallback(e=>{if(R||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const a=e.shiftKey?50:10,o=e.key==="ArrowLeft"?-a:a,m=Math.max(jt,Math.min(Nt,we+o));Se(m),ct(m)},[R,ct,we]),Ms=s.useCallback(e=>{const a=J.find(o=>o.id===e);se("direct",e,a?.lastMessageAt??a?.updatedAt),w(e),qe(!1),R&&oe(!1)},[J,R,se,w]),Bt=s.useCallback(()=>{w(""),oe(!0),qe(!1)},[w]),Kt=s.useCallback(()=>{c.selectRoom(null),oe(!0),qe(!1)},[c]),gn=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(aa,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>te(!0),children:[t.jsx(lt,{size:16}),"New Chat"]})]}),Gt=Ys(i,i?.agentId?me.get(i.agentId)??null:null,le),ze=Ws(Gt?.provider,Gt?.modelId),He=Gt?.provider??null,Wt=!!(i||f||b.length>0),Ct=p==="rooms"?ae:!!i,Rs=s.useRef(Ct);s.useEffect(()=>{const e=Rs.current;Rs.current=Ct,R&&(e||!Ct||ds({type:"view",revert:p==="rooms"?Kt:Bt}))},[p,Bt,Kt,Ct,R,ds]);const Vt=i?.agentId===tt?ze??"Fusion":i?.title||me.get(i?.agentId??"")?.name||i?.agentId||"Chat",As=!!(ze&&ze!==Vt),pn=R&&p==="direct"&&!!i,qt=me.get(i?.agentId??"")?.name||(i?.agentId===tt?ze??"Fusion":i?.agentId?.slice(0,30)??"Fusion"),Xt=!1,Jt=i?.agentId===tt,bn=O.length>50?`${O.slice(0,50)}…`:O,vn=s.useCallback(()=>{ee(e=>!e)},[]);s.useEffect(()=>{if(!ht)return;const e=a=>{hs.current?.contains(a.target)||qe(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[ht]),s.useEffect(()=>{if(!ft)return;const e=o=>{fs.current?.contains(o.target)||at(!1)},a=o=>{o.key==="Escape"&&at(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",a),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",a)}},[ft]),s.useEffect(()=>{(!R||p!=="direct"||Ie)&&qe(!1)},[R,p,Ie]),s.useEffect(()=>{at(!1)},[c.activeRoom?.id]);const Yt=s.useCallback((e,a)=>{const o=rt.current.get(e);o&&window.clearTimeout(o),je(x=>({...x,[e]:a}));const m=window.setTimeout(()=>{je(x=>{const{[e]:F,...Ue}=x;return Ue}),rt.current.delete(e)},2e3);rt.current.set(e,m)},[]),Es=s.useCallback(async(e,a)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(a),Yt(e,"success")}catch{Yt(e,"error")}},[Yt]),xn=s.useCallback((e,a=!1)=>a?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:e}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(en,{remarkPlugins:[tn],components:an,children:e})}),[]),Qt=i?.agentId===tt,Zt=s.useCallback((e,a,o)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${ne[e]==="success"?" chat-message-copy-action--success":""}${ne[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":o??`chat-copy-response-${e}`,"aria-label":ne[e]==="success"?"Response copied":ne[e]==="error"?"Copy failed":"Copy response",onClick:()=>{Es(e,a)},children:ne[e]==="success"?t.jsx(Vn,{size:14}):t.jsx(qn,{size:14})}),[ne,Es]),es=s.useCallback(e=>{const a=ge.current;if(!a)return;const o=`[data-testid="chat-message-${e}"]`,m=a.querySelector(o);if(!m)return;const x=m.getBoundingClientRect().top-a.getBoundingClientRect().top+a.scrollTop,F=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;a.scrollTo({top:x,behavior:F?"auto":"smooth"})},[]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${Ie?"":" chat-sidebar--hidden"}`,style:R?void 0:{width:`${we}px`},children:[h&&t.jsxs("div",{className:"chat-sidebar-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[t.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${p==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":p==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>he("direct"),children:"Direct"}),t.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${p==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":p==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>he("rooms"),children:"Rooms"})]}),!h||p==="direct"?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-sidebar-search-container",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Xn,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:_,onChange:e=>T(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:g?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:"Loading..."}):J.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:"No conversations yet"}):J.map(e=>{const a=i?.id===e.id,o=!a&&re("direct",e.id,e.lastMessageAt??e.updatedAt),m=Ys(e,me.get(e.agentId)??null,le),x=Ws(m?.provider,m?.modelId)??"Fusion";return t.jsxs("div",{className:`chat-session-item${a?" chat-session-item--active":""}`,onClick:()=>Ms(e.id),onContextMenu:F=>{F.preventDefault(),G({sessionId:e.id,x:F.clientX,y:F.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:F=>{F.stopPropagation(),K(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(ns,{size:14})}),t.jsxs("div",{className:"chat-session-title",children:[e.title||"Untitled",o?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":"Unread messages"}):null]}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||"No messages"}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[m?.provider?t.jsx(dt,{provider:m.provider,size:"sm"}):null,t.jsx("span",{children:me.get(e.agentId)?.name||(e.agentId===tt?x:e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?sn(e.updatedAt):""})]})]},e.id)})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!R&&t.jsx("div",{className:"chat-sidebar-rooms-header","data-testid":"chat-sidebar-rooms-header",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>Oe(!0),children:[t.jsx(lt,{size:14}),"Create room"]})}),c.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:"No rooms yet."}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:c.rooms.map(e=>{const a=c.activeRoom?.id===e.id,o=!a&&re("room",e.id,e.updatedAt);return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${a?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{se("room",e.id,e.updatedAt),c.selectRoom(e.id),R&&oe(!1)},onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),se("room",e.id,e.updatedAt),c.selectRoom(e.id),R&&oe(!1))},children:[t.jsxs("span",{className:"chat-room-item-details",children:[t.jsxs("span",{className:"chat-room-item-name-row",children:[t.jsxs("span",{className:"chat-room-item-name",children:["#",e.name]}),o?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":"Unread messages"}):null]}),a?t.jsxs("span",{className:"chat-room-item-meta",children:[c.activeRoomMembers.length," ",c.activeRoomMembers.length===1?"member":"members"]}):null]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":`Delete room ${e.name}`,onClick:m=>{m.stopPropagation(),ye(e.id)},children:t.jsx(ns,{size:14})})]},e.id)})})]}),p==="rooms"?R?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary chat-sidebar-footer-btn","data-testid":"chat-create-room-btn",onClick:()=>Oe(!0),children:[t.jsx(lt,{size:14}),"Create room"]})}):null:t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>te(!0),"data-testid":"chat-new-btn",children:[t.jsx(lt,{size:14}),"New Chat"]})})]}),!R&&Ie&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":jt,"aria-valuemax":Nt,"aria-valuenow":we,"aria-label":"Resize chat sidebar",tabIndex:0,onPointerDown:hn,onKeyDown:fn}),be&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:be.y,left:be.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>un(be.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Jn,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{G(null),K(be.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(ns,{size:14}),"Delete"]})]}),st&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>K(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:()=>K(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void mn(st),children:"Delete"})]})]})}),h&&Ge&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>ye(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Room?"}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:"This action cannot be undone. This room and all its messages will be permanently deleted."}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>ye(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await c.deleteRoom(Ge),ye(null)}catch{r("Failed to delete room","error")}})()},children:"Delete"})]})]})}),h&&p==="rooms"?t.jsxs("div",{ref:Pt,className:"chat-thread",children:[c.activeRoom?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-room-thread-header",children:[R&&t.jsx("button",{className:"btn-icon",onClick:Kt,"data-testid":"chat-back-btn",children:t.jsx(Fs,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:fs,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":ft,onClick:()=>at(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",c.activeRoom.name]}),t.jsx(kt,{size:16,"aria-hidden":"true"})]}),ft&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:c.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===c.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{se("room",e.id,e.updatedAt),c.selectRoom(e.id),at(!1)},children:["#",e.name]},e.id))})]}),t.jsx("div",{className:"chat-room-thread-members",children:c.activeRoomMembers.map(e=>t.jsx(Qs,{agent:me.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:ge,onScroll:ys,children:[c.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:"Loading messages..."}):c.messages.length===0?t.jsx("div",{className:"chat-empty-state",children:"No messages yet. Start the conversation!"}):c.messages.map(e=>{const a=e.senderAgentId?me.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):"You",o={id:e.id,sessionId:e.roomId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:e.attachments,createdAt:e.createdAt};return t.jsx(cs,{message:o,forcePlain:A,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:c.activeRoom?.id??null,mentionAgentsByName:_t,roomContext:Ae,onScrollToTop:es},e.id)}),t.jsx("div",{ref:us})]}),c.activeRoom&&P&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>_e("fab-click"),children:[t.jsx(kt,{size:14}),"Latest"]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:"Select a room or create one"}),c.activeRoom&&t.jsx("div",{className:"chat-input-area",children:t.jsxs("div",{className:"chat-input-row",children:[t.jsxs("div",{className:"chat-input-wrapper",children:[t.jsx("textarea",{ref:ws,className:"chat-input-textarea",placeholder:"Type a message...",value:$,onChange:Cs,onKeyDown:Ss,onKeyUp:ks,onClick:St,onBlur:js,onFocus:Ns,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||_s()&&document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(zs,{agents:Je,filter:Ce,highlightedIndex:u,visible:ve,onSelect:yt,position:"below",roomMemberIds:Ae?.memberIds,roomName:Ae?.roomName})]}),t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{e.pointerType&&e.pointerType!=="mouse"&&e.preventDefault()},onMouseDown:e=>{e.preventDefault()},onClick:()=>{Ut()},disabled:!$.trim(),"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(Hs,{size:16})})]})})]}):t.jsxs("div",{ref:Pt,className:"chat-thread",children:[(Wt||!R)&&t.jsxs("div",{className:"chat-thread-header",children:[R&&Wt&&t.jsx("button",{className:"btn-icon",onClick:Bt,"data-testid":"chat-back-btn",children:t.jsx(Fs,{size:16})}),t.jsx("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:pn?t.jsxs("div",{className:"chat-mobile-session-menu",ref:hs,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":ht,onClick:()=>qe(e=>!e),children:[He?t.jsx(dt,{provider:He,size:"md"}):t.jsx(ut,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Vt}),As&&t.jsx("span",{className:"chat-model-tag",children:ze}),t.jsx(kt,{size:16,"aria-hidden":"true"})]}),ht&&t.jsx("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:J.map(e=>t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${i?.id===e.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${e.id}`,onClick:()=>Ms(e.id),children:t.jsx("span",{className:"chat-mobile-session-option-title",children:e.title||"Untitled"})},e.id))})]}):t.jsxs(t.Fragment,{children:[He?t.jsx(dt,{provider:He,size:"md"}):t.jsx(ut,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Vt}),As&&t.jsx("span",{className:"chat-model-tag",children:ze})]})}),Wt&&t.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${A?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":A?"Show all messages as rendered Markdown":"Show all messages as plain text",onClick:vn,children:A?t.jsx(Yn,{size:14}):t.jsx(Qn,{size:14})}),!R&&t.jsxs("button",{className:"btn btn-sm btn-primary chat-thread-header-new-chat",onClick:()=>te(!0),"data-testid":"chat-thread-new-chat-btn",children:[t.jsx(lt,{size:14}),"New Chat"]})]}),t.jsxs("div",{className:"chat-messages",ref:ge,onScroll:ys,children:[t.jsx("div",{ref:ms,className:"chat-load-more-sentinel",children:E&&y&&t.jsx("div",{className:"chat-loading-older",children:"Loading older messages…"})}),f?t.jsxs(t.Fragment,{children:[b.map(e=>t.jsx(cs,{message:e,forcePlain:A,agentName:qt,hideAssistantIdentity:Jt,showAssistantModelTag:Xt,activeModelTag:ze,activeModelProvider:He,activeSessionId:i?.id??null,mentionAgentsByName:_t,roomContext:null,copyAction:Qt&&e.role==="assistant"?Zt(e.id,e.content):void 0,onScrollToTop:es},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!Jt&&t.jsxs("div",{className:"chat-message-avatar",children:[He?t.jsx(dt,{provider:He,size:"sm"}):t.jsx(ut,{size:14}),t.jsx("span",{children:qt}),Xt]}),I?xn(I,A):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:Y?"Thinking…":"Connecting…"}),Qt&&I&&Zt("__streaming__",I,"chat-copy-response-streaming"),nn(Q),Y&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:At(Y)})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):y?t.jsx("div",{className:"chat-empty-state",children:"Loading messages..."}):b.length===0&&!i?gn():b.length===0&&i?t.jsx("div",{className:"chat-empty-state",children:"No messages yet. Start the conversation!"}):t.jsx(t.Fragment,{children:b.map(e=>t.jsx(cs,{message:e,forcePlain:A,agentName:qt,hideAssistantIdentity:Jt,showAssistantModelTag:Xt,activeModelTag:ze,activeModelProvider:He,activeSessionId:i?.id??null,mentionAgentsByName:_t,roomContext:null,copyAction:Qt&&e.role==="assistant"?Zt(e.id,e.content):void 0,onScrollToTop:es},e.id))}),t.jsx("div",{ref:us})]}),P&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>_e("fab-click"),children:[t.jsx(kt,{size:14}),"Latest"]}),i&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:ps,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{xt(e.target.files),e.target.value=""}}),De&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:Et?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):xe.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:nt?"No skills found":"No skills available"}):xe.map((e,a)=>t.jsxs("button",{type:"button",role:"option","aria-selected":a===Be,className:`chat-skill-menu-item${a===Be?" chat-skill-menu-item--highlighted":""}`,onMouseDown:o=>o.preventDefault(),onMouseEnter:()=>Le(a),onClick:()=>Ot(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))}),M.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:M.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>cn(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":"Attach files",onClick:()=>ps.current?.click(),children:t.jsx(Zn,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${W?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),V(!0)},onDragLeave:()=>V(!1),onDrop:e=>{e.preventDefault(),V(!1),xt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:ws,className:"chat-input-textarea",placeholder:"Type a message...",value:$,onChange:Cs,onKeyDown:Ss,onKeyUp:ks,onClick:St,onBlur:js,onFocus:Ns,onPaste:ln,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||_s()&&document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(zs,{agents:Je,filter:Ce,highlightedIndex:u,visible:ve,onSelect:yt,position:"below",roomMemberIds:Ae?.memberIds,roomName:Ae?.roomName}),t.jsx(ea,{visible:L.mentionActive&&!ve,position:rn,tasks:L.tasks,files:L.files,selectedIndex:L.selectedIndex,onSelectTask:e=>{ot(L.selectTask(e,$),`#${e.id}`)},onSelectFile:e=>{ot(L.selectFile(e,$),`#${e.path}`)},loading:L.loading}),O&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${bn}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:j,children:"×"})]})]}),f?t.jsx("button",{className:"chat-input-stop",onClick:C,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(ta,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{e.pointerType&&e.pointerType!=="mouse"&&e.preventDefault()},onMouseDown:e=>{e.preventDefault()},onClick:()=>{Ht()},disabled:!$.trim()&&M.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(Hs,{size:16})})]})]})]}),h&&t.jsx(ha,{isOpen:We,onClose:()=>Oe(!1),projectId:n,existingRoomNames:c.rooms.map(e=>e.name),onCreate:async e=>{await c.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),p!=="rooms"&&he("rooms"),Oe(!1),R&&oe(!1)}}),B&&t.jsx(ja,{projectId:n,onClose:()=>te(!1),onCreate:dn})]})}export{Ta as ChatView,ga as clampChatInputHeight,Ys as resolveSessionProvider};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{c4 as Ue,c5 as ve,c6 as tt,c7 as me,s as Me,c8 as xe,c9 as ye,ca as Se,cb as Ne,cc as rt,cd as ie,ce as st,cf as nt,cg as at,ch as it,ci as lt,aF as J,cj as le,L as te,S as ct,M as ot,ck as dt,bJ as ut,a as vt,cl as Pe,T as Te,cm as mt,Q as ft,a_ as pt,a$ as ht,af as gt,aA as bt,R as wt}from"./index-tJzhtiGM.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";const fe=500,xt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function ze(e){return e.length<=fe?e:e.slice(-fe)}function ce(e,i){return ze([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function I(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function yt(e){return e?.previewUrl??null}async function ke(e){return st(e)}async function je(e,i){return nt(e,i)}async function St(e){return at(e)}async function Nt(e){return it(e)}async function Ce(e){return lt(e)}function V(e){try{return e()}catch{return null}}function oe(){return typeof V(()=>ve)=="function"&&typeof V(()=>Ue)=="function"}function q(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function kt(e){const[i,o]=r.useState(null),[g,y]=r.useState([]),[x,f]=r.useState([]),[j,A]=r.useState([]),[C,P]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,U]=r.useState(null),_=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-fe).map(I);f(s)}},[]),M=r.useCallback(async()=>{const a=n.current;try{if(oe())if(d){const s=await Ue(d,e);if(n.current!==a)return;_(s)}else{const s=await ve(e);if(n.current!==a)return;y(s),s.length>0&&(U(s[0].config.id),_(s[0]))}else{const s=await ke(e);if(n.current!==a)return;const c=q(s);y([c]),_(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[_,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),A([]),P(!0),u(null),U(null),(async()=>{try{const[c,l]=await Promise.allSettled([oe()?ve(e):ke(e).then(N=>[q(N)]),typeof V(()=>ie)=="function"?ie(e):Ce(e).then(N=>N.map(w=>({name:w.name,command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const w=N[0];oe()&&U(w.config.id),_(w)}}else v=B(c.reason);l.status==="fulfilled"&&A(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&P(!1)}})()},[_,e]),r.useEffect(()=>{const a=d?tt(d,e):typeof V(()=>me)=="function"?me(e):null;if(!a)return;const s=n.current,c=Me(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(I);f(ze(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:I(v);f(w=>ce(w,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:I(v);f(w=>ce(w,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>ce(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(w=>w&&{...w,status:N,runtime:v.pid?{...w.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:w.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=q(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&M()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,M,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{M()},xt);return()=>{clearInterval(a)}},[M,i?.status]);const E=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>xe)=="function")l=await xe(d,e);else{const v=await je({command:a,cwd:s},e);l=q(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>ye)=="function")s=await ye(d,e);else{const c=await St(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),k=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>Se)=="function")s=await Se(d,e);else{const c=await Nt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),T=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>Ne)=="function")c=await Ne(d,a,e);else{const l=await rt({url:a},e);c={url:l.manualUrl??l.previewUrl??l.detectedUrl??null,source:l.manualUrl?"manual":"auto"}}if(n.current!==s)return;o(l=>l?{...l,previewUrl:c.url??void 0}:null),u(null)}catch(c){if(n.current!==s)return;throw u(B(c)),c}},[e,d]),h=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;try{s=await ie(e)}catch{s=(await Ce(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;A(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e]),p=r.useCallback(async(a,s)=>{if(typeof a!="string"&&!d)try{const v=a,N=await je({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),w=q(N);o(w),y([w]),u(null);return}catch(v){throw u(B(v)),v}const c=typeof a=="string"?a:a.command,l=typeof a=="string"?s:a.cwd;await E(c,l)},[e,E,d]),L=r.useCallback(async()=>{await D()},[D]),R=r.useCallback(async()=>{await k()},[k]),z=r.useCallback(async a=>{await T(a)},[T]),$=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await M()},[M]),H=yt(i),b=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:g,logs:x,detectedCommands:j,previewUrl:H,isLoading:C,error:S,startServer:E,stopServer:D,restartServer:k,setPreviewUrl:T,detectCommands:h,refresh:M,candidates:j,serverState:b,loading:C,start:p,stop:L,restart:R,setManualUrl:z,detect:$,refreshStatus:O}}const Ee=500,Le=100;function Fe(e){return e.length>Ee?e.slice(-Ee):e}function $e(e){return e==="stderr"?"stderr":"stdout"}function Z(e){try{return JSON.parse(e.data)}catch{return null}}function ee(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:$e(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function jt(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function de(e,i){if(i.length===0)return e;const o=[...e],g=new Set(e.map(y=>y.id));for(const y of i)g.has(y.id)||(g.add(y.id),o.push(y));return o.sort((y,x)=>y.id-x.id),Fe(o)}function Ct(e,i){const[o,g]=r.useState([]),[y,x]=r.useState(!1),[f,j]=r.useState(!1),[A,C]=r.useState(!1),[P,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),U=r.useRef(0),_=r.useRef(e),M=r.useRef(i),E=r.useRef(0),D=r.useRef(1);(_.current!==e||M.current!==i)&&(_.current=e,M.current=i,d.current++,J({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),n.current=!0,E.current=0,D.current=1,g([]),x(!1),j(!1),C(!1),S(null),u.current&&(u.current(),u.current=null)),r.useEffect(()=>{if(!i){u.current&&(u.current(),u.current=null);return}const L=d.current,R=++U.current;n.current=!1,x(!0);const z=(b,a)=>{const s=Fe(b);g(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;E.current=c,D.current=c+1},$=b=>{if(n.current||d.current!==L||!b||typeof b!="object")return;const a=b.lines;if(!Array.isArray(a))return;if(a.length>0&&typeof a[0]=="string"){const c=a.filter(l=>typeof l=="string").map((l,v)=>jt(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>ee(c,l+1));z(s,s.length)},O=b=>{if(n.current||d.current!==L)return;const a=typeof b.text=="string"?b.text:typeof b.line=="string"?b.line:null;if(!a)return;const s=D.current,c=typeof b.id=="number"&&Number.isFinite(b.id)?b.id:s,l={id:c,text:a,stream:$e(b.stream),timestamp:typeof b.timestamp=="string"?b.timestamp:""};E.current=Math.max(E.current,c),D.current=Math.max(D.current,c+1),g(v=>de(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await le({maxLines:Le},e);if(n.current||d.current!==L||U.current!==R)return;const s=a.lines.map((c,l)=>ee(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==L||U.current!==R)return;z([],null)}finally{!n.current&&d.current===L&&U.current===R&&x(!1)}const b=me(e);u.current=Me(b,{events:{"dev-server:log":a=>{const s=Z(a);s&&O(s)},log:a=>{const s=Z(a);s&&O(s)},history:a=>{const s=Z(a);$(s)},"dev-server:history":a=>{const s=Z(a);$(s)}},onReconnect:()=>{J({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:E.current??null,sseChannel:b,reason:"history-replay"}),!(n.current||d.current!==L)&&le({lastEventId:E.current,maxLines:50},e).then(a=>{if(n.current||d.current!==L)return;const s=a.lines.map((c,l)=>ee(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;E.current=Math.max(E.current,c),D.current=Math.max(D.current,c+1)}g(c=>de(c,s)),S(a.totalLines)}).catch(()=>{})}}),J({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:b})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const T=r.useCallback(async()=>{if(!i||f)return;const L=d.current,R=o.length;j(!0);try{const z=await le({maxLines:Le,offset:R},e);if(n.current||d.current!==L)return;const $=z.lines.map((O,H)=>ee(O,H+1));g(O=>de($,O)),C(z.totalLines>R+$.length),S(z.totalLines)}catch{}finally{j(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{g([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:A,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const Et="This preview appears to block iframe embedding. Open it in a new tab instead.",Lt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Rt="Preview is taking longer than expected and may block iframe embedding.";function _t(e){return e==="blocked"?Et:e==="error"?Lt:null}function Dt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:g=null}=i,y=r.useRef(null),x=r.useRef(null),[f,j]=r.useState("unknown"),[A,C]=r.useState(null),[P]=r.useState(g),S=r.useCallback(()=>{x.current!==null&&(window.clearTimeout(x.current),x.current=null)},[]),u=r.useCallback(k=>{j(k),C(_t(k))},[]),n=r.useCallback(()=>{j("blocked"),C(Rt)},[]);r.useEffect(()=>{if(S(),!e){j("unknown"),C(null);return}j("unknown"),C(null);let k=!1;return queueMicrotask(()=>{k||(j("loading"),C(null))}),()=>{k=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const k=setTimeout(()=>{x.current=null,n()},o);return x.current=k,()=>{clearTimeout(k),x.current===k&&(x.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const k=y.current;if(!k){u("embedded");return}try{if(k.contentWindow?.location?.href==="about:blank"&&k.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),U=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){j("unknown"),C(null);return}j("unknown"),C(null)},[S]);const _=r.useCallback(()=>{S(),j("unknown"),C(null)},[S]),M=_,E=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:E,isBlocked:D,blockReason:A,detectionMethod:P,iframeRef:y,resetEmbedStatus:_,setEmbedStatus:u,retry:M,embedContext:A,handleIframeLoad:d,handleIframeError:U}}const At=/\x1b\[[0-9;]*m/g;function pe(e){return e.replace(At,"")}function Ut(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Mt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pt(e){if(e.stream==="stderr")return"error";const i=pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Tt(e,i){if(!i)return e;const o=new RegExp(`(${Mt(i)})`,"ig"),g=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:g.map((x,f)=>x.toLowerCase()===y?t.jsx("mark",{children:x},`${x}-${f}`):t.jsx("span",{children:x},`${x}-${f}`))})}function zt({entries:e,loading:i,loadingMore:o,hasMore:g,total:y,onLoadMore:x,isRunning:f}){const j=r.useRef(null),A=r.useRef(e.length),C=r.useRef(f),[P,S]=r.useState(!1),[u,n]=r.useState(!1),[d,U]=r.useState(""),[_,M]=r.useState("all"),E=r.useMemo(()=>_==="all"?e:e.filter(p=>Pt(p)===_),[e,_]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?E.filter(L=>pe(L.text).toLowerCase().includes(p)):E},[E,d]),k=D.length,T=r.useCallback(()=>{const p=j.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,L=A.current,R=e.length>L;f&&(!p||!u&&R)&&T(),C.current=f,A.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=j.current;if(!p)return;const R=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!R)},[]);return r.useEffect(()=>{i||e.length===0||!u&&f&&T()},[e,f,u,i,T]),i&&e.length===0?t.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:t.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[t.jsx(te,{size:16,className:"devserver-log-viewer__spinner"}),t.jsx("span",{children:"Loading logs…"})]})}):t.jsxs("section",{className:`devserver-log-viewer${P?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[t.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[t.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[t.jsx("span",{className:"devserver-log-viewer__title",children:"Logs"}),t.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[y!==null?`${e.length}/${y}`:`${e.length}`," lines"]})]}),t.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[t.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[t.jsx("span",{className:"visually-hidden",children:"Filter logs by severity"}),t.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:_,onChange:p=>M(p.target.value),"data-testid":"devserver-log-severity-filter","aria-label":"Filter logs by severity",children:[t.jsx("option",{value:"all",children:"All severities"}),t.jsx("option",{value:"info",children:"Info"}),t.jsx("option",{value:"warn",children:"Warn"}),t.jsx("option",{value:"error",children:"Error"})]})]}),t.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[t.jsx("span",{className:"visually-hidden",children:"Search logs"}),t.jsx(ct,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>U(p.target.value),placeholder:"Search logs","data-testid":"devserver-log-search-input","aria-label":"Search logs"})]}),d.trim().length>0&&t.jsxs("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:[k," match",k===1?"":"es"]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>S(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":P?"Exit fullscreen logs":"Enter fullscreen logs",children:P?t.jsx(ot,{size:14}):t.jsx(dt,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[g&&t.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:t.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:x,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(te,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:j,className:"devserver-log-viewer__content",onScroll:h,"data-testid":"devserver-log-content",children:[!i&&D.length===0&&t.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?"No logs yet. Start the dev server to see output.":E.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const L=pe(p.text),R=Ut(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[R&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:R}),p.stream==="stderr"&&t.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:"ERR"}),t.jsx("span",{className:"devserver-log-text",children:ut(Tt(L,d.trim()))})]},p.id)})]}),u&&f&&t.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:T,"data-testid":"devserver-log-jump-button",children:[t.jsx(vt,{size:14}),"New logs"]})]})]})}const Ft="devserver-preview-iframe";function $t({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:g,blockReason:y,onRetry:x,className:f=Ft,embedContext:j}){const A=y??j??null,[C,P]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(P(d=>d+1),o("loading"))},[i,o,e]);const S=r.useCallback(()=>{const d=g.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[g,o]),u=r.useCallback(d=>{d.stopPropagation(),o("error")},[o]),n=r.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?t.jsxs("div",{className:"devserver-preview-iframe-shell",children:[t.jsx("iframe",{src:e,ref:g,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:S,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${C}`),i==="loading"&&t.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[t.jsx(te,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading preview..."})]}),i==="blocked"&&t.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Preview cannot be embedded"}),A&&t.jsx("p",{className:"devserver-preview-blocked-context",children:A})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),x&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Te,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Unable to load preview"}),A&&t.jsx("p",{className:"devserver-preview-blocked-context",children:A})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),x&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,children:"Retry"})]})]})]}):null}const Re={stopped:{className:"dev-server-status-badge--stopped",label:"Stopped"},starting:{className:"dev-server-status-badge--starting",label:"Starting..."},running:{className:"dev-server-status-badge--running",label:"Running"},stopping:{className:"dev-server-status-badge--starting",label:"Stopping..."},failed:{className:"dev-server-status-badge--failed",label:"Failed"}};let ue=!1;function _e(e){return e instanceof Error?e.message:String(e)}function Oe(e){return e==="."?"root":e}function De(e){return e?e==="root"?".":e:null}function Ae(e,i,o){return!i||e.scriptName!==i?!1:o?Oe(e.cwd)===o:!0}function Ot(e){return e.cwd==="."?"root":e.cwd}function Bt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Xt({addToast:e,projectId:i}){r.useEffect(()=>(J({view:"DevServerView",trigger:ue?"route-active":"remount",projectId:i,replayAttempted:!1}),ue=!1,()=>{ue=!0,J({view:"DevServerView",trigger:"route-inactive",projectId:i,replayAttempted:!1})}),[i]);const{session:o,detectedCommands:g,previewUrl:y,isLoading:x,error:f,startServer:j,stopServer:A,restartServer:C,setPreviewUrl:P,detectCommands:S,refresh:u}=kt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",U=Re[n]??Re.stopped,{entries:_,loading:M,loadingMore:E,hasMore:D,total:k,loadMore:T}=Ct(i,!!i),h=y,p=o?.config?.cwd??null,[L,R]=r.useState(!0),[z,$]=r.useState(""),[O,H]=r.useState(""),[b,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:w,setEmbedStatus:Be,resetEmbedStatus:Q,iframeRef:X,isEmbedded:He,isBlocked:re,blockReason:se,retry:he}=Dt(N),[ge,W]=r.useState(!1),be=r.useRef(w);r.useEffect(()=>{const m=be.current!==w;re&&m&&W(!0),w==="embedded"&&W(!1),be.current=w},[w,re]),r.useEffect(()=>{W(!1)},[h]);const Y=r.useMemo(()=>{if(!b)return null;const m=De(p);return g.find(F=>!(F.scriptName!==b||m&&F.cwd!==m||o?.config?.command&&F.command!==o.config.command))??g.find(F=>Ae(F,b,p))??null},[g,o?.config?.command,b,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(_e(m),"error")})},[e,S]),r.useEffect(()=>{if(b){R(!1);return}R(!0)},[b]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&$(o.config.command);return}if(Y){$(Y.command);return}g.length>0&&$(m=>m.trim().length>0?m:g[0]?.command??"")},[g,Y,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const ne=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),we=r.useCallback(()=>{W(!1),he()},[he]),Ve=r.useCallback(()=>{try{const m=X.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),Q();return}}catch{}if(!(!h||!X.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),X.current.src=m.toString(),W(!1),Q()}catch{X.current.src=h,W(!1),Q()}},[h,X,Q]),K=r.useCallback(async(m,F,ae)=>{c(m);try{await F(),e(ae,"success")}catch(et){e(_e(et),"error")}finally{c(null)}},[e]),We=r.useCallback(m=>{a(m.scriptName),R(!1),$(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),qe=r.useCallback(()=>{a(null),R(!0),e("Cleared selected dev server script.","success")},[e]),Xe=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const F=De(p)??".",ae=Y?.cwd??F;K("start",()=>j(m,ae),"Dev server started.")},Ge=()=>{K("stop",A,"Dev server stopped.")},Je=()=>{K("restart",C,"Dev server restarted.")},Qe=()=>{const m=O.trim(),F=m.length>0?m:null;K("preview",()=>P(F),F?"Preview URL updated.":"Preview URL override cleared.")},Ye=r.useCallback(()=>{f&&u()},[f,u]),Ke=n==="starting"||n==="running"||s!==null,Ie=n==="stopped"||s!==null,Ze=n==="stopped"||n==="starting"||s!==null;return t.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[t.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[t.jsxs("div",{className:"dev-server-header-title",children:[t.jsx(mt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${U.className}`,"data-testid":"dev-server-status-badge",children:U.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Xe,disabled:Ke,"data-testid":"dev-server-start-button",children:[t.jsx(ft,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ge,disabled:Ie,"data-testid":"dev-server-stop-button",children:[t.jsx(pt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Je,disabled:Ze,"data-testid":"dev-server-restart-button",children:[t.jsx(ht,{size:14}),t.jsx("span",{children:s==="restart"?"Restarting...":"Restart"})]})]})]}),t.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Configuration"}),x&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),x&&!o&&g.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(te,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading dev server configuration..."})]}),f&&t.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[t.jsx("p",{children:f}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ye,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),b&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:b}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>R(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:qe,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),L&&g.length===0&&t.jsxs("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:["No dev server scripts detected. Check that your project has a ",t.jsx("code",{children:"package.json"})," with a ",t.jsx("code",{children:"dev"}),", ",t.jsx("code",{children:"start"}),", or similar script."]}),L&&g.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:g.map(m=>{const F=Ae(m,b,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${F?"dev-server-candidate--selected":""}`,onClick:()=>We(m),"data-testid":`dev-server-candidate-${m.scriptName}-${Oe(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:Bt(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:Ot(m)})]},`${m.cwd}::${m.scriptName}::${m.command}`)})})]}),t.jsxs("div",{className:"dev-server-field-group",children:[t.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:"Command"}),t.jsx("input",{id:"dev-server-command",className:"input",value:z,onChange:m=>$(m.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:n==="running"||n==="starting"})]}),(n==="running"||n==="starting")&&o&&t.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[t.jsx("span",{className:"dev-server-label",children:"Running command"}),t.jsx("code",{children:o.config?.command??z})]}),t.jsxs("div",{className:"dev-server-preview-override",children:[t.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:"Preview URL Override"}),t.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:O,onChange:m=>H(m.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Qe,disabled:s==="preview","data-testid":"dev-server-set-preview",children:"Save"})]}),h&&t.jsxs("p",{className:"dev-server-preview-hint",children:["Auto-detected: ",h]})]}),t.jsx("div",{className:"dev-server-content",children:t.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Logs"}),t.jsxs("span",{className:"dev-server-muted",children:[k??_.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(zt,{entries:_,loading:M,loadingMore:E,hasMore:D,total:k,onLoadMore:T,isRunning:d})})]})}),t.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[t.jsxs("div",{className:"devserver-preview-header",children:[t.jsxs("div",{className:"devserver-preview-title",children:[t.jsx(gt,{size:14}),t.jsx("span",{children:"Preview"})]}),t.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:h??"No preview URL","data-testid":"devserver-preview-url-badge",children:["Auto",h?` · ${h}`:" · Not available"]}),t.jsxs("div",{className:"devserver-preview-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(m=>m==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:l==="embedded"?"External only":"Embedded"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Open in new tab",onClick:ne,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(bt,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Ve,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(wt,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":w,"data-embedded":He?"true":"false",children:[!h&&!d&&t.jsx("p",{className:"devserver-preview-empty",children:"Start a dev server to see a live preview here."}),!h&&d&&t.jsx("p",{className:"devserver-preview-empty",children:"No preview URL detected. Start the dev server or set a manual URL to preview your app."}),h&&l==="external"&&t.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[t.jsx("p",{children:"Embedded preview is disabled. Open your app in a separate browser tab."}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ne,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&ge&&re&&t.jsxs("div",{className:w==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[w==="error"?t.jsx(Te,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:w==="error"?"Preview failed":"Preview blocked"}),se&&t.jsx("p",{className:"devserver-preview-blocked-context",children:se})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"Open the preview in a new tab, or retry embedded mode after checking your server settings."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:ne,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:we,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!ge&&t.jsx($t,{url:h,embedStatus:w,onEmbedStatusChange:Be,iframeRef:X,blockReason:se,onRetry:we})]})]})]})}export{Xt as DevServerView};
|
|
1
|
+
import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{c4 as Ue,c5 as ve,c6 as tt,c7 as me,s as Me,c8 as xe,c9 as ye,ca as Se,cb as Ne,cc as rt,cd as ie,ce as st,cf as nt,cg as at,ch as it,ci as lt,aF as J,cj as le,L as te,S as ct,M as ot,ck as dt,bJ as ut,a as vt,cl as Pe,T as Te,cm as mt,Q as ft,a_ as pt,a$ as ht,af as gt,aA as bt,R as wt}from"./index-D4nQgFjo.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";const fe=500,xt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function ze(e){return e.length<=fe?e:e.slice(-fe)}function ce(e,i){return ze([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function I(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function yt(e){return e?.previewUrl??null}async function ke(e){return st(e)}async function je(e,i){return nt(e,i)}async function St(e){return at(e)}async function Nt(e){return it(e)}async function Ce(e){return lt(e)}function V(e){try{return e()}catch{return null}}function oe(){return typeof V(()=>ve)=="function"&&typeof V(()=>Ue)=="function"}function q(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function kt(e){const[i,o]=r.useState(null),[g,y]=r.useState([]),[x,f]=r.useState([]),[j,A]=r.useState([]),[C,P]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,U]=r.useState(null),_=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-fe).map(I);f(s)}},[]),M=r.useCallback(async()=>{const a=n.current;try{if(oe())if(d){const s=await Ue(d,e);if(n.current!==a)return;_(s)}else{const s=await ve(e);if(n.current!==a)return;y(s),s.length>0&&(U(s[0].config.id),_(s[0]))}else{const s=await ke(e);if(n.current!==a)return;const c=q(s);y([c]),_(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[_,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),A([]),P(!0),u(null),U(null),(async()=>{try{const[c,l]=await Promise.allSettled([oe()?ve(e):ke(e).then(N=>[q(N)]),typeof V(()=>ie)=="function"?ie(e):Ce(e).then(N=>N.map(w=>({name:w.name,command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const w=N[0];oe()&&U(w.config.id),_(w)}}else v=B(c.reason);l.status==="fulfilled"&&A(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&P(!1)}})()},[_,e]),r.useEffect(()=>{const a=d?tt(d,e):typeof V(()=>me)=="function"?me(e):null;if(!a)return;const s=n.current,c=Me(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(I);f(ze(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:I(v);f(w=>ce(w,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:I(v);f(w=>ce(w,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>ce(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(w=>w&&{...w,status:N,runtime:v.pid?{...w.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:w.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=q(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&M()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,M,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{M()},xt);return()=>{clearInterval(a)}},[M,i?.status]);const E=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>xe)=="function")l=await xe(d,e);else{const v=await je({command:a,cwd:s},e);l=q(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>ye)=="function")s=await ye(d,e);else{const c=await St(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),k=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>Se)=="function")s=await Se(d,e);else{const c=await Nt(e);s=q(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),T=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>Ne)=="function")c=await Ne(d,a,e);else{const l=await rt({url:a},e);c={url:l.manualUrl??l.previewUrl??l.detectedUrl??null,source:l.manualUrl?"manual":"auto"}}if(n.current!==s)return;o(l=>l?{...l,previewUrl:c.url??void 0}:null),u(null)}catch(c){if(n.current!==s)return;throw u(B(c)),c}},[e,d]),h=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;try{s=await ie(e)}catch{s=(await Ce(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;A(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e]),p=r.useCallback(async(a,s)=>{if(typeof a!="string"&&!d)try{const v=a,N=await je({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),w=q(N);o(w),y([w]),u(null);return}catch(v){throw u(B(v)),v}const c=typeof a=="string"?a:a.command,l=typeof a=="string"?s:a.cwd;await E(c,l)},[e,E,d]),L=r.useCallback(async()=>{await D()},[D]),R=r.useCallback(async()=>{await k()},[k]),z=r.useCallback(async a=>{await T(a)},[T]),$=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await M()},[M]),H=yt(i),b=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:g,logs:x,detectedCommands:j,previewUrl:H,isLoading:C,error:S,startServer:E,stopServer:D,restartServer:k,setPreviewUrl:T,detectCommands:h,refresh:M,candidates:j,serverState:b,loading:C,start:p,stop:L,restart:R,setManualUrl:z,detect:$,refreshStatus:O}}const Ee=500,Le=100;function Fe(e){return e.length>Ee?e.slice(-Ee):e}function $e(e){return e==="stderr"?"stderr":"stdout"}function Z(e){try{return JSON.parse(e.data)}catch{return null}}function ee(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:$e(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function jt(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function de(e,i){if(i.length===0)return e;const o=[...e],g=new Set(e.map(y=>y.id));for(const y of i)g.has(y.id)||(g.add(y.id),o.push(y));return o.sort((y,x)=>y.id-x.id),Fe(o)}function Ct(e,i){const[o,g]=r.useState([]),[y,x]=r.useState(!1),[f,j]=r.useState(!1),[A,C]=r.useState(!1),[P,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),U=r.useRef(0),_=r.useRef(e),M=r.useRef(i),E=r.useRef(0),D=r.useRef(1);(_.current!==e||M.current!==i)&&(_.current=e,M.current=i,d.current++,J({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),n.current=!0,E.current=0,D.current=1,g([]),x(!1),j(!1),C(!1),S(null),u.current&&(u.current(),u.current=null)),r.useEffect(()=>{if(!i){u.current&&(u.current(),u.current=null);return}const L=d.current,R=++U.current;n.current=!1,x(!0);const z=(b,a)=>{const s=Fe(b);g(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;E.current=c,D.current=c+1},$=b=>{if(n.current||d.current!==L||!b||typeof b!="object")return;const a=b.lines;if(!Array.isArray(a))return;if(a.length>0&&typeof a[0]=="string"){const c=a.filter(l=>typeof l=="string").map((l,v)=>jt(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>ee(c,l+1));z(s,s.length)},O=b=>{if(n.current||d.current!==L)return;const a=typeof b.text=="string"?b.text:typeof b.line=="string"?b.line:null;if(!a)return;const s=D.current,c=typeof b.id=="number"&&Number.isFinite(b.id)?b.id:s,l={id:c,text:a,stream:$e(b.stream),timestamp:typeof b.timestamp=="string"?b.timestamp:""};E.current=Math.max(E.current,c),D.current=Math.max(D.current,c+1),g(v=>de(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await le({maxLines:Le},e);if(n.current||d.current!==L||U.current!==R)return;const s=a.lines.map((c,l)=>ee(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==L||U.current!==R)return;z([],null)}finally{!n.current&&d.current===L&&U.current===R&&x(!1)}const b=me(e);u.current=Me(b,{events:{"dev-server:log":a=>{const s=Z(a);s&&O(s)},log:a=>{const s=Z(a);s&&O(s)},history:a=>{const s=Z(a);$(s)},"dev-server:history":a=>{const s=Z(a);$(s)}},onReconnect:()=>{J({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:E.current??null,sseChannel:b,reason:"history-replay"}),!(n.current||d.current!==L)&&le({lastEventId:E.current,maxLines:50},e).then(a=>{if(n.current||d.current!==L)return;const s=a.lines.map((c,l)=>ee(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;E.current=Math.max(E.current,c),D.current=Math.max(D.current,c+1)}g(c=>de(c,s)),S(a.totalLines)}).catch(()=>{})}}),J({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:b})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const T=r.useCallback(async()=>{if(!i||f)return;const L=d.current,R=o.length;j(!0);try{const z=await le({maxLines:Le,offset:R},e);if(n.current||d.current!==L)return;const $=z.lines.map((O,H)=>ee(O,H+1));g(O=>de($,O)),C(z.totalLines>R+$.length),S(z.totalLines)}catch{}finally{j(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{g([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:A,total:P,loadMore:T,clear:h,logs:o,isStreaming:p,clearLogs:h}}const Et="This preview appears to block iframe embedding. Open it in a new tab instead.",Lt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Rt="Preview is taking longer than expected and may block iframe embedding.";function _t(e){return e==="blocked"?Et:e==="error"?Lt:null}function Dt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:g=null}=i,y=r.useRef(null),x=r.useRef(null),[f,j]=r.useState("unknown"),[A,C]=r.useState(null),[P]=r.useState(g),S=r.useCallback(()=>{x.current!==null&&(window.clearTimeout(x.current),x.current=null)},[]),u=r.useCallback(k=>{j(k),C(_t(k))},[]),n=r.useCallback(()=>{j("blocked"),C(Rt)},[]);r.useEffect(()=>{if(S(),!e){j("unknown"),C(null);return}j("unknown"),C(null);let k=!1;return queueMicrotask(()=>{k||(j("loading"),C(null))}),()=>{k=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const k=setTimeout(()=>{x.current=null,n()},o);return x.current=k,()=>{clearTimeout(k),x.current===k&&(x.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const k=y.current;if(!k){u("embedded");return}try{if(k.contentWindow?.location?.href==="about:blank"&&k.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),U=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){j("unknown"),C(null);return}j("unknown"),C(null)},[S]);const _=r.useCallback(()=>{S(),j("unknown"),C(null)},[S]),M=_,E=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:E,isBlocked:D,blockReason:A,detectionMethod:P,iframeRef:y,resetEmbedStatus:_,setEmbedStatus:u,retry:M,embedContext:A,handleIframeLoad:d,handleIframeError:U}}const At=/\x1b\[[0-9;]*m/g;function pe(e){return e.replace(At,"")}function Ut(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Mt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pt(e){if(e.stream==="stderr")return"error";const i=pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Tt(e,i){if(!i)return e;const o=new RegExp(`(${Mt(i)})`,"ig"),g=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:g.map((x,f)=>x.toLowerCase()===y?t.jsx("mark",{children:x},`${x}-${f}`):t.jsx("span",{children:x},`${x}-${f}`))})}function zt({entries:e,loading:i,loadingMore:o,hasMore:g,total:y,onLoadMore:x,isRunning:f}){const j=r.useRef(null),A=r.useRef(e.length),C=r.useRef(f),[P,S]=r.useState(!1),[u,n]=r.useState(!1),[d,U]=r.useState(""),[_,M]=r.useState("all"),E=r.useMemo(()=>_==="all"?e:e.filter(p=>Pt(p)===_),[e,_]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?E.filter(L=>pe(L.text).toLowerCase().includes(p)):E},[E,d]),k=D.length,T=r.useCallback(()=>{const p=j.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,L=A.current,R=e.length>L;f&&(!p||!u&&R)&&T(),C.current=f,A.current=e.length},[e.length,f,u,T]);const h=r.useCallback(()=>{const p=j.current;if(!p)return;const R=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!R)},[]);return r.useEffect(()=>{i||e.length===0||!u&&f&&T()},[e,f,u,i,T]),i&&e.length===0?t.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:t.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[t.jsx(te,{size:16,className:"devserver-log-viewer__spinner"}),t.jsx("span",{children:"Loading logs…"})]})}):t.jsxs("section",{className:`devserver-log-viewer${P?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[t.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[t.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[t.jsx("span",{className:"devserver-log-viewer__title",children:"Logs"}),t.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[y!==null?`${e.length}/${y}`:`${e.length}`," lines"]})]}),t.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[t.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[t.jsx("span",{className:"visually-hidden",children:"Filter logs by severity"}),t.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:_,onChange:p=>M(p.target.value),"data-testid":"devserver-log-severity-filter","aria-label":"Filter logs by severity",children:[t.jsx("option",{value:"all",children:"All severities"}),t.jsx("option",{value:"info",children:"Info"}),t.jsx("option",{value:"warn",children:"Warn"}),t.jsx("option",{value:"error",children:"Error"})]})]}),t.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[t.jsx("span",{className:"visually-hidden",children:"Search logs"}),t.jsx(ct,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>U(p.target.value),placeholder:"Search logs","data-testid":"devserver-log-search-input","aria-label":"Search logs"})]}),d.trim().length>0&&t.jsxs("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:[k," match",k===1?"":"es"]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>S(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":P?"Exit fullscreen logs":"Enter fullscreen logs",children:P?t.jsx(ot,{size:14}):t.jsx(dt,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[g&&t.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:t.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:x,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(te,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:j,className:"devserver-log-viewer__content",onScroll:h,"data-testid":"devserver-log-content",children:[!i&&D.length===0&&t.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?"No logs yet. Start the dev server to see output.":E.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const L=pe(p.text),R=Ut(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[R&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:R}),p.stream==="stderr"&&t.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:"ERR"}),t.jsx("span",{className:"devserver-log-text",children:ut(Tt(L,d.trim()))})]},p.id)})]}),u&&f&&t.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:T,"data-testid":"devserver-log-jump-button",children:[t.jsx(vt,{size:14}),"New logs"]})]})]})}const Ft="devserver-preview-iframe";function $t({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:g,blockReason:y,onRetry:x,className:f=Ft,embedContext:j}){const A=y??j??null,[C,P]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(P(d=>d+1),o("loading"))},[i,o,e]);const S=r.useCallback(()=>{const d=g.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[g,o]),u=r.useCallback(d=>{d.stopPropagation(),o("error")},[o]),n=r.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?t.jsxs("div",{className:"devserver-preview-iframe-shell",children:[t.jsx("iframe",{src:e,ref:g,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:S,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${C}`),i==="loading"&&t.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[t.jsx(te,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading preview..."})]}),i==="blocked"&&t.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Preview cannot be embedded"}),A&&t.jsx("p",{className:"devserver-preview-blocked-context",children:A})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),x&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Te,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Unable to load preview"}),A&&t.jsx("p",{className:"devserver-preview-blocked-context",children:A})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),x&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:x,children:"Retry"})]})]})]}):null}const Re={stopped:{className:"dev-server-status-badge--stopped",label:"Stopped"},starting:{className:"dev-server-status-badge--starting",label:"Starting..."},running:{className:"dev-server-status-badge--running",label:"Running"},stopping:{className:"dev-server-status-badge--starting",label:"Stopping..."},failed:{className:"dev-server-status-badge--failed",label:"Failed"}};let ue=!1;function _e(e){return e instanceof Error?e.message:String(e)}function Oe(e){return e==="."?"root":e}function De(e){return e?e==="root"?".":e:null}function Ae(e,i,o){return!i||e.scriptName!==i?!1:o?Oe(e.cwd)===o:!0}function Ot(e){return e.cwd==="."?"root":e.cwd}function Bt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Xt({addToast:e,projectId:i}){r.useEffect(()=>(J({view:"DevServerView",trigger:ue?"route-active":"remount",projectId:i,replayAttempted:!1}),ue=!1,()=>{ue=!0,J({view:"DevServerView",trigger:"route-inactive",projectId:i,replayAttempted:!1})}),[i]);const{session:o,detectedCommands:g,previewUrl:y,isLoading:x,error:f,startServer:j,stopServer:A,restartServer:C,setPreviewUrl:P,detectCommands:S,refresh:u}=kt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",U=Re[n]??Re.stopped,{entries:_,loading:M,loadingMore:E,hasMore:D,total:k,loadMore:T}=Ct(i,!!i),h=y,p=o?.config?.cwd??null,[L,R]=r.useState(!0),[z,$]=r.useState(""),[O,H]=r.useState(""),[b,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:w,setEmbedStatus:Be,resetEmbedStatus:Q,iframeRef:X,isEmbedded:He,isBlocked:re,blockReason:se,retry:he}=Dt(N),[ge,W]=r.useState(!1),be=r.useRef(w);r.useEffect(()=>{const m=be.current!==w;re&&m&&W(!0),w==="embedded"&&W(!1),be.current=w},[w,re]),r.useEffect(()=>{W(!1)},[h]);const Y=r.useMemo(()=>{if(!b)return null;const m=De(p);return g.find(F=>!(F.scriptName!==b||m&&F.cwd!==m||o?.config?.command&&F.command!==o.config.command))??g.find(F=>Ae(F,b,p))??null},[g,o?.config?.command,b,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(_e(m),"error")})},[e,S]),r.useEffect(()=>{if(b){R(!1);return}R(!0)},[b]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&$(o.config.command);return}if(Y){$(Y.command);return}g.length>0&&$(m=>m.trim().length>0?m:g[0]?.command??"")},[g,Y,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const ne=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),we=r.useCallback(()=>{W(!1),he()},[he]),Ve=r.useCallback(()=>{try{const m=X.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),Q();return}}catch{}if(!(!h||!X.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),X.current.src=m.toString(),W(!1),Q()}catch{X.current.src=h,W(!1),Q()}},[h,X,Q]),K=r.useCallback(async(m,F,ae)=>{c(m);try{await F(),e(ae,"success")}catch(et){e(_e(et),"error")}finally{c(null)}},[e]),We=r.useCallback(m=>{a(m.scriptName),R(!1),$(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),qe=r.useCallback(()=>{a(null),R(!0),e("Cleared selected dev server script.","success")},[e]),Xe=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const F=De(p)??".",ae=Y?.cwd??F;K("start",()=>j(m,ae),"Dev server started.")},Ge=()=>{K("stop",A,"Dev server stopped.")},Je=()=>{K("restart",C,"Dev server restarted.")},Qe=()=>{const m=O.trim(),F=m.length>0?m:null;K("preview",()=>P(F),F?"Preview URL updated.":"Preview URL override cleared.")},Ye=r.useCallback(()=>{f&&u()},[f,u]),Ke=n==="starting"||n==="running"||s!==null,Ie=n==="stopped"||s!==null,Ze=n==="stopped"||n==="starting"||s!==null;return t.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[t.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[t.jsxs("div",{className:"dev-server-header-title",children:[t.jsx(mt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${U.className}`,"data-testid":"dev-server-status-badge",children:U.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Xe,disabled:Ke,"data-testid":"dev-server-start-button",children:[t.jsx(ft,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ge,disabled:Ie,"data-testid":"dev-server-stop-button",children:[t.jsx(pt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Je,disabled:Ze,"data-testid":"dev-server-restart-button",children:[t.jsx(ht,{size:14}),t.jsx("span",{children:s==="restart"?"Restarting...":"Restart"})]})]})]}),t.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Configuration"}),x&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),x&&!o&&g.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(te,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading dev server configuration..."})]}),f&&t.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[t.jsx("p",{children:f}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ye,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),b&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:b}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>R(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:qe,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),L&&g.length===0&&t.jsxs("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:["No dev server scripts detected. Check that your project has a ",t.jsx("code",{children:"package.json"})," with a ",t.jsx("code",{children:"dev"}),", ",t.jsx("code",{children:"start"}),", or similar script."]}),L&&g.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:g.map(m=>{const F=Ae(m,b,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${F?"dev-server-candidate--selected":""}`,onClick:()=>We(m),"data-testid":`dev-server-candidate-${m.scriptName}-${Oe(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:Bt(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:Ot(m)})]},`${m.cwd}::${m.scriptName}::${m.command}`)})})]}),t.jsxs("div",{className:"dev-server-field-group",children:[t.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:"Command"}),t.jsx("input",{id:"dev-server-command",className:"input",value:z,onChange:m=>$(m.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:n==="running"||n==="starting"})]}),(n==="running"||n==="starting")&&o&&t.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[t.jsx("span",{className:"dev-server-label",children:"Running command"}),t.jsx("code",{children:o.config?.command??z})]}),t.jsxs("div",{className:"dev-server-preview-override",children:[t.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:"Preview URL Override"}),t.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:O,onChange:m=>H(m.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Qe,disabled:s==="preview","data-testid":"dev-server-set-preview",children:"Save"})]}),h&&t.jsxs("p",{className:"dev-server-preview-hint",children:["Auto-detected: ",h]})]}),t.jsx("div",{className:"dev-server-content",children:t.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Logs"}),t.jsxs("span",{className:"dev-server-muted",children:[k??_.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(zt,{entries:_,loading:M,loadingMore:E,hasMore:D,total:k,onLoadMore:T,isRunning:d})})]})}),t.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[t.jsxs("div",{className:"devserver-preview-header",children:[t.jsxs("div",{className:"devserver-preview-title",children:[t.jsx(gt,{size:14}),t.jsx("span",{children:"Preview"})]}),t.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:h??"No preview URL","data-testid":"devserver-preview-url-badge",children:["Auto",h?` · ${h}`:" · Not available"]}),t.jsxs("div",{className:"devserver-preview-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(m=>m==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:l==="embedded"?"External only":"Embedded"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Open in new tab",onClick:ne,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(bt,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Ve,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(wt,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":w,"data-embedded":He?"true":"false",children:[!h&&!d&&t.jsx("p",{className:"devserver-preview-empty",children:"Start a dev server to see a live preview here."}),!h&&d&&t.jsx("p",{className:"devserver-preview-empty",children:"No preview URL detected. Start the dev server or set a manual URL to preview your app."}),h&&l==="external"&&t.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[t.jsx("p",{children:"Embedded preview is disabled. Open your app in a separate browser tab."}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ne,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&ge&&re&&t.jsxs("div",{className:w==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[w==="error"?t.jsx(Te,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Pe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:w==="error"?"Preview failed":"Preview blocked"}),se&&t.jsx("p",{className:"devserver-preview-blocked-context",children:se})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"Open the preview in a new tab, or retry embedded mode after checking your server settings."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:ne,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:we,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!ge&&t.jsx($t,{url:h,embedStatus:w,onEmbedStatusChange:Be,iframeRef:X,blockReason:se,onRetry:we})]})]})]})}export{Xt as DevServerView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{eV as N,eW as g,dB as b,b as y,aj as P,ae as H,af as C,L as O,ax as v}from"./index-
|
|
1
|
+
import{r as i,j as r}from"./vendor-react-K0fH_qHe.js";import{eV as N,eW as g,dB as b,b as y,aj as P,ae as H,af as C,L as O,ax as v}from"./index-D4nQgFjo.js";import{F as z}from"./folder-open-BTdhwFQ5.js";function D({value:o,onChange:d,placeholder:m,onInputKeyDown:x,nodeId:l,localNodeId:h}){const[e,n]=i.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1}),a=i.useCallback(async(s,c=!1)=>{n(t=>({...t,loading:!0,error:null}));try{const t=await N(s,c,l,h);n(u=>({...u,loading:!1,currentPath:t.currentPath,parentPath:t.parentPath,entries:t.entries}))}catch(t){n(u=>({...u,loading:!1,error:t instanceof Error?t.message:"Failed to browse directory"}))}},[l,h]),j=i.useCallback(()=>{n(s=>s.isOpen?{...s,isOpen:!1}:{...s,isOpen:!0})},[]);i.useEffect(()=>{e.isOpen&&!e.loading&&e.entries.length===0&&!e.error&&a(o||void 0,e.showHidden)},[e.isOpen,e.loading,e.entries.length,e.error,o,e.showHidden,a,l,h]);const p=i.useCallback(s=>{a(s,e.showHidden)},[a,e.showHidden]),k=i.useCallback(()=>{d(e.currentPath),n(s=>({...s,isOpen:!1}))},[e.currentPath,d]),w=i.useCallback(()=>{n(s=>{const c=!s.showHidden;return{...s,showHidden:c}})},[]);i.useEffect(()=>{e.isOpen&&e.currentPath&&a(e.currentPath,e.showHidden)},[e.showHidden]);const f=e.currentPath?g(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:o,onChange:s=>d(s.target.value),onKeyDown:x,placeholder:m||"/path/to/your/project"}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:j,"aria-label":e.isOpen?"Close directory browser":"Browse directories",children:[e.isOpen?r.jsx(z,{size:16}):r.jsx(b,{size:16}),r.jsx("span",{children:"Browse"})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":"Directory browser",children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:f.map((s,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(y,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>p(s.path),title:s.path,children:s.label})]},s.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>p(e.parentPath),"aria-label":"Go to parent directory",title:"Parent directory",children:[r.jsx(P,{size:14}),r.jsx("span",{children:"Up"})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:w,"aria-label":e.showHidden?"Hide hidden directories":"Show hidden directories",title:e.showHidden?"Hide hidden":"Show hidden",children:[e.showHidden?r.jsx(H,{size:14}):r.jsx(C,{size:14}),r.jsx("span",{children:e.showHidden?"Hide hidden":"Show hidden"})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(O,{size:20,className:"animate-spin"}),r.jsx("span",{children:"Loading…"})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(v,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:"No subdirectories"}):e.entries.map(s=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>p(s.path),role:"treeitem",title:s.path,children:[r.jsx(b,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:s.name}),s.hasChildren&&r.jsx(y,{size:14,className:"directory-picker-entry-arrow"})]},s.path))}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:k,children:"Select"})]})]})]})}export{D};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{a7 as K,a8 as W,a9 as ie,aa as de,ab as G,ac as ue,f as me,ad as he,F as T,ae as fe,af as pe,S as je,X as xe,R as we,ag as ke,ah as X,ai as V,a as Y,b as ge,aj as be}from"./index-tJzhtiGM.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";function ve(n){const{projectId:c,searchQuery:h,includeProjectFiles:a=!0}=n??{},l=c?`${ie.DOCUMENTS_PREFIX}${c}`:null,[o,m]=s.useState(()=>{if(!l)return[];const w=K(l,{maxAgeMs:W});return Array.isArray(w)?w:[]}),[d,i]=s.useState([]),[k,x]=s.useState(()=>o.length===0),[C,b]=s.useState(null),g=s.useRef(null),f=s.useRef(o.length>0),p=s.useRef(null),v=s.useCallback(async()=>{g.current&&g.current.abort();const w=new AbortController;g.current=w;const z=!f.current;z&&x(!0),b(null);const E=de(h?{q:h}:void 0,c),R=a?G(c):Promise.resolve({files:[]}),[j,M]=await Promise.allSettled([E,R]);if(w.signal.aborted)return;let A=null;if(j.status==="fulfilled"){if(m(j.value),l){const y=j.value.length>500?j.value.slice(0,500):j.value;ue(l,y,{maxBytes:5e5})}f.current=!0}else A=j.reason instanceof Error?j.reason.message:String(j.reason);if(M.status==="fulfilled"){const y=M.value.files,L=h?.trim().toLowerCase(),F=L?y.filter(P=>P.name.toLowerCase().includes(L)||P.path.toLowerCase().includes(L)):y;i(F)}b(A),z&&x(!1)},[l,a,c,h]);return s.useEffect(()=>{if(!l){f.current=!1,m([]),x(!0);return}const w=K(l,{maxAgeMs:W});Array.isArray(w)?(m(w),f.current=!0,x(!1)):(f.current=!1,m([]),x(!0))},[l]),s.useEffect(()=>(p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{v()},300),()=>{p.current&&clearTimeout(p.current)}),[v]),s.useEffect(()=>(v(),()=>{g.current&&g.current.abort()}),[]),{documents:o,projectFiles:d,loading:k,error:C,refresh:v}}function Ne(n,c){const[h,a]=s.useState([]),[l,o]=s.useState(!0),[m,d]=s.useState(null),i=s.useRef(null),k=s.useRef(!1),x=c?.showHidden??!1,C=s.useCallback(async b=>{i.current&&i.current.abort();const g=new AbortController;i.current=g;const f=!k.current;f&&o(!0),d(null);try{const p=await G(n,{showHidden:b?.showHidden??x});if(g.signal.aborted)return;a(p.files),k.current=!0}catch(p){if(g.signal.aborted)return;d(p instanceof Error?p.message:String(p))}finally{!g.signal.aborted&&f&&o(!1)}},[n,x]);return s.useEffect(()=>(k.current=!1,C({showHidden:x}),()=>{i.current&&i.current.abort()}),[C,x]),{files:h,loading:l,error:m,refresh:C}}const Se=768;function J(n){return n?new Date(n).toLocaleString():""}function Ce(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(n>=10*1024?0:1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function Fe(n,c=200){return n.length<=c?n:`${n.substring(0,c)}…`}function Ee({document:n,renderMarkdown:c,onToggleMarkdown:h}){const[a,l]=s.useState(!1),o=Fe(n.content),m=n.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(T,{size:14}),e.jsx("span",{className:"document-card-key-text",children:n.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",n.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>l(d=>!d),title:a?"Collapse":"Expand","aria-label":a?"Collapse content":"Expand content",children:a?e.jsx(be,{size:14}):e.jsx(Y,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:n.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:J(n.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${a?" document-card-content--expanded":""}`,children:[a?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:h,"aria-label":c?"Switch to plain text":"Switch to markdown","aria-pressed":c,title:c?"Switch to plain text":"Switch to markdown",children:c?"Markdown":"Plain"})}),c?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(X,{remarkPlugins:[V],children:n.content})})}):e.jsx("pre",{className:"document-card-content-text",children:n.content})]}):e.jsx("p",{className:"document-card-preview",children:o}),m&&!a&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function ye({taskId:n,taskTitle:c,documents:h,onOpenTask:a,renderMarkdownStates:l,onToggleMarkdown:o}){const[m,d]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>d(i=>!i),"aria-expanded":m,"aria-label":`${m?"Collapse":"Expand"} documents for task ${n}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:m?e.jsx(Y,{size:16}):e.jsx(ge,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:n}),e.jsx("span",{className:"documents-group-task-title",children:c||"Untitled"})]}),e.jsxs("span",{className:"documents-group-count",children:[h.length," doc",h.length!==1?"s":""]}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>a(n),"aria-label":`Open task ${n}: ${c||"Untitled"}`,children:"Open task"})]}),m&&e.jsx("div",{className:"documents-group-content",children:h.map(i=>e.jsx(Ee,{document:i,renderMarkdown:l.get(i.id)??!1,onToggleMarkdown:()=>o(i.id)},i.id))})]})}function ze({projectId:n,addToast:c,onOpenDetail:h}){const[a,l]=s.useState("project"),[o,m]=s.useState(""),[d,i]=s.useState(null),[k,x]=s.useState(!1),[C,b]=s.useState(null),[g,f]=s.useState(!1),[p,v]=s.useState(null),[w,z]=s.useState(!1),E=s.useRef(0),R=s.useRef(!1),[j,M]=s.useState(!1),[A,y]=s.useState(new Map),L=a==="tasks"?o.trim():"",{documents:F,loading:P,error:Z,refresh:B}=ve({projectId:n,searchQuery:L||void 0,includeProjectFiles:!1}),{files:S,loading:D,error:I,refresh:O}=Ne(n,{showHidden:k});s.useEffect(()=>{const t=()=>{z(window.innerWidth<=Se)};return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[]),s.useEffect(()=>{R.current=!1,l("project"),i(null),x(!1),b(null),v(null),f(!1),M(!1),y(new Map)},[n]),s.useEffect(()=>{R.current||P||D||(S.length>0?l("project"):F.length>0&&l("tasks"),R.current=!0)},[F.length,P,S.length,D]);const $=s.useMemo(()=>{const t=new Map;for(const r of F){const u=t.get(r.taskId)||[];t.set(r.taskId,[...u,r])}return Array.from(t.entries()).map(([r,u])=>{const N=[...u].sort((oe,le)=>le.updatedAt.localeCompare(oe.updatedAt));return{taskId:r,taskTitle:N[0]?.taskTitle,documents:N,latestUpdated:N[0]?.updatedAt??""}}).sort((r,u)=>u.latestUpdated.localeCompare(r.latestUpdated))},[F]),H=s.useMemo(()=>{const t=o.trim().toLowerCase();return t?S.filter(r=>{const u=r.path.toLowerCase(),N=r.name.toLowerCase();return u.includes(t)||N.includes(t)}):S},[S,o]);s.useEffect(()=>{if(!d)return;S.some(r=>r.path===d.path)||(i(null),b(null),v(null),f(!1))},[S,d]);const ee=s.useCallback(t=>{m(t.target.value)},[]),se=s.useCallback(()=>{m("")},[]),U=s.useCallback(t=>{l(t)},[]),te=s.useCallback(async t=>{try{const r=await me(t,n);h(r)}catch{c(`Failed to open task ${t}`,"error")}},[n,h,c]),ne=s.useCallback(async t=>{i(t),f(!0),v(null),b(null);const r=E.current+1;E.current=r;try{const u=await he("project",t.path,n);if(E.current!==r)return;b(u.content)}catch(u){if(E.current!==r)return;const N=u instanceof Error?u.message:`Failed to open ${t.path}`;v(N),c(N,"error")}finally{E.current===r&&f(!1)}},[n,c]),ae=s.useCallback(()=>{i(null),b(null),v(null),f(!1)},[]),re=s.useCallback(t=>{y(r=>{const u=new Map(r),N=u.get(t)??!1;return u.set(t,!N),u})},[]),_=a==="project"?I:Z,ce=s.useCallback(async()=>{if(a==="project"){await O();return}await B()},[a,O,B]),Q=a==="project"?H.length:F.length,q=a==="project"?"Search project markdown files…":"Search task documents…";return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(T,{size:20}),"Documents"]}),e.jsxs("span",{className:"documents-view-count",children:[Q," result",Q!==1?"s":""]})]}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${a==="project"?" active":""}`,role:"tab","aria-selected":a==="project","aria-label":"Show project markdown files",onClick:()=>U("project"),children:["Project Files",e.jsx("span",{className:"documents-tab-count",children:S.length})]}),e.jsxs("button",{className:`btn documents-tab${a==="tasks"?" active":""}`,role:"tab","aria-selected":a==="tasks","aria-label":"Show task documents",onClick:()=>U("tasks"),children:["Task Documents",e.jsx("span",{className:"documents-tab-count",children:$.length})]})]}),a==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>x(t=>!t),"aria-pressed":k,"aria-label":k?"Hide hidden project files":"Show hidden project files",title:k?"Hide hidden files":"Show hidden files",children:[k?e.jsx(fe,{size:14}):e.jsx(pe,{size:14}),k?"Hide Hidden":"Show Hidden"]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(je,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:q,value:o,onChange:ee,"aria-label":q}),o&&e.jsx("button",{className:"documents-search-clear",onClick:se,"aria-label":"Clear search",children:e.jsx(xe,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:_?e.jsxs("div",{className:"documents-view-error",children:[e.jsxs("p",{children:["Failed to load ",a==="project"?"project files":"task documents",": ",_]}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void ce(),"aria-label":"Retry loading documents",children:[e.jsx(we,{size:16}),"Retry"]})]}):a==="project"?D&&S.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading project markdown files…"})}):H.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsxs("p",{children:['No project markdown files match "',o.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(T,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No Markdown files found in this project."})]})}):e.jsxs("div",{className:`documents-project-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!d)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:H.map(t=>{const r=d?.path===t.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void ne(t),"aria-label":`Open ${t.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:t.name}),e.jsx("span",{className:"markdown-file-item-path",children:t.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[Ce(t.size)," · ",J(t.mtime)]})]})},t.path)})})}),(!w||d)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[w&&d&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:ae,"aria-label":"Back to project files list",children:[e.jsx(ke,{size:14}),"Back to files"]}),d?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:d.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>M(t=>!t),"aria-label":j?"Switch to plain text":"Switch to markdown","aria-pressed":j,title:j?"Switch to plain text":"Switch to markdown",children:j?"Markdown":"Plain"})]}),g?e.jsx("p",{className:"documents-content-state",children:"Loading file content…"}):p?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:p}):j?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(X,{remarkPlugins:[V],children:C??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:C??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:"Select a Markdown file to view its content."})})]})]}):P&&F.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading task documents…"})}):$.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsxs("p",{children:['No task documents match "',o.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(T,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No task documents yet."}),e.jsx("p",{className:"documents-view-empty-hint",children:"Documents are created in task detail tabs."})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:$.map(({taskId:t,taskTitle:r,documents:u})=>e.jsx(ye,{taskId:t,taskTitle:r,documents:u,onOpenTask:te,renderMarkdownStates:A,onToggleMarkdown:re},t))})})})]})}export{ze as DocumentsView};
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{a7 as K,a8 as W,a9 as ie,aa as de,ab as G,ac as ue,f as me,ad as he,F as T,ae as fe,af as pe,S as je,X as xe,R as we,ag as ke,ah as X,ai as V,a as Y,b as ge,aj as be}from"./index-D4nQgFjo.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";function ve(n){const{projectId:c,searchQuery:h,includeProjectFiles:a=!0}=n??{},l=c?`${ie.DOCUMENTS_PREFIX}${c}`:null,[o,m]=s.useState(()=>{if(!l)return[];const w=K(l,{maxAgeMs:W});return Array.isArray(w)?w:[]}),[d,i]=s.useState([]),[k,x]=s.useState(()=>o.length===0),[C,b]=s.useState(null),g=s.useRef(null),f=s.useRef(o.length>0),p=s.useRef(null),v=s.useCallback(async()=>{g.current&&g.current.abort();const w=new AbortController;g.current=w;const z=!f.current;z&&x(!0),b(null);const E=de(h?{q:h}:void 0,c),R=a?G(c):Promise.resolve({files:[]}),[j,M]=await Promise.allSettled([E,R]);if(w.signal.aborted)return;let A=null;if(j.status==="fulfilled"){if(m(j.value),l){const y=j.value.length>500?j.value.slice(0,500):j.value;ue(l,y,{maxBytes:5e5})}f.current=!0}else A=j.reason instanceof Error?j.reason.message:String(j.reason);if(M.status==="fulfilled"){const y=M.value.files,L=h?.trim().toLowerCase(),F=L?y.filter(P=>P.name.toLowerCase().includes(L)||P.path.toLowerCase().includes(L)):y;i(F)}b(A),z&&x(!1)},[l,a,c,h]);return s.useEffect(()=>{if(!l){f.current=!1,m([]),x(!0);return}const w=K(l,{maxAgeMs:W});Array.isArray(w)?(m(w),f.current=!0,x(!1)):(f.current=!1,m([]),x(!0))},[l]),s.useEffect(()=>(p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{v()},300),()=>{p.current&&clearTimeout(p.current)}),[v]),s.useEffect(()=>(v(),()=>{g.current&&g.current.abort()}),[]),{documents:o,projectFiles:d,loading:k,error:C,refresh:v}}function Ne(n,c){const[h,a]=s.useState([]),[l,o]=s.useState(!0),[m,d]=s.useState(null),i=s.useRef(null),k=s.useRef(!1),x=c?.showHidden??!1,C=s.useCallback(async b=>{i.current&&i.current.abort();const g=new AbortController;i.current=g;const f=!k.current;f&&o(!0),d(null);try{const p=await G(n,{showHidden:b?.showHidden??x});if(g.signal.aborted)return;a(p.files),k.current=!0}catch(p){if(g.signal.aborted)return;d(p instanceof Error?p.message:String(p))}finally{!g.signal.aborted&&f&&o(!1)}},[n,x]);return s.useEffect(()=>(k.current=!1,C({showHidden:x}),()=>{i.current&&i.current.abort()}),[C,x]),{files:h,loading:l,error:m,refresh:C}}const Se=768;function J(n){return n?new Date(n).toLocaleString():""}function Ce(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(n>=10*1024?0:1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function Fe(n,c=200){return n.length<=c?n:`${n.substring(0,c)}…`}function Ee({document:n,renderMarkdown:c,onToggleMarkdown:h}){const[a,l]=s.useState(!1),o=Fe(n.content),m=n.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(T,{size:14}),e.jsx("span",{className:"document-card-key-text",children:n.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",n.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>l(d=>!d),title:a?"Collapse":"Expand","aria-label":a?"Collapse content":"Expand content",children:a?e.jsx(be,{size:14}):e.jsx(Y,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:n.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:J(n.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${a?" document-card-content--expanded":""}`,children:[a?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:h,"aria-label":c?"Switch to plain text":"Switch to markdown","aria-pressed":c,title:c?"Switch to plain text":"Switch to markdown",children:c?"Markdown":"Plain"})}),c?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(X,{remarkPlugins:[V],children:n.content})})}):e.jsx("pre",{className:"document-card-content-text",children:n.content})]}):e.jsx("p",{className:"document-card-preview",children:o}),m&&!a&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function ye({taskId:n,taskTitle:c,documents:h,onOpenTask:a,renderMarkdownStates:l,onToggleMarkdown:o}){const[m,d]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>d(i=>!i),"aria-expanded":m,"aria-label":`${m?"Collapse":"Expand"} documents for task ${n}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:m?e.jsx(Y,{size:16}):e.jsx(ge,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:n}),e.jsx("span",{className:"documents-group-task-title",children:c||"Untitled"})]}),e.jsxs("span",{className:"documents-group-count",children:[h.length," doc",h.length!==1?"s":""]}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>a(n),"aria-label":`Open task ${n}: ${c||"Untitled"}`,children:"Open task"})]}),m&&e.jsx("div",{className:"documents-group-content",children:h.map(i=>e.jsx(Ee,{document:i,renderMarkdown:l.get(i.id)??!1,onToggleMarkdown:()=>o(i.id)},i.id))})]})}function ze({projectId:n,addToast:c,onOpenDetail:h}){const[a,l]=s.useState("project"),[o,m]=s.useState(""),[d,i]=s.useState(null),[k,x]=s.useState(!1),[C,b]=s.useState(null),[g,f]=s.useState(!1),[p,v]=s.useState(null),[w,z]=s.useState(!1),E=s.useRef(0),R=s.useRef(!1),[j,M]=s.useState(!1),[A,y]=s.useState(new Map),L=a==="tasks"?o.trim():"",{documents:F,loading:P,error:Z,refresh:B}=ve({projectId:n,searchQuery:L||void 0,includeProjectFiles:!1}),{files:S,loading:D,error:I,refresh:O}=Ne(n,{showHidden:k});s.useEffect(()=>{const t=()=>{z(window.innerWidth<=Se)};return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[]),s.useEffect(()=>{R.current=!1,l("project"),i(null),x(!1),b(null),v(null),f(!1),M(!1),y(new Map)},[n]),s.useEffect(()=>{R.current||P||D||(S.length>0?l("project"):F.length>0&&l("tasks"),R.current=!0)},[F.length,P,S.length,D]);const $=s.useMemo(()=>{const t=new Map;for(const r of F){const u=t.get(r.taskId)||[];t.set(r.taskId,[...u,r])}return Array.from(t.entries()).map(([r,u])=>{const N=[...u].sort((oe,le)=>le.updatedAt.localeCompare(oe.updatedAt));return{taskId:r,taskTitle:N[0]?.taskTitle,documents:N,latestUpdated:N[0]?.updatedAt??""}}).sort((r,u)=>u.latestUpdated.localeCompare(r.latestUpdated))},[F]),H=s.useMemo(()=>{const t=o.trim().toLowerCase();return t?S.filter(r=>{const u=r.path.toLowerCase(),N=r.name.toLowerCase();return u.includes(t)||N.includes(t)}):S},[S,o]);s.useEffect(()=>{if(!d)return;S.some(r=>r.path===d.path)||(i(null),b(null),v(null),f(!1))},[S,d]);const ee=s.useCallback(t=>{m(t.target.value)},[]),se=s.useCallback(()=>{m("")},[]),U=s.useCallback(t=>{l(t)},[]),te=s.useCallback(async t=>{try{const r=await me(t,n);h(r)}catch{c(`Failed to open task ${t}`,"error")}},[n,h,c]),ne=s.useCallback(async t=>{i(t),f(!0),v(null),b(null);const r=E.current+1;E.current=r;try{const u=await he("project",t.path,n);if(E.current!==r)return;b(u.content)}catch(u){if(E.current!==r)return;const N=u instanceof Error?u.message:`Failed to open ${t.path}`;v(N),c(N,"error")}finally{E.current===r&&f(!1)}},[n,c]),ae=s.useCallback(()=>{i(null),b(null),v(null),f(!1)},[]),re=s.useCallback(t=>{y(r=>{const u=new Map(r),N=u.get(t)??!1;return u.set(t,!N),u})},[]),_=a==="project"?I:Z,ce=s.useCallback(async()=>{if(a==="project"){await O();return}await B()},[a,O,B]),Q=a==="project"?H.length:F.length,q=a==="project"?"Search project markdown files…":"Search task documents…";return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(T,{size:20}),"Documents"]}),e.jsxs("span",{className:"documents-view-count",children:[Q," result",Q!==1?"s":""]})]}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${a==="project"?" active":""}`,role:"tab","aria-selected":a==="project","aria-label":"Show project markdown files",onClick:()=>U("project"),children:["Project Files",e.jsx("span",{className:"documents-tab-count",children:S.length})]}),e.jsxs("button",{className:`btn documents-tab${a==="tasks"?" active":""}`,role:"tab","aria-selected":a==="tasks","aria-label":"Show task documents",onClick:()=>U("tasks"),children:["Task Documents",e.jsx("span",{className:"documents-tab-count",children:$.length})]})]}),a==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>x(t=>!t),"aria-pressed":k,"aria-label":k?"Hide hidden project files":"Show hidden project files",title:k?"Hide hidden files":"Show hidden files",children:[k?e.jsx(fe,{size:14}):e.jsx(pe,{size:14}),k?"Hide Hidden":"Show Hidden"]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(je,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:q,value:o,onChange:ee,"aria-label":q}),o&&e.jsx("button",{className:"documents-search-clear",onClick:se,"aria-label":"Clear search",children:e.jsx(xe,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:_?e.jsxs("div",{className:"documents-view-error",children:[e.jsxs("p",{children:["Failed to load ",a==="project"?"project files":"task documents",": ",_]}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void ce(),"aria-label":"Retry loading documents",children:[e.jsx(we,{size:16}),"Retry"]})]}):a==="project"?D&&S.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading project markdown files…"})}):H.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsxs("p",{children:['No project markdown files match "',o.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(T,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No Markdown files found in this project."})]})}):e.jsxs("div",{className:`documents-project-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!d)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:H.map(t=>{const r=d?.path===t.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void ne(t),"aria-label":`Open ${t.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:t.name}),e.jsx("span",{className:"markdown-file-item-path",children:t.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[Ce(t.size)," · ",J(t.mtime)]})]})},t.path)})})}),(!w||d)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[w&&d&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:ae,"aria-label":"Back to project files list",children:[e.jsx(ke,{size:14}),"Back to files"]}),d?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:d.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>M(t=>!t),"aria-label":j?"Switch to plain text":"Switch to markdown","aria-pressed":j,title:j?"Switch to plain text":"Switch to markdown",children:j?"Markdown":"Plain"})]}),g?e.jsx("p",{className:"documents-content-state",children:"Loading file content…"}):p?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:p}):j?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(X,{remarkPlugins:[V],children:C??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:C??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:"Select a Markdown file to view its content."})})]})]}):P&&F.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading task documents…"})}):$.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsxs("p",{children:['No task documents match "',o.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(T,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No task documents yet."}),e.jsx("p",{className:"documents-view-empty-hint",children:"Documents are created in task detail tabs."})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:$.map(({taskId:t,taskTitle:r,documents:u})=>e.jsx(ye,{taskId:t,taskTitle:r,documents:u,onOpenTask:te,renderMarkdownStates:A,onToggleMarkdown:re},t))})})})]})}export{ze as DocumentsView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{a7 as C,a8 as _,a9 as D,aO as W,aP as G,ac as V,aQ as Q,x as Y,aw as J,R as Z,aA as ee}from"./index-
|
|
1
|
+
import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{a7 as C,a8 as _,a9 as D,aO as W,aP as G,ac as V,aQ as Q,x as Y,aw as J,R as Z,aA as ee}from"./index-D4nQgFjo.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";const se=300,te=15e3;function B(r){if(!r.trim())return;const t=Number(r);return Number.isFinite(t)?t:void 0}function N(...r){for(const t of r)if(Array.isArray(t))return t;return[]}function p(r){return typeof r=="object"&&r!==null?r:{}}function K(r){const t=p(r),h=p(t.taskSnapshot);return{id:String(t.id??t.evalId??""),runId:String(t.runId??t.batchId??""),taskId:String(t.taskId??h.taskId??""),taskTitle:String(h.title??t.taskTitle??t.title??"Untitled task"),createdAt:String(t.createdAt??t.timestamp??t.updatedAt??new Date(0).toISOString()),overallScore:typeof t.overallScore=="number"?t.overallScore:null,maxScore:typeof t.maxScore=="number"?t.maxScore:null,categoryScores:N(t.categoryScores,p(t.scores).categories)}}function ae(r){const t=p(r);return{...K(t),rationale:String(t.rationale??t.summary??""),evidence:N(t.evidence,p(t.details).evidence),followUps:N(t.followUps,p(t.recommendations).followUps)}}function re(r){const t=r?.projectId,h=t??"",f=`${D.EVALS_RUNS_PREFIX}${h}`,u=`${D.EVALS_RESULTS_PREFIX}${h}`,v=C(f,{maxAgeMs:_}),S=C(u,{maxAgeMs:_}),m=a.useRef(Array.isArray(v)&&v.length>0||Array.isArray(S)&&S.length>0),[c,E]=a.useState({q:"",runId:"",scoreMin:"",scoreMax:""}),[T,i]=a.useState(()=>Array.isArray(v)?v:[]),[L,R]=a.useState(()=>Array.isArray(S)?S:[]),[d,I]=a.useState(null),[F,s]=a.useState(null),[o,g]=a.useState(0),[b,U]=a.useState(!m.current),[X,z]=a.useState(null),k=a.useRef(0),O=a.useRef(t),w=a.useRef(d);w.current=d;const A=a.useCallback(async()=>{const l=++k.current;m.current||U(!0),z(null);try{const[n,x]=await Promise.all([W({q:c.q||void 0,runId:c.runId||void 0,scoreMin:B(c.scoreMin),scoreMax:B(c.scoreMax),limit:100,offset:0},t),G(t)]);if(l!==k.current)return;const y=N(n.results,n.evals,n.items).map(K);R(y),V(u,y.length>500?y.slice(0,500):y,{maxBytes:5e5}),g(typeof n.count=="number"?n.count:y.length);const $=N(x.runs,x.items).map(q=>{const j=p(q),P=p(j.counts);return{id:String(j.id??""),createdAt:String(j.createdAt??""),completedAt:typeof j.completedAt=="string"?j.completedAt:void 0,status:String(j.status??"pending"),evaluatedTaskCount:typeof P.totalTasks=="number"?P.totalTasks:0}});i($),V(f,$,{maxBytes:5e5}),m.current=!0,w.current&&!y.some(q=>q.id===w.current)&&(I(null),s(null))}catch(n){if(l!==k.current)return;z(n instanceof Error?n.message:"Failed to load evals")}finally{l===k.current&&U(!1)}},[c.q,c.runId,c.scoreMax,c.scoreMin,t,u,f]),M=a.useCallback(async l=>{const n=await Q(l,t),x=n.result??n;s(ae(x))},[t]);a.useEffect(()=>{if(O.current===t)return;O.current=t;const l=C(f,{maxAgeMs:_}),n=C(u,{maxAgeMs:_}),x=Array.isArray(l)&&l.length>0||Array.isArray(n)&&n.length>0;i(Array.isArray(l)?l:[]),R(Array.isArray(n)?n:[]),U(!x),m.current=x},[t,u,f]),a.useEffect(()=>{const l=window.setTimeout(()=>{A()},se);return()=>window.clearTimeout(l)},[A]),a.useEffect(()=>{if(!d){s(null);return}M(d)},[M,d]),a.useEffect(()=>{const l=window.setInterval(()=>{A(),d&&M(d)},te);return()=>window.clearInterval(l)},[M,A,d]);const H=a.useCallback(l=>{w.current=l,I(l)},[]);return{loading:b,error:X,results:L,count:o,runs:T,filters:c,setFilters:E,refresh:A,selectedEvalId:d,setSelectedEvalId:H,selectedEval:F}}function ue({projectId:r,onOpenSettings:t,onOpenTaskDetail:h}){const{loading:f,error:u,results:v,runs:S,filters:m,setFilters:c,selectedEvalId:E,setSelectedEvalId:T,selectedEval:i,refresh:L}=re({projectId:r}),[R,d]=a.useState(!0);a.useEffect(()=>{let s=!1;return Y(r).then(o=>{if(s)return;const g=o.evalSettings?.enabled;d(g??!1)}).catch(()=>{s||d(!1)}),()=>{s=!0}},[r]);const I=v.length>0,F=a.useMemo(()=>v.find(s=>s.id===E)??null,[v,E]);return R?e.jsxs("section",{className:"evals-view","data-testid":"evals-view",children:[e.jsxs("div",{className:"evals-list card",children:[e.jsxs("div",{className:"evals-toolbar",children:[e.jsx("input",{className:"input",placeholder:"Search task or rationale",value:m.q,onChange:s=>c(o=>({...o,q:s.target.value}))}),e.jsxs("select",{className:"select",value:m.runId,onChange:s=>c(o=>({...o,runId:s.target.value})),children:[e.jsx("option",{value:"",children:"All runs"}),S.map(s=>e.jsx("option",{value:s.id,children:s.id},s.id))]}),e.jsx("input",{className:"input",placeholder:"Min score",value:m.scoreMin,onChange:s=>c(o=>({...o,scoreMin:s.target.value}))}),e.jsx("input",{className:"input",placeholder:"Max score",value:m.scoreMax,onChange:s=>c(o=>({...o,scoreMax:s.target.value}))}),e.jsx("button",{className:"btn btn-icon",type:"button",onClick:()=>void L(),"aria-label":"Refresh evals",children:e.jsx(Z,{size:16})})]}),f&&e.jsx("p",{className:"evals-state","data-testid":"evals-loading",children:"Loading evals…"}),u&&e.jsx("p",{className:"evals-state evals-state--error",children:u}),!f&&!u&&!I&&e.jsx("p",{className:"evals-state",children:"No evals yet. Scheduled evals review tasks completed since the last run."}),e.jsx("ul",{className:"evals-results","data-testid":"evals-results",children:v.map(s=>e.jsx("li",{children:e.jsxs("button",{className:`evals-result ${s.id===E?"evals-result--active":""}`,type:"button",onClick:()=>T(s.id),children:[e.jsx("span",{className:"evals-result-title",children:s.taskTitle}),e.jsxs("span",{className:"evals-result-meta",children:[s.taskId," · ",s.runId," · ",s.overallScore??"n/a"]})]})},s.id))})]}),e.jsxs("div",{className:"evals-detail card","data-testid":"evals-detail",children:[!i&&e.jsx("p",{className:"evals-state",children:"Select an evaluation to inspect scores, rationale, and evidence."}),i&&e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"evals-detail-title",children:F?.taskTitle??i.taskTitle}),e.jsxs("p",{className:"evals-result-meta",children:[i.taskId," · ",i.runId]}),e.jsxs("p",{className:"evals-score",children:["Overall score: ",i.overallScore??"n/a"]}),e.jsx("ul",{className:"evals-categories",children:i.categoryScores.map(s=>e.jsxs("li",{children:[s.category,": ",s.finalScore]},s.category))}),e.jsx("p",{className:"evals-rationale",children:i.rationale||"No rationale recorded."}),e.jsxs("div",{children:[e.jsx("h4",{children:"Evidence"}),e.jsx("ul",{className:"evals-links",children:i.evidence.map((s,o)=>{const g=typeof s.metadata?.taskId=="string"?s.metadata.taskId:void 0,b=typeof s.metadata?.url=="string"?s.metadata.url:void 0;return e.jsx("li",{children:g?e.jsx("button",{type:"button",className:"btn",onClick:()=>h?.(g),children:s.ref}):b?e.jsxs("a",{href:b,target:"_blank",rel:"noreferrer",className:"evals-external-link",children:[s.ref,e.jsx(ee,{size:14})]}):e.jsx("span",{children:s.ref})},`${s.ref}-${o}`)})})]}),e.jsxs("div",{children:[e.jsx("h4",{children:"Suggested follow-up tasks"}),e.jsxs("ul",{className:"evals-follow-ups",children:[i.followUps.length===0&&e.jsx("li",{children:"None"}),i.followUps.map(s=>e.jsxs("li",{children:[e.jsx("strong",{children:s.title}),e.jsx("p",{children:s.rationale})]},s.suggestionId))]})]})]})]})]}):e.jsxs("section",{className:"evals-view card","data-testid":"evals-disabled",children:[e.jsx("h2",{className:"evals-title",children:"Scheduled evals are disabled"}),e.jsx("p",{className:"evals-empty-copy",children:"Enable Scheduled Evals to review scored tasks, evidence, and follow-up recommendations."}),e.jsxs("button",{className:"btn btn-primary",type:"button",onClick:()=>t?.("scheduled-evals"),children:[e.jsx(J,{size:16}),"Open Scheduled Evals Settings"]})]})}export{ue as EvalsView};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{bN as F,eD as L,eE as H,eF as V,eG as U,eH as K}from"./index-
|
|
1
|
+
import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{bN as F,eD as L,eE as H,eF as V,eG as U,eH as K}from"./index-D4nQgFjo.js";function fe({value:o,onChange:u,projectId:h,disabled:m=!1,id:g,label:w="Skills"}){const[k,l]=s.useState([]),[c,f]=s.useState(!0);s.useEffect(()=>{let n=!1;return f(!0),F(h).then(p=>{n||l(p)}).catch(()=>{n||l([])}).finally(()=>{n||f(!1)}),()=>{n=!0}},[h]);const j=n=>{o.includes(n)||u([...o,n])},d=n=>{u(o.filter(p=>p!==n))},I=n=>k.find(S=>S.id===n)?.name??n,x=k.filter(n=>!o.includes(n.id));return e.jsxs("div",{className:"skill-multiselect","data-testid":"skill-multiselect",children:[w&&e.jsx("label",{htmlFor:g?`${g}-select`:void 0,className:"skill-multiselect-label",children:w}),o.length>0&&e.jsx("div",{className:"skill-multiselect-chips","data-testid":"skill-chips",children:o.map(n=>e.jsxs("span",{className:"skill-chip","data-testid":`skill-chip-${n}`,children:[e.jsx("span",{className:"skill-chip-name",children:I(n)}),e.jsx("button",{type:"button",className:"skill-chip-remove",onClick:()=>d(n),disabled:m,"aria-label":`Remove ${I(n)}`,"data-testid":`remove-skill-${n}`,children:"×"})]},n))}),e.jsx("div",{className:"skill-multiselect-add",children:c?e.jsx("span",{className:"skill-multiselect-loading","data-testid":"skills-loading",children:"Loading skills…"}):x.length===0?e.jsx("span",{className:"skill-multiselect-empty","data-testid":"skills-empty",children:o.length===0?"No skills discovered":"All skills selected"}):e.jsxs("select",{id:g?`${g}-select`:void 0,className:"select skill-multiselect-dropdown",value:"",onChange:n=>{n.target.value&&(j(n.target.value),n.target.value="")},disabled:m,"data-testid":"skill-dropdown",children:[e.jsx("option",{value:"",children:"Add a skill…"}),x.map(n=>e.jsx("option",{value:n.id,children:n.name},n.id))]})})]})}const B=/(?:^|\/)skills\/([^/]+)\/SKILL\.md$/i;function ye(o){const u=o.trim();if(!u)return o;const h=u.match(B);return h?.[1]?h[1]:u}const Q=`# Soul: Chief Executive Officer
|
|
2
2
|
|
|
3
3
|
I am a strategic leader who connects every decision to business outcomes.
|
|
4
4
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as t,r as g}from"./vendor-react-K0fH_qHe.js";import{J as h}from"./index-
|
|
1
|
+
import{j as t,r as g}from"./vendor-react-K0fH_qHe.js";import{J as h}from"./index-D4nQgFjo.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";const v=5,p=3,x=[{id:"goal-1",title:"Reduce mean review turnaround",status:"active",createdAt:"2026-05-14T09:30:00.000Z"},{id:"goal-2",title:"Raise merge reliability coverage",status:"active",createdAt:"2026-05-15T12:00:00.000Z"},{id:"goal-3",title:"Ship dashboard quality audit",status:"inactive",createdAt:"2026-05-16T08:15:00.000Z"}];function j(n){const[s,i]=g.useState(()=>n??x),[c,o]=g.useState(null),l=g.useMemo(()=>s.filter(e=>e.status==="active").length,[s]);function r(){if(l>=v){o("Cannot activate more than 5 goals. Resolve an active goal before adding another active goal.");return}o(null),i(e=>[...e,{id:`goal-${e.length+1}`,title:`New Goal ${e.length+1}`,status:"active",createdAt:new Date().toISOString()}])}function a(e){const m=s.find(d=>d.id===e);if(!(!m||m.status==="active")){if(l>=v){o("Cannot activate more than 5 goals. Resolve an active goal before activating another.");return}o(null),i(d=>d.map(u=>u.id===e?{...u,status:"active"}:u))}}return{goals:s,activeCount:l,errorMessage:c,addGoal:r,activateGoal:a}}function A({initialGoals:n}){const{goals:s,activeCount:i,errorMessage:c,addGoal:o,activateGoal:l}=j(n),r=i>=p&&i<=v;return t.jsxs("section",{className:"goals-view","data-testid":"goals-view",children:[t.jsxs("header",{className:"goals-header",children:[t.jsxs("div",{children:[t.jsx("h2",{className:"goals-title",children:"Goals"}),t.jsxs("p",{className:"goals-count","data-testid":"goals-active-count",children:[i," active goals"]})]}),t.jsxs("button",{type:"button",className:"btn btn-primary goals-add-button",onClick:o,"data-testid":"goals-add-button",children:[t.jsx(h,{"aria-hidden":"true"}),"Add Goal"]})]}),r?t.jsx("p",{className:"goals-warning",role:"status",children:"Approaching the 5-active goal cap. Keep active goals focused."}):null,c?t.jsx("p",{className:"form-error goals-error",role:"alert",children:c}):null,s.length===0?t.jsx("div",{className:"goals-empty card","data-testid":"goals-empty-state",children:"No goals yet. Add one to begin tracking strategic outcomes."}):t.jsx("div",{className:"goals-list","data-testid":"goals-list",children:s.map(a=>t.jsxs("article",{className:"card goals-card","data-testid":`goal-card-${a.id}`,children:[t.jsxs("div",{className:"goals-card-main",children:[t.jsx("h3",{className:"goals-card-title",children:a.title}),t.jsxs("p",{className:"goals-card-status",children:["Status: ",a.status]})]}),t.jsx("button",{type:"button",className:"btn goals-activate-button",disabled:a.status==="active",onClick:()=>l(a.id),"data-testid":`goal-activate-${a.id}`,children:a.status==="active"?"Active":"Activate"})]},a.id))})]})}export{A as GoalsView};
|