@runfusion/fusion 0.73.0-beta.4 → 0.73.0-beta.6
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 +3558 -1630
- package/dist/child-process-worker.js +2037 -795
- package/dist/client/.vite/manifest.json +265 -265
- package/dist/client/assets/AgentDetailView-CoeSgMXS.css +1 -0
- package/dist/client/assets/{AgentDetailView-BBOL6AgZ.js → AgentDetailView-jg-430Wv.js} +4 -4
- package/dist/client/assets/{AgentPermissionPolicyEditor-DV7OPUhR.js → AgentPermissionPolicyEditor-0iybC0Dg.js} +1 -1
- package/dist/client/assets/AgentPermissionPolicyEditor-CXib-igK.css +1 -0
- package/dist/client/assets/AgentsView-DeVI7IJy.js +24 -0
- package/dist/client/assets/ChatView-BWosYwf6.js +8 -0
- package/dist/client/assets/{CommandCenter-DYWaoYFD.js → CommandCenter-CPpYSmxm.js} +1 -1
- package/dist/client/assets/{DevServerView-BY5up-NA.js → DevServerView-C7Uib0ck.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-fM8MJa2r.js → DirectoryPicker-Ba9x3E72.js} +1 -1
- package/dist/client/assets/{DocumentsView-D2KxsPG_.js → DocumentsView-DkuxxEAC.js} +1 -1
- package/dist/client/assets/{EvalsView-U8dOvTRM.js → EvalsView-DwRsXihY.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-C27y8Y-1.js → ExperimentalAgentOnboardingModal-C2g8TiAY.js} +1 -1
- package/dist/client/assets/{GoalsView-D-2wmy-O.js → GoalsView-hQSajINq.js} +1 -1
- package/dist/client/assets/{InsightsView-zLyuQL_l.js → InsightsView-p7j5T5a8.js} +1 -1
- package/dist/client/assets/{MemoryView-D-tSn48u.js → MemoryView-DoVBk38U.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-DvwmvGEY.js → PiExtensionsManager-DzT94cPg.js} +1 -1
- package/dist/client/assets/{PluginManager-BACOwQAN.js → PluginManager-5DK-HUkf.js} +1 -1
- package/dist/client/assets/{PullRequestView-DULyv21u.js → PullRequestView-c8_Nl91A.js} +1 -1
- package/dist/client/assets/{ReportModal-CUlKMFWa.js → ReportModal-BfNu73zb.js} +5 -5
- package/dist/client/assets/{ResearchView-DM_O3IFc.js → ResearchView-Cc_DZq5v.js} +2 -2
- package/dist/client/assets/{SecretsView-Bq3u_nAf.js → SecretsView-DMETxbnI.js} +1 -1
- package/dist/client/assets/{SessionTerminal-D00ByR6U.js → SessionTerminal-B4c2w5zb.js} +1 -1
- package/dist/client/assets/{SettingsModal-QRaBE1ds.js → SettingsModal-oTMDyzjF.js} +1 -1
- package/dist/client/assets/SettingsModal-vpkxpahA.js +21 -0
- package/dist/client/assets/{SettingsTextareaRow-CHOJ-qHz.js → SettingsTextareaRow-B63cJNsI.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-DriQyd81.js → SetupWizardModal-BZnyRPT7.js} +2 -2
- package/dist/client/assets/{SkillsView-BtDyujiZ.js → SkillsView-DGwWIOqX.js} +1 -1
- package/dist/client/assets/{TodoView-BNHUnz50.js → TodoView-BoLH6qHP.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-BXikFpra.js → WorkflowNodeEditor-DHqpPcSv.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-BNgkFJ_P.css → WorkflowNodeEditor-nCx4nqoL.css} +1 -1
- package/dist/client/assets/{agent-import-generation-B2kYEm1O.js → agent-import-generation-Dl3UAfFr.js} +1 -1
- package/dist/client/assets/app-B4dURBVF.js +13 -0
- package/dist/client/assets/{app-B_HrdDXZ.js → app-DLG7AA6O.js} +3 -3
- package/dist/client/assets/app-DfQxLcCr.js +13 -0
- package/dist/client/assets/app-DxbSLeuH.js +13 -0
- package/dist/client/assets/app-JOLkwq4O.js +13 -0
- package/dist/client/assets/app-R0cG-sq5.js +13 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-B-Efjj4Z.js → architectureDiagram-3BPJPVTR-DRSMeXsR.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-CaOVxrlM.js → blockDiagram-GPEHLZMM-xBxQf_Gy.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-D8aYt5F1.js → c4Diagram-AAUBKEIU-CememwlP.js} +1 -1
- package/dist/client/assets/channel-DwxxVJWv.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-VSDT0J0r.js → chunk-2J33WTMH-B62t8Ow1.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-Chx1wQgD.js → chunk-4BX2VUAB-CHzxnH6A.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-MlqjhIJg.js → chunk-55IACEB6-BXJotoWf.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-BheQNUi8.js → chunk-727SXJPM-DGFhyp03.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-C5EoJhfJ.js → chunk-AQP2D5EJ-C-nRZZBE.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-B8_8qP3j.js → chunk-FMBD7UC4-CFS2iW51.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-BuglCGRx.js → chunk-ND2GUHAM-DFleK3tP.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-B7_06dxp.js → chunk-QZHKN3VN-E7rqTspj.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CU_MxE3u.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CU_MxE3u.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-Cm-ZOycx.js → cose-bilkent-S5V4N54A-VYcUIreA.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-Dj_Gwjpv.js → dagre-BM42HDAG-B4VeH0Nz.js} +1 -1
- package/dist/client/assets/{dashboard-view-B4CRL5Fy.js → dashboard-view-BpeWPcmh.js} +1 -1
- package/dist/client/assets/{dashboard-view-noD9p0Zs.js → dashboard-view-DGcOsOey.js} +1 -1
- package/dist/client/assets/{dashboard-view-pXXSUxG9.js → dashboard-view-DoNpCbHQ.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-C_9BfShy.js → diagram-2AECGRRQ-BM8FU7fY.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-Cmg2qpCj.js → diagram-5GNKFQAL-Do8IJG5T.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-2FNo2HXb.js → diagram-KO2AKTUF-C_-zygdh.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-DgnVeCp-.js → diagram-LMA3HP47-CSPiBke9.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-iAIR50HH.js → diagram-OG6HWLK6-BVuoiZg-.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-Da4I04eN.js → erDiagram-TEJ5UH35-CIY48OYH.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-Bv9r2T0m.js → flowDiagram-I6XJVG4X-B6zav8SR.js} +1 -1
- package/dist/client/assets/{folder-open-CwWtrDh6.js → folder-open-Dc23V8n6.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BMeO84U_.js → ganttDiagram-6RSMTGT7-_F49rUcG.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CWDh_RIb.js → gitGraphDiagram-PVQCEYII-Fk-V-buo.js} +1 -1
- package/dist/client/assets/index-C77ORgtm.css +1 -0
- package/dist/client/assets/index-D8TQBkB7.js +2661 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BAE4KtCL.js → infoDiagram-5YYISTIA-DvnBGHv4.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-C_iXAuOy.js → ishikawaDiagram-YF4QCWOH-Df7TrITT.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-BnxSHwDo.js → journeyDiagram-JHISSGLW-CieUO8Cz.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-DYNRm3Nu.js → kanban-definition-UN3LZRKU-BBR_Cj7I.js} +1 -1
- package/dist/client/assets/{mermaid.core-B3hvDDep.js → mermaid.core-whEVIkYk.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-s7KBEuPD.js → mindmap-definition-RKZ34NQL-utsoG884.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-Cy1_IPUD.js → pieDiagram-4H26LBE5-B6_-ma_S.js} +1 -1
- package/dist/client/assets/{puzzle-DWc6gFQ7.js → puzzle-CY7o6u4N.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DqgVGp41.js → quadrantDiagram-W4KKPZXB-CCAEPNEU.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-CA5-TDeF.js → requirementDiagram-4Y6WPE33-C0rKKe1e.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Cuvi3RgE.js → sankeyDiagram-5OEKKPKP-DpeRsnkc.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Da3GfmGP.js → sequenceDiagram-3UESZ5HK-DWYg86A1.js} +1 -1
- package/dist/client/assets/{shield-alert-_iY63ED4.js → shield-alert-j_jHfoeI.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-CCd2YY9c.js → standing-instructions-template-CCI99V8d.js} +1 -1
- package/dist/client/assets/standing-instructions-template-Ddi_4TIk.css +1 -0
- package/dist/client/assets/{stateDiagram-AJRCARHV-CZ_I9ENR.js → stateDiagram-AJRCARHV-CalOQ-6v.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BomoRVhY.js → stateDiagram-v2-BHNVJYJU-Dd8RLebl.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-C3CYvIuR.js → timeline-definition-PNZ67QCA-D1PZw-aB.js} +1 -1
- package/dist/client/assets/{upload-D0RrO65v.js → upload-CFL3ZlNN.js} +1 -1
- package/dist/client/assets/{users-CGszBY2v.js → users-DGOPLxzy.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-By9fi8NW.js → vennDiagram-CIIHVFJN-DKQAihMR.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-DErnXPkI.js → wardley-L42UT6IY-B_XzYoGe.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DFfXZVPk.js → wardleyDiagram-YWT4CUSO-DBu7IvQK.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-9Y5oZ5mi.js → xychartDiagram-2RQKCTM6-CKrqMXvh.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/extension.js +3188 -1079
- package/dist/migrations/0000_initial.sql +2 -0
- package/dist/migrations/0034_milestone_assertion_provenance.sql +30 -0
- package/dist/migrations/0035_fn_8543_mission_lineage_stop.sql +31 -0
- package/dist/plugin-sdk/index.js +16 -0
- package/package.json +1 -1
- package/skill/fusion/references/extension-tools.md +1 -1
- package/skill/fusion/references/fusion-capabilities.md +1 -1
- package/dist/client/assets/AgentDetailView-C4vItBCo.css +0 -1
- package/dist/client/assets/AgentPermissionPolicyEditor-TpdlOWZW.css +0 -1
- package/dist/client/assets/AgentsView-B6xoAHyV.js +0 -24
- package/dist/client/assets/ChatView-DwVjnxM8.js +0 -8
- package/dist/client/assets/SettingsModal-Bb3pIxiX.js +0 -21
- package/dist/client/assets/app-C6yo-M_n.js +0 -13
- package/dist/client/assets/app-CH8ZgPm4.js +0 -13
- package/dist/client/assets/app-D4DpgDss.js +0 -13
- package/dist/client/assets/app-Qv0blCyY.js +0 -13
- package/dist/client/assets/app-kFdtajPy.js +0 -13
- package/dist/client/assets/channel-5bPK6pTS.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-Dv9RQDqG.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Dv9RQDqG.js +0 -1
- package/dist/client/assets/index-CB3mYxAB.css +0 -1
- package/dist/client/assets/index-CE7C_XsS.js +0 -2661
- package/dist/client/assets/standing-instructions-template-bQJ4X1gH.css +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{r as s,j as t,b as pi}from"./vendor-react-SZ_qB27O.js";import{c as vi,aq as Nt,ao as ft,ap as os,bx as la,d9 as bi,da as wi,db as Yn,au as q,dc as xi,bw as At,dd as St,bq as rs,de as yi,df as ki,dg as Ci,dh as Mi,di as Si,dj as Ri,bc as Ni,cN as cs,dk as xe,aX as Ai,bL as _a,bv as hn,dl as ji,al as fn,dm as Ti,dn as Ei,dp as Ii,bo as Di,aI as Li,b1 as un,W as Pi,cW as Fi,dq as _i,dr as $i,f as Bi,aV as zi,ds as Oi,dt as $a,du as Ba,dv as Ui,dw as Hi,J as Ki,dx as Vi,dy as Wi,dz as Xi,dA as qi,dB as da,y as Gi,q as Yi,u as Qi,dC as Qn,C as an,dD as on,dE as ua,v as ma,P as ut,V as Ji,bt as ha,cZ as fa,cY as Zi,X as eo,aH as to,dF as no,x as ga,bK as so,dG as Jn,dH as pa,dI as Zn,dJ as va,dK as ba,dL as ao,dM as io,bI as wa}from"./index-D8TQBkB7.js";import{u as _e}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as xa}from"./SessionTerminal-B4c2w5zb.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";import"./shield-alert-j_jHfoeI.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 oo=[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]],za=vi("hash",oo);function rn(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function ro(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function es(a,o){const d=ro(),f=o?.warm===!0,l=rn(),m=new Map;let k=!1,C=!1;return{mark(A){k||C||!d||m.has(A)||m.set(A,rn())},complete:A=>{if(!d||k||C){k=!0;return}k=!0,m.set("complete",rn());const D=Array.from(m.entries()).sort((E,v)=>E[1]-v[1]);let i=l;const R={};for(const[E,v]of D)R[E]=Math.max(0,v-i),i=v;const y=Math.max(0,rn()-l);try{console.debug("[room-open]",{roomId:a,warm:f,totalMs:y,phases:R,...A??{}})}catch{}},cancel(){C=!0,k=!0}}}const Fe="fusion:chat-active-room";class Oa extends Error{roomId;constructor(o,d){super(o),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=d}}function ls(a){return[...a].sort((o,d)=>new Date(d.updatedAt).getTime()-new Date(o.updatedAt).getTime())}function Ke(a,o){const d=a.findIndex(l=>l.id===o.id);if(d===-1)return ls([o,...a]);const f=[...a];return f[d]=o,ls(f)}function De(a){try{return JSON.parse(a.data)}catch{return null}}function ts(a){return a.slice().reverse()}function co(a,o,d){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:a,role:"user",content:o,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...d?.length?{attachments:d}:{},createdAt:new Date().toISOString()}}function ya(a,o,d){if(a.some(l=>l.id===o.id))return a;const f=d?a.findIndex(l=>l.id===d):-1;if(f>=0){const l=[...a];return l[f]=o,l}if(o.role==="user"){const l=a.findIndex(m=>m.role==="user"&&m.id.startsWith("temp-")&&m.content.trim()===o.content.trim());if(l>=0){const m=[...a];return m[l]=o,m}}return[...a,o]}function lo(a,o){const{t:d}=_e("app"),f=`${Nt.CHAT_ROOMS}:${a??"global"}`,l=`${Nt.ACTIVE_CHAT_ROOM_ID}:${a??"global"}`,m=s.useCallback(g=>`${Nt.CHAT_ROOM_MESSAGES_PREFIX}${a??"global"}:${g}`,[a]),k=s.useCallback(g=>`${Nt.CHAT_ROOM_MEMBERS_PREFIX}${a??"global"}:${g}`,[a]),[C,w]=s.useState(()=>{const g=ft(f,{maxAgeMs:os});return Array.isArray(g)?g:[]}),[A,D]=s.useState(()=>C.length===0),[i,R]=s.useState(null),[y,E]=s.useState(()=>{const g=ft(l,{maxAgeMs:la});return g?C.find(b=>b.id===g)??null:null}),[v,c]=s.useState([]),[z,N]=s.useState([]),[W,$]=s.useState(!1),H=s.useRef(C),P=s.useRef(y),ee=s.useRef(0),J=s.useRef(a);H.current=C,P.current=y,J.current!==a&&(J.current=a,ee.current+=1);const G=s.useCallback(async g=>{if(!g){c([]),N([]),$(!1);return}const b=es(g.id,{warm:!1});b.mark("select");const S=ft(m(g.id),{maxAgeMs:bi}),h=ft(k(g.id),{maxAgeMs:os}),j=Array.isArray(S)&&S.length>0,_=Array.isArray(h)&&h.length>0;j||_?(b.mark("cache-hit"),j&&(N(S),b.mark("hydrate")),_&&c(h),$(!1)):(N([]),$(!0));try{const[Q,ye]=await Promise.all([wi(g.id,a),Yn(g.id,{limit:100,order:"desc"},a)]);b.mark("members-fetch"),b.mark("messages-fetch"),q(k(g.id),Q.members,{maxBytes:5e5});const se=ts(ye.messages);q(m(g.id),se,{maxBytes:5e5}),P.current?.id===g.id&&(c(Q.members),N(se),b.mark("hydrate"))}catch{!j&&!_&&(c([]),N([]))}finally{$(!1),b.complete({warm:j,membersCached:_})}},[k,m,a]),L=s.useCallback(async()=>{H.current.length===0&&D(!0);try{const g=await xi({},a),b=ls(g.rooms);w(b),q(f,b,{maxBytes:5e5}),R(null);const S=ft(l,{maxAgeMs:la})??At(Fe,a);if(S){const h=b.find(j=>j.id===S)??null;h?(E(h),G(h)):(St(Fe,a),q(l,"",{maxBytes:5e5}))}}catch(g){const b=g instanceof Error?g.message:d("chatRooms.error.failedToLoad","Failed to load chat rooms");R(b),o?.(b,"error")}finally{D(!1)}},[l,o,G,a,f]),B=s.useCallback(g=>{if(!g){P.current=null,E(null),St(Fe,a),q(l,"",{maxBytes:5e5}),G(null);return}const b=H.current.find(S=>S.id===g)??null;P.current=b,E(b),b&&(rs(Fe,b.id,a),q(l,b.id,{maxBytes:5e5}),G(b))},[l,G,a]),Y=s.useCallback(async g=>{const S=(await yi({name:g.name,memberAgentIds:g.memberAgentIds},a)).room;return w(h=>Ke(h,S)),P.current=S,E(S),rs(Fe,S.id,a),q(l,S.id,{maxBytes:5e5}),await G(S),S},[l,G,a]),K=s.useCallback(async(g,b)=>{const h=(await ki(g,b,a)).room;return w(j=>Ke(j,h)),P.current?.id===h.id&&(P.current=h,E(h)),h},[a]),T=s.useCallback(async g=>{await Ci(g,a),w(b=>b.filter(S=>S.id!==g)),q(m(g),[],{maxBytes:5e5}),q(k(g),[],{maxBytes:5e5}),P.current?.id===g&&(P.current=null,E(null),c([]),N([]),St(Fe,a),q(l,"",{maxBytes:5e5}))},[l,k,m,a]),U=s.useCallback(async(g,b)=>{const S=P.current,h=S?.id;if(!h)throw new Error(d("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const j=es(h,{warm:!1}),_=b?.files?.map(se=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:se.name,originalName:se.name,mimeType:se.type||"application/octet-stream",size:se.size,createdAt:new Date().toISOString()})),Q=co(h,g,_?.length?_:b?.attachments);P.current?.id===h&&N(se=>{const ae=[...se,Q];return q(m(h),ae,{maxBytes:5e5}),ae});let ye=!1;try{const se=[];if(b?.files?.length)for(const ce of b.files)try{const I=await Mi(h,ce,a);se.push(I.attachment)}catch{throw new Error(d("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:ce.name}))}const ae=[...b?.attachments??[],...se],ke=await Si(h,{content:g,...ae.length?{attachments:ae}:{}},a);ye=!0,ke.message?.createdAt&&S&&w(ce=>Ke(ce,{...S,updatedAt:ke.message.createdAt})),P.current?.id===h&&N(ce=>{const I=ya(ce,ke.message,Q.id);return q(m(h),I,{maxBytes:5e5}),I});const ge=await Yn(h,{limit:100,order:"desc"},a),Ce=ts(ge.messages);if(q(m(h),Ce,{maxBytes:5e5}),P.current?.id!==h)return;N(Ce),j.mark("hydrate")}catch(se){let ae=null;try{const ge=await Yn(h,{limit:100,order:"desc"},a);ae=ts(ge.messages),q(m(h),ae,{maxBytes:5e5}),P.current?.id===h&&(N(ae),j.mark("hydrate"))}catch{!ye&&P.current?.id===h&&N(ge=>{const Ce=ge.filter(ce=>ce.id!==Q.id);return q(m(h),Ce,{maxBytes:5e5}),Ce})}const ke=ae?.some(ge=>ge.role==="user"&&ge.content.trim()===Q.content.trim());if(ye||ke){const ge=se instanceof Error&&se.message.trim()?se.message:d("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new Oa(ge,h)}throw se}finally{j.complete({source:"send-room-message"})}},[m,a]),M=s.useCallback(async g=>{!g||!H.current.some(b=>b.id===g)||(await Ri(g,a),q(m(g),[],{maxBytes:5e5}),P.current?.id===g&&N([]))},[m,a]);return s.useEffect(()=>{L()},[L]),s.useEffect(()=>{const g=ee.current,b=a?`/api/events?projectId=${encodeURIComponent(a)}`:"/api/events";return Ni(b,{onReconnect:()=>{cs({view:"useChatRooms",trigger:"sse-reconnect",projectId:a,replayAttempted:!1});const S=P.current?.id;if(S){const h=es(S,{warm:!0});h.mark("sse-reconnect-refresh"),L().finally(()=>h.complete({source:"sse-reconnect"}));return}L()},events:{"chat:room:created":S=>{if(ee.current!==g)return;const h=De(S);h&&w(j=>Ke(j,h))},"chat:room:updated":S=>{if(ee.current!==g)return;const h=De(S);h&&(w(j=>Ke(j,h)),P.current?.id===h.id&&(P.current=h,E(h)))},"chat:room:deleted":S=>{if(ee.current!==g)return;const h=De(S);h?.id&&(w(j=>j.filter(_=>_.id!==h.id)),q(m(h.id),[],{maxBytes:5e5}),q(k(h.id),[],{maxBytes:5e5}),P.current?.id===h.id&&(P.current=null,E(null),c([]),N([]),St(Fe,a),q(l,"",{maxBytes:5e5})))},"chat:room:member:added":S=>{if(ee.current!==g)return;const h=De(S);!h||P.current?.id!==h.roomId||c(j=>{if(j.some(Q=>Q.agentId===h.agentId))return j;const _=[...j,h];return q(k(h.roomId),_,{maxBytes:5e5}),_})},"chat:room:member:removed":S=>{if(ee.current!==g)return;const h=De(S);!h||P.current?.id!==h.roomId||c(j=>{const _=j.filter(Q=>Q.agentId!==h.agentId);return q(k(h.roomId),_,{maxBytes:5e5}),_})},"chat:room:message:added":S=>{if(ee.current!==g)return;const h=De(S);h&&(w(j=>{const _=j.find(Q=>Q.id===h.roomId);return _?Ke(j,{..._,updatedAt:h.createdAt}):j}),P.current?.id===h.roomId&&N(j=>{const _=ya(j,h);return _===j?j:(q(m(h.roomId),_,{maxBytes:5e5}),_)}))},"chat:room:message:updated":S=>{if(ee.current!==g)return;const h=De(S);!h||P.current?.id!==h.roomId||N(j=>{const _=j.map(Q=>Q.id===h.id?h:Q);return q(m(h.roomId),_,{maxBytes:5e5}),_})},"chat:room:message:deleted":S=>{if(ee.current!==g)return;const h=De(S);h?.id&&N(j=>{const _=j.filter(ye=>ye.id!==h.id),Q=P.current?.id;return Q&&q(m(Q),_,{maxBytes:5e5}),_})},"chat:room:messages:cleared":S=>{if(ee.current!==g)return;const h=De(S);h?.roomId&&(q(m(h.roomId),[],{maxBytes:5e5}),P.current?.id===h.roomId&&N([]),w(j=>{const _=j.find(Q=>Q.id===h.roomId);return _?Ke(j,{..._,updatedAt:new Date().toISOString()}):j}))}}})},[l,k,m,a,L]),s.useEffect(()=>{y&&(C.some(g=>g.id===y.id)||(P.current=null,E(null),c([]),N([]),St(Fe,a),q(l,"",{maxBytes:5e5})))},[y,l,a,C]),{rooms:C,roomsLoading:A,roomsError:i,activeRoom:y,activeRoomMembers:v,messages:z,messagesLoading:W,selectRoom:B,createRoom:Y,updateRoomSettings:K,deleteRoom:T,sendRoomMessage:U,clearRoom:M,refreshRooms:L}}const Rt={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},ka=200;function ds(a){if(!a)return null;const o=new Date(a).getTime();return Number.isFinite(o)?o:null}function Ua(a){const o=Object.entries(a);if(o.length<=ka)return a;const d=o.map(([f,l])=>({id:f,timestamp:l,value:ds(l)??0})).sort((f,l)=>l.value-f.value).slice(0,ka);return Object.fromEntries(d.map(({id:f,timestamp:l})=>[f,l]))}function cn(a){if(!a)return{};try{const o=JSON.parse(a);if(!o||typeof o!="object")return{};const d={};for(const[f,l]of Object.entries(o))typeof f=="string"&&typeof l=="string"&&(d[f]=l);return Ua(d)}catch{return{}}}function uo(a){const[o,d]=s.useState(()=>{try{return cn(At(Rt.direct,a))}catch{return{}}}),[f,l]=s.useState(()=>{try{return cn(At(Rt.room,a))}catch{return{}}});s.useEffect(()=>{try{d(cn(At(Rt.direct,a)))}catch{d({})}try{l(cn(At(Rt.room,a)))}catch{l({})}},[a]);const m=s.useMemo(()=>({direct:o,room:f}),[o,f]),k=s.useCallback((i,R)=>{const y=Ua(R);try{rs(Rt[i],JSON.stringify(y),a)}catch{}return y},[a]),C=s.useCallback((i,R)=>{if(i==="direct"){d(y=>k(i,R(y)));return}l(y=>k(i,R(y)))},[k]),w=s.useCallback((i,R,y)=>{const E=ds(y);if(E===null)return!1;const v=m[i][R],c=ds(v);return c===null?!0:E>c},[m]),A=s.useCallback((i,R,y)=>{if(!R)return;const E=y??new Date().toISOString();C(i,v=>({...v,[R]:E}))},[C]),D=s.useCallback((i,R)=>{R.length!==0&&C(i,y=>{const E={...y};for(const v of R)v.id&&(E[v.id]=v.lastActivityAt??new Date().toISOString());return E})},[C]);return{isUnread:w,markRead:A,markAllRead:D}}const mo=["",...ji];function Ca({level:a,onChange:o,defaultThinkingLevel:d="off",showTargetSection:f=!0,models:l=[],favoriteProviders:m=[],favoriteModels:k=[],agents:C=[],agentId:w,modelProvider:A,modelId:D,onChangeModel:i,disabled:R=!1}){const{t:y}=_e("app"),[E,v]=s.useState(!1),[c,z]=s.useState(()=>w&&w!==xe?"agent":"model"),N=s.useRef(null),W=a??"",$=A&&D?`${A}/${D}`:"",H=w&&w!==xe?w:"",P=W!==""||f&&(!!$||!!H),ee="chat-thinking-level-listbox";s.useEffect(()=>{if(!E)return;const M=g=>{const b=g.target;if(!(b instanceof Node))return;const S=N.current?.contains(b),h=b instanceof Element&&!!b.closest(".model-combobox-dropdown--portal");!S&&!h&&v(!1)};return document.addEventListener("pointerdown",M),()=>document.removeEventListener("pointerdown",M)},[E]),s.useEffect(()=>{v(!1),z(H?"agent":"model")},[W,H,$]);const J=s.useMemo(()=>C.find(M=>M.id===H),[C,H]),G=M=>M===""?y("modelSelection.thinkingDefault","Default ({{level}})",{level:d??"off"}):y(`models.options.${M}`,M==="xhigh"?"Very High":M.charAt(0).toUpperCase()+M.slice(1)),L=M=>{v(!1),o(M)},B=M=>{const g=M.indexOf("/");g<=0||(v(!1),i?.({modelProvider:M.slice(0,g),modelId:M.slice(g+1)}))},Y=M=>{M&&(v(!1),i?.({agentId:M}))},K=M=>{M.key==="Escape"&&v(!1)},T=(M,g)=>{if(M.key==="Escape"){M.preventDefault(),v(!1);return}(M.key==="Enter"||M.key===" ")&&(M.preventDefault(),L(g))},U=(M,g)=>{if(M.key==="Escape"){M.preventDefault(),v(!1);return}(M.key==="Enter"||M.key===" ")&&(M.preventDefault(),Y(g))};return t.jsxs("div",{className:"chat-thinking-level-root",ref:N,children:[t.jsx("button",{type:"button",className:`btn-icon chat-thinking-btn${P?" chat-thinking-btn--active":""}`,"data-testid":"chat-thinking-btn","aria-haspopup":"dialog","aria-expanded":E,"aria-controls":ee,"aria-label":y("chat.thinkingLevelButton","Thinking level"),title:y("chat.thinkingLevelButton","Thinking level"),disabled:R,onClick:()=>v(M=>!M),onKeyDown:K,children:t.jsx(Ai,{size:16})}),E?t.jsxs("div",{className:"chat-thinking-popover",role:"presentation","data-testid":"chat-thinking-popover",children:[f?t.jsxs("section",{className:"chat-thinking-target-section","aria-label":y("chat.modelAgentSection","Model / Agent"),children:[t.jsx("div",{className:"chat-thinking-section-title",children:y("chat.modelAgentSection","Model / Agent")}),t.jsxs("div",{className:"chat-thinking-mode-toggle","data-testid":"chat-thinking-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-thinking-mode-btn${c==="model"?" chat-thinking-mode-btn--active":""}`,"data-testid":"chat-thinking-mode-model",onClick:()=>z("model"),children:y("chat.newChatModeModel","Model")}),t.jsx("button",{type:"button",className:`chat-thinking-mode-btn${c==="agent"?" chat-thinking-mode-btn--active":""}`,"data-testid":"chat-thinking-mode-agent",onClick:()=>z("agent"),children:y("chat.newChatModeAgent","Agent")})]}),c==="model"?t.jsxs("div",{className:"chat-thinking-model-picker","data-testid":"chat-thinking-model-picker",children:[t.jsx(_a,{models:l,value:$,onChange:B,label:y("chat.newChatModeModel","Model"),placeholder:y("chat.selectModel","Select a model"),disabled:!i||l.length===0,favoriteProviders:m,favoriteModels:k,menuWidth:"readable"}),l.length===0?t.jsx("div",{className:"chat-thinking-empty","data-testid":"chat-thinking-model-empty",children:y("chat.noModelsAvailable","No models available")}):null]}):t.jsx("div",{className:"chat-thinking-agent-list","data-testid":"chat-thinking-agent-list",children:C.length===0?t.jsx("div",{className:"chat-thinking-empty","data-testid":"chat-thinking-agent-empty",children:y("chat.noAgentsAvailable","No agents available")}):C.map(M=>{const g=H===M.id;return t.jsxs("button",{type:"button",className:`chat-thinking-agent-item${g?" chat-thinking-agent-item--selected":""}`,"data-testid":`chat-thinking-agent-${M.id}`,"aria-pressed":g,disabled:!i,onClick:()=>Y(M.id),onKeyDown:b=>U(b,M.id),children:[t.jsx(hn,{size:16}),t.jsx("span",{className:"chat-thinking-agent-name",children:M.name||M.id}),M.role?t.jsx("span",{className:"chat-thinking-agent-role",children:M.role}):null]},M.id)})}),J?t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-agent",children:y("chat.currentAgentTarget","Current agent: {{name}}",{name:J.name||J.id})}):$?t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-model",children:y("chat.currentModelTarget","Current model: {{model}}",{model:$})}):t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-default",children:y("chat.currentDefaultTarget","Using the default chat target")})]}):null,t.jsxs("section",{className:"chat-thinking-level-section","aria-label":y("chat.thinkingLevelButton","Thinking level"),children:[t.jsx("div",{className:"chat-thinking-section-title",children:y("chat.thinkingLevelSection","Thinking level")}),t.jsx("div",{id:ee,className:"chat-thinking-popover-list",role:"listbox","aria-label":y("chat.thinkingLevelButton","Thinking level"),children:mo.map(M=>{const g=W===M;return t.jsx("button",{type:"button",role:"option","aria-selected":g,className:`chat-thinking-popover-option${g?" active":""}`,"data-testid":`chat-thinking-option-${M||"default"}`,onClick:()=>L(M),onKeyDown:b=>T(b,M),children:G(M)},M||"default")})})]})]}):null]})}function Ma(a){return a.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function Ha(a,o){const d=o.trim();if(!d)return!0;const f=Ma(d);return Ma(a).includes(f)||a.toLowerCase().includes(d.toLowerCase())}function Sa({agents:a,filter:o,highlightedIndex:d,visible:f,onSelect:l,position:m="below",roomMemberIds:k,roomName:C}){const{t:w}=_e("app"),A=s.useMemo(()=>a.filter(v=>Ha(v.name,o)),[a,o]),D=!!k,i=D&&o.trim().length>0,R=s.useMemo(()=>D?A.filter(v=>k?.has(v.id)):A,[A,k,D]),y=s.useMemo(()=>D?A.filter(v=>!k?.has(v.id)):[],[A,k,D]),E=i?[...R,...y]:R;return f?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${m}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":w("agentMention.suggestionsLabel","Agent mention suggestions"),children:E.length===0?t.jsx("div",{className:"agent-mention-empty",children:w("agentMention.noAgentsFound","No agents found")}):t.jsxs(t.Fragment,{children:[D&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:C?w("agentMention.membersOf","Members of #{{roomName}}",{roomName:C}):w("agentMention.roomMembers","Room members")}),R.map((v,c)=>t.jsxs("button",{type:"button",className:`agent-mention-item${c===d?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${v.id}`,onMouseDown:z=>z.preventDefault(),onClick:()=>l(v),role:"option","aria-selected":c===d,children:[t.jsx(fn,{agent:v,size:20}),D&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":w("agentMention.roomMemberBadge","Room member")}),t.jsx("span",{className:"agent-mention-name",children:v.name}),t.jsx("span",{className:"agent-mention-role",children:v.role})]},v.id)),D&&!i&&y.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:w("agentMention.typeToSearch","Type to search other agents")}),D&&i&&y.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:w("agentMention.otherAgents","Other agents")}),y.map((v,c)=>{const z=R.length+c;return t.jsxs("button",{type:"button",className:`agent-mention-item${z===d?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${v.id}`,onMouseDown:N=>N.preventDefault(),onClick:()=>l(v),role:"option","aria-selected":z===d,children:[t.jsx(fn,{agent:v,size:20}),t.jsx("span",{className:"agent-mention-name",children:v.name}),t.jsx("span",{className:"agent-mention-role",children:v.role})]},v.id)})]})]})}):null}function ho(a,o){return a+o}function fo({visible:a,position:o,tasks:d,files:f,selectedIndex:l,onSelectTask:m,onSelectFile:k,loading:C}){const{t:w}=_e("app");if(!a)return null;const A=d.length>0,D=f.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:o.top,left:o.left},"data-testid":"file-mention-popup",onMouseDown:i=>{i.preventDefault()},children:[C&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!C&&!A&&!D&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:w("fileMention.empty","No tasks or files found")}),!C&&(A||D)&&t.jsxs("div",{className:"file-mention-popup-groups",children:[A&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:w("fileMention.taskHeader","Tasks")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":w("fileMention.taskMatches","Task matches"),children:d.map((i,R)=>{const y=R;return t.jsxs("li",{className:`file-mention-popup-item${y===l?" file-mention-popup-item--selected":""}`,onClick:()=>m(i),role:"option","aria-selected":y===l,"data-testid":`task-mention-item-${y}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(za,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsxs("div",{className:"file-mention-popup-task-row",children:[t.jsx("span",{className:"file-mention-popup-task-id",children:i.id}),t.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${i.column}`,children:i.column})]}),t.jsx("span",{className:"file-mention-popup-item-path",children:i.title})]})]},i.id)})})]}),D&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:w("fileMention.fileHeader","Files")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":w("fileMention.fileMatches","File matches"),children:f.map((i,R)=>{const y=ho(d.length,R),E=Ti(i.path);return t.jsxs("li",{className:`file-mention-popup-item${y===l?" file-mention-popup-item--selected":""}`,onClick:()=>k(i),role:"option","aria-selected":y===l,"data-testid":`file-mention-item-${y}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Ei,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:i.name}),E&&t.jsx("span",{className:"file-mention-popup-item-path",children:E})]})]},i.path)})})]})]})]})}function go(a,o=[],d){const f=a.trim().replace(/^#/,""),l=(k,C)=>d?d(k,C):C;if(!f)return{ok:!1,error:l("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(f))return{ok:!1,error:l("createRoom.lowercase","Use lowercase letters only.")};const m=f.toLowerCase();return m.length>80?{ok:!1,error:l("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(m)?/^[-_]|[-_]$/.test(m)?{ok:!1,error:l("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:o.some(k=>k.toLowerCase()===m)?{ok:!1,error:l("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:m}:{ok:!1,error:l("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function po({isOpen:a,onClose:o,onCreate:d,projectId:f,existingRoomNames:l=[]}){const{t:m}=_e("app"),[k,C]=s.useState(""),[w,A]=s.useState([]),[D,i]=s.useState(""),[R,y]=s.useState([]),[E,v]=s.useState(!1),[c,z]=s.useState(null),[N,W]=s.useState(!1),$=s.useRef(null),H=s.useRef(null),[P,ee]=s.useState(void 0);s.useLayoutEffect(()=>{a&&ee(Ii())},[a]),s.useEffect(()=>{a&&(H.current=document.activeElement instanceof HTMLElement?document.activeElement:null,v(!0),z(null),Di(void 0,f).then(T=>A(T)).catch(()=>{A([]),z(m("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>v(!1)))},[a,f]),s.useEffect(()=>{if(!a){C(""),i(""),y([]),z(null),W(!1);return}const T=window.requestAnimationFrame(()=>$.current?.focus());return()=>window.cancelAnimationFrame(T)},[a]),s.useEffect(()=>{if(!a)return;const T=U=>{U.key==="Escape"&&o()};return document.addEventListener("keydown",T),()=>document.removeEventListener("keydown",T)},[a,o]),s.useEffect(()=>{a||H.current?.focus()},[a]);const J=s.useMemo(()=>go(k,l,m),[k,l,m]),G=s.useMemo(()=>{const T=D.trim().toLowerCase();return T?w.filter(U=>U.name.toLowerCase().includes(T)):w},[w,D]),L=s.useMemo(()=>w.filter(T=>R.includes(T.id)),[w,R]),B=J.ok&&R.length>0&&!N&&!E;if(!a)return null;const Y=T=>{N||y(U=>U.includes(T)?U.filter(M=>M!==T):[...U,T])},K=async()=>{if(!J.ok){z(J.error);return}if(R.length===0){z(m("createRoom.selectMember","Select at least one member."));return}z(null),W(!0);try{await d({name:J.name,displayName:`#${J.name}`,memberAgentIds:R}),o()}catch(T){z(T instanceof Error?T.message:m("createRoom.failedCreate","Failed to create room."))}finally{W(!1)}};return pi.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:T=>T.target===T.currentTarget&&o(),style:P?{zIndex:P}:void 0,children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":m("createRoom.title","Create room"),onClick:T=>T.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:m("createRoom.title","Create room")}),t.jsx("button",{type:"button",className:"modal-close","aria-label":m("actions.close","Close"),onClick:o,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:m("createRoom.nameLabel","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:$,id:"create-room-name",className:"input",value:k,disabled:N,onChange:T=>{const U=T.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();C(U)}})]}),!J.ok&&t.jsx("div",{className:"form-error",children:J.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:m("createRoom.members","Members")}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:m("createRoom.searchAgents","Search agents"),value:D,disabled:N,onChange:T=>i(T.target.value)})]}),L.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:L.map(T=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>Y(T.id),disabled:N,children:[T.name," ×"]},T.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:E?t.jsx("div",{className:"create-room-modal-empty",children:t.jsx(Li,{label:m("createRoom.loadingAgents","Loading agents...")})}):G.length===0?t.jsx("div",{className:"create-room-modal-empty",children:w.length===0?m("createRoom.noAgents","No agents in this project yet."):m("createRoom.noMatch","No agents match your search.")}):G.map(T=>{const U=R.includes(T.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${U?" create-room-modal-member-row--selected":""}`,onClick:()=>Y(T.id),disabled:N,children:[t.jsx(fn,{agent:T,size:20}),t.jsx("span",{children:T.name}),t.jsx("span",{className:"create-room-modal-member-role",children:T.role})]},T.id)})}),c&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:c})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:o,disabled:N,children:m("actions.cancel","Cancel")}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void K(),disabled:!B,children:N?m("createRoom.creating","Creating..."):m("createRoom.create","Create room")})]})]})}),document.body)}function vo({cliSessionId:a,tier:o,projectId:d,renderTranscript:f,renderComposer:l,queuedCount:m=0,terminalProps:k}){const{t:C}=_e("app"),w=o==="generic",[A,D]=s.useState(w?"terminal":"transcript");if(w)return t.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:t.jsx(xa,{sessionId:a,projectId:d,...k})});const i=A==="terminal";return t.jsxs("div",{className:"cli-chat-surface","data-tier":o,"data-view":A,children:[t.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":C("cliChat.viewToggleLabel","Chat view"),children:[t.jsxs("button",{type:"button",role:"tab","aria-selected":!i,className:`cli-chat-surface__tab${i?"":" is-active"}`,onClick:()=>D("transcript"),children:[t.jsx(un,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:C("cliChat.transcriptTab","Transcript")})]}),t.jsxs("button",{type:"button",role:"tab","aria-selected":i,className:`cli-chat-surface__tab${i?" is-active":""}`,onClick:()=>D("terminal"),children:[t.jsx(Pi,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:C("cliChat.terminalTab","Terminal")})]})]}),t.jsx("div",{className:"cli-chat-surface__body",children:i?t.jsx(xa,{sessionId:a,projectId:d,...k}):f()}),!i&&t.jsxs("div",{className:"cli-chat-surface__composer",children:[m>0&&t.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:C("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:m})}),l()]})]})}const bo=200,wo=8,xo=8;function Ra(){return new DOMException("The operation was aborted.","AbortError")}function Na(a,o){return o.aborted?Promise.reject(Ra()):new Promise((d,f)=>{const l=()=>f(Ra());o.addEventListener("abort",l,{once:!0}),a.then(m=>{o.removeEventListener("abort",l),d(m)},m=>{o.removeEventListener("abort",l),f(m)})})}function Aa(a,o,d){const f=a.slice(0,o),l=a.slice(o+1),m=l.match(/[\s]|$/),k=m?m.index??l.length:l.length,C=l.slice(k);return`${f}${d}${C}`}function yo(a={}){const{projectId:o,workspace:d="project"}=a,[f,l]=s.useState(!1),[m,k]=s.useState(""),[C,w]=s.useState(-1),[A,D]=s.useState([]),[i,R]=s.useState([]),[y,E]=s.useState(!1),[v,c]=s.useState(0),z=s.useRef(null),N=s.useRef(null),W=[...A.map(L=>({kind:"task",task:L})),...i.map(L=>({kind:"file",file:L}))];s.useEffect(()=>()=>{z.current&&clearTimeout(z.current),N.current?.abort()},[]);const $=s.useCallback((L,B)=>{if(B<0||B>L.length){l(!1);return}const Y=K=>/[a-zA-Z0-9/_.-]/.test(K);for(let K=B-1;K>=0;K--){if(L[K]==="#"){if(K===0){const U=L.slice(K+1,B);w(K),k(U),c(0),l(!0);return}const T=L[K-1];if(/[\s,.;:!?'"()[\]{}]/.test(T)){const U=L.slice(K+1,B);w(K),k(U),c(0),l(!0);return}l(!1);return}if(!Y(L[K])){l(!1);return}}l(!1)},[]),H=s.useCallback(()=>{N.current?.abort(),l(!1),k(""),w(-1),D([]),R([]),c(0),E(!1)},[]),P=s.useCallback(async L=>{if(!L.trim()){D([]),R([]),E(!1);return}N.current?.abort();const B=new AbortController;N.current=B;try{E(!0);const[Y,K]=await Promise.allSettled([Na(Fi(20,0,o,L),B.signal),Na(_i(L,d,o),B.signal)]);if(B.signal.aborted)return;const T=Y.status==="fulfilled"?Y.value.slice(0,wo).map(M=>({id:M.id,title:M.title??"",column:M.column})):[],U=K.status==="fulfilled"?K.value.files.slice(0,xo):[];D(T),R(U),c(0)}catch(Y){Y.name!=="AbortError"&&(D([]),R([]))}finally{B.signal.aborted||E(!1)}},[d,o]);s.useEffect(()=>{if(f)return z.current&&clearTimeout(z.current),z.current=setTimeout(()=>{P(m)},bo),()=>{z.current&&clearTimeout(z.current)}},[m,f,P]);const ee=s.useCallback((L,B)=>!f||C<0?B:Aa(B,C,`#${L.id}`),[f,C]),J=s.useCallback((L,B)=>!f||C<0?B:Aa(B,C,`#${L.path}`),[f,C]),G=s.useCallback((L,B)=>{if(!f||W.length===0)return!1;switch(L.key){case"ArrowDown":return L.preventDefault(),c(Y=>Math.min(Y+1,W.length-1)),!0;case"ArrowUp":return L.preventDefault(),c(Y=>Math.max(Y-1,0)),!0;case"Enter":case"Tab":return W[v]?(L.preventDefault(),!0):!1;case"Escape":return L.preventDefault(),H(),!0;default:return!1}},[f,W,v,H]);return{mentionActive:f,tasks:A,files:i,combinedItems:W,loading:y,mentionQuery:m,selectedIndex:v,setSelectedIndex:c,detectMention:$,selectTask:ee,selectFile:J,dismissMention:H,handleKeyDown:G}}const ns=new Map,mn=new Map;function ms(a){return a??"global"}function us(a){return`${Nt.DISCOVERED_SKILLS_PREFIX}${ms(a)}`}function mt(a){return ft(us(a),{maxAgeMs:os})}function ko(a,o){for(const d of mn.get(a)??[])d(o)}async function Co(a){const o=ms(a),d=ns.get(o);if(d)return d;const f=Bi(a).finally(()=>{ns.delete(o)});return ns.set(o,f),f}function Mo(a){const[o,d]=s.useState(()=>mt(a)??[]),[f,l]=s.useState(()=>mt(a)===null),m=s.useRef(mt(a)!==null),k=ms(a);s.useEffect(()=>{const A=mt(a)??[];d(A),l(mt(a)===null),m.current=mt(a)!==null},[a]),s.useEffect(()=>{const A=mn.get(k)??new Set;return A.add(d),mn.set(k,A),()=>{A.delete(d),A.size===0&&mn.delete(k)}},[k]);const C=s.useCallback(async()=>{try{const A=await Co(a);m.current=!0,q(us(a),A,{maxBytes:5e5}),ko(k,A)}catch{m.current||$i(us(a))}finally{l(!1)}},[a,k]);s.useEffect(()=>{C()},[C]);const w=s.useCallback(async()=>{l(!0),await C()},[C]);return{skills:o,loading:f,refresh:w}}function So(a,o){const d=a.reduce((f,l)=>f+(l.content?.length??0),0)+(o?.length??0);return Math.ceil(d/4)}function ja(a){if(!Number.isFinite(a)||a<=0)return"0";if(a<1e3)return String(Math.round(a));const o=a/1e3;return o<10?`~${Number(o.toFixed(1))}k`:`${Math.round(o)}k`}const hs=640,Ro=200,No=200,ht=8;function Wo(a){const o=a.trim();return o?`${o}
|
|
7
|
+
|
|
8
|
+
`:""}function Ao(a,o,d,f,l,m,k){const C=Math.max(ht,m-f-ht),w=Math.max(ht,k-l-ht),A=d?a-f:a;return{x:Math.min(Math.max(ht,A),C),y:Math.min(Math.max(ht,o),w)}}const Ta="__SKIP__";let ss=!1;function jo(a,o=hs){return a>o?"auto":"hidden"}function To(a,o=hs){return Math.max(40,Math.min(a,o))}function Eo(a,o){const d=new Date(a),l=new Date().getTime()-d.getTime(),m=Math.floor(l/1e3),k=Math.floor(m/60),C=Math.floor(k/60),w=Math.floor(C/24);return m<60?o("chat.relativeTimeJustNow","just now"):k<60?o("chat.relativeTimeMinutes","{{count}}m ago",{count:k}):C<24?o("chat.relativeTimeHours","{{count}}h ago",{count:C}):w<7?o("chat.relativeTimeDays","{{count}}d ago",{count:w}):d.toLocaleDateString()}const Io=280,ln=180,dn=500,Ea="fusion:chat-sidebar-width",as="fusion:chat-scope",Do="fusion:chat-draft:";function Ia(a,o){return a.slice(o+1).find(d=>d.role==="user")?.content}function Da(a,o){return o?`${Do}${a}:${o}`:null}function La(a){if(!a)return"";try{return localStorage.getItem(a)??""}catch{return""}}const Lo=["image/png","image/jpeg","image/gif","image/webp","video/mp4","video/webm","video/quicktime","text/plain","text/markdown","application/json","text/yaml","text/x-toml","text/csv","application/xml"],Pa="image/png,image/jpeg,image/gif,image/webp,video/mp4,video/webm,video/quicktime,.txt,.md,.json,.yaml,.yml,.toml,.csv,.xml",is=ao;function Po(a,o){const d=a.slice(0,o),f=/(^|[\s\n])@([\w-]*)$/.exec(d);if(!f)return null;const l=f[2]??"",m=d.length-l.length-1;return{filter:l,start:m,end:o}}function Fo(a){const o=a?.runtimeConfig;if(!o||typeof o!="object")return null;const d=Reflect.get(o,"modelProvider"),f=Reflect.get(o,"modelId");return typeof d!="string"||d.trim().length===0||typeof f!="string"||f.trim().length===0?null:{provider:d,modelId:f}}function Fa(a,o,d){if(a?.modelProvider&&a?.modelId)return{provider:a.modelProvider,modelId:a.modelId};const f=Fo(o??void 0);return f||(d.provider&&d.modelId?{provider:d.provider,modelId:d.modelId}:null)}function _o({projectId:a,defaultModel:o,defaultKind:d,defaultAgentId:f,defaultThinkingLevel:l,defaultSelectedThinkingLevel:m,onClose:k,onCreate:C}){const{t:w}=_e("app"),[A,D]=s.useState(d??"agent"),{agents:i,loading:R}=$a(a),[y,E]=s.useState(f??""),{models:v,favoriteProviders:c,favoriteModels:z,loading:N,refresh:W}=Ba(),$=o.provider&&o.modelId?`${o.provider}/${o.modelId}`:"",[H,P]=s.useState($),[ee,J]=s.useState(m??""),[G,L]=s.useState(c),[B,Y]=s.useState(z);s.useEffect(()=>{L(c)},[c]),s.useEffect(()=>{Y(z)},[z]),s.useEffect(()=>{d&&D(d)},[d]),s.useEffect(()=>{f&&E(b=>b||f)},[f]),s.useEffect(()=>{$&&P(b=>b||$)},[$]),s.useEffect(()=>{m&&J(b=>b||m)},[m]);const K=s.useCallback(async b=>{const S=G,j=S.includes(b)?S.filter(_=>_!==b):[b,...S];L(j);try{await wa({favoriteProviders:j,favoriteModels:B}),await W()}catch{L(S)}},[G,B,W]),T=s.useCallback(async b=>{const S=B,j=S.includes(b)?S.filter(_=>_!==b):[b,...S];Y(j);try{await wa({favoriteProviders:G,favoriteModels:j}),await W()}catch{Y(S)}},[B,G,W]),U=H||$,M=b=>{if(b.preventDefault(),A==="agent"){if(!y)return;C({agentId:y});return}if(!U)return;const S=U.indexOf("/");if(S<=0)return;const h=U.slice(0,S),j=U.slice(S+1);C({agentId:xe,modelProvider:h,modelId:j,thinkingLevel:ee||void 0})},g=A==="agent"?!y:!U;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:k,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:b=>b.stopPropagation(),children:[t.jsx("h3",{children:w("chat.newChatTitle","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${A==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{D("agent")},children:w("chat.newChatModeAgent","Agent")}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${A==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{D("model"),E(""),P(b=>b||$)},children:w("chat.newChatModeModel","Model")})]}),t.jsxs("form",{onSubmit:M,children:[A==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:[w("chat.newChatModeAgent","Agent"),R?t.jsx("div",{className:"chat-new-dialog-loading",children:w("chat.loadingAgents","Loading agents...")}):i.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:w("chat.noAgentsAvailable","No agents available")}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:i.map(b=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${y===b.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>E(b.id),"data-testid":`agent-option-${b.id}`,children:[t.jsx(hn,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:b.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:b.role})]},b.id))})]}),A==="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:w("chat.loadingModels","Loading models...")}):t.jsx(_a,{models:v,value:H,onChange:P,label:w("chat.newChatModeModel","Model"),placeholder:w("chat.selectModel","Select a model"),favoriteProviders:G,onToggleFavorite:K,favoriteModels:B,onToggleModelFavorite:T,showThinkingLevel:!0,thinkingLevel:ee,onThinkingLevelChange:J,defaultThinkingLevel:l??"off"})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:k,children:w("chat.cancel","Cancel")}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:g,children:w("chat.create","Create")})]})]})]})})}function Xo({projectId:a,addToast:o,floating:d=!1,compactLayout:f=!1,onPopOut:l,onMaximize:m,onMinimize:k,onClose:C,chatCommandContext:w,initialComposerDraft:A,initialComposerDraftNonce:D}){const{t:i}=_e("app");s.useEffect(()=>(cs({view:"ChatView",trigger:ss?"route-active":"remount",projectId:a,replayAttempted:!1}),ss=!1,()=>{ss=!0,cs({view:"ChatView",trigger:"route-inactive",projectId:a,replayAttempted:!1})}),[a]);const[R,y]=s.useState(null);s.useEffect(()=>{let e=!1;return y(null),zi(a).then(n=>{e||y(n)}).catch(()=>{e||y(null)}),()=>{e=!0}},[a]);const E=R?.defaultThinkingLevel??"off",v=s.useMemo(()=>R?.chatDefaultKind==="agent"&&R.chatDefaultAgentId?{kind:"agent",agentId:R.chatDefaultAgentId}:R?.chatDefaultKind==="model"&&R.chatDefaultModelProvider&&R.chatDefaultModelId?{kind:"model",modelProvider:R.chatDefaultModelProvider,modelId:R.chatDefaultModelId,thinkingLevel:R.chatDefaultThinkingLevel}:null,[R]),{activeSession:c,sessionsLoading:z,messages:N,messagesLoading:W,isStreaming:$,streamingText:H,streamingThinking:P,streamingToolCalls:ee,selectSession:J,createSession:G,archiveSession:L,renameSession:B,pinSession:Y,pinnedCount:K,setSessionModel:T,setSessionThinkingLevel:U,deleteSession:M,sendMessage:g,editMessageAndResend:b,stopStreaming:S,pendingMessages:h,clearPendingMessage:j,loadMoreMessages:_,hasMoreMessages:Q,searchQuery:ye,setSearchQuery:se,filteredSessions:ae,agentsMap:ke}=Oi(a,o),[ge,Ce]=s.useState(!1),ce=!0,[I,Ve]=s.useState(()=>{try{if(localStorage.getItem(as)==="rooms"&&ce)return"rooms"}catch{}return"direct"}),x=lo(a,o),{isUnread:fs,markRead:me}=uo(a),[Z,he]=s.useState(()=>{const e=Da(I,I==="rooms"?x.activeRoom?.id:c?.id);return La(e)}),[te,Me]=s.useState(null),gn=s.useRef(null),gs=(e,n,r,u)=>{typeof window>"u"||Me({sessionId:e,anchorX:n,anchorY:r,anchorRight:u?.anchorRight??!1,x:n,y:r})};s.useLayoutEffect(()=>{if(!te||!gn.current||typeof window>"u")return;const e=gn.current,n=e.getBoundingClientRect(),r=n.width||e.offsetWidth||No,u=n.height||e.offsetHeight,p=Ao(te.anchorX,te.anchorY,te.anchorRight,r,u,window.innerWidth,window.innerHeight);(p.x!==te.x||p.y!==te.y)&&Me({...te,...p})},[te]);const[jt,Tt]=s.useState(null),[pn,vn]=s.useState(""),[ps,Et]=s.useState(null),[vs,It]=s.useState(null),[gt,$e]=s.useState(!0),[We,bn]=s.useState(Io),[Ka,Dt]=s.useState(!1),{agentsMap:bs}=$a(a),ve=s.useMemo(()=>ke.size>0?ke:bs,[bs,ke]),{models:wn,favoriteProviders:Va,favoriteModels:Wa,defaultProvider:ws,defaultModelId:xs}=Ba(),Lt=s.useMemo(()=>({provider:ws,modelId:xs}),[xs,ws]),Xa=s.useMemo(()=>v?.kind==="model"?{provider:v.modelProvider,modelId:v.modelId}:Lt,[v,Lt]),{skills:xn,loading:qa}=Mo(a),[Xe,Be]=s.useState(!1),[pt,vt]=s.useState(""),[qe,ze]=s.useState(0),[Ge,Ye]=s.useState(""),[Se,Qe]=s.useState(!1),[Pt,Ft]=s.useState(0),[yn,Je]=s.useState(-1),[pe,Ze]=s.useState([]),[ys,et]=s.useState(!1),[ks,_t]=s.useState(!1),[tt,Cs]=s.useState({}),[$t,Re]=s.useState(!1),[Bt,bt]=s.useState(!1),{pushNav:Ms}=Ui(),[,zt]=s.useState(!1),[Ga,Ya]=s.useState({top:0,left:0}),V=yo({projectId:a}),kn=s.useCallback(e=>{if(!e||!V.mentionActive)return;const n=e.getBoundingClientRect();Ya({top:n.top-260,left:n.left+8})},[V.mentionActive]),Ss=s.useRef(null),Rs=s.useRef(null),Ns=s.useRef(null),As=s.useRef(null),ue=s.useRef(!1),Ot=s.useRef(null),js=s.useRef(null),Le=s.useRef(null),Ut=s.useRef(0),Cn=s.useRef(null),wt=s.useRef(null),Ne=s.useRef(null),le=s.useRef(null),Mn=s.useRef(null),nt=s.useRef(null),[Sn,Qa]=s.useState(()=>new Set),Ht=s.useRef(!1),Ae=s.useRef(null),je=s.useRef(null),ie=s.useRef(null),Ts=s.useRef(void 0),Rn=s.useRef(!1),Kt=s.useRef(null),Es=s.useRef([]),st=s.useRef(0),xt=s.useRef(new Map),Nn=s.useRef(!1),Vt=Hi(),Oe=Vt==="mobile",An=Vt==="tablet",Is=s.useRef(null),[Ja,Ds]=s.useState(!1);s.useLayoutEffect(()=>{if(!d){Ds(!1);return}const e=Is.current;if(!e||typeof ResizeObserver>"u")return;const n=()=>{Ds(e.getBoundingClientRect().width<=768)};n();const r=new ResizeObserver(n);return r.observe(e),()=>r.disconnect()},[d]);const O=Oe||Ja||f;s.useEffect(()=>{c?.id&&me("direct",c.id,c.lastMessageAt??c.updatedAt)},[c?.id,c?.lastMessageAt,c?.updatedAt,me]),s.useEffect(()=>{x.activeRoom?.id&&me("room",x.activeRoom.id,x.activeRoom.updatedAt)},[x.activeRoom?.id,x.activeRoom?.updatedAt,me]),s.useEffect(()=>{if(!c?.id||N.length===0)return;const e=N[N.length-1];me("direct",c.id,e?.createdAt??c.lastMessageAt??c.updatedAt)},[c?.id,c?.lastMessageAt,c?.updatedAt,me,N]),s.useEffect(()=>{if(!x.activeRoom?.id||x.messages.length===0)return;const e=x.messages[x.messages.length-1];me("room",x.activeRoom.id,e?.createdAt??x.activeRoom.updatedAt)},[me,x.activeRoom?.id,x.activeRoom?.updatedAt,x.messages]),s.useEffect(()=>{try{const e=localStorage.getItem(Ea);if(!e)return;const n=Number.parseInt(e,10);if(Number.isNaN(n))return;const r=Math.max(ln,Math.min(dn,n));bn(r)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(as);if(e==="direct"){Ve("direct");return}e==="rooms"&&ce&&Ve("rooms")}catch{}},[ce]),s.useEffect(()=>{try{localStorage.setItem(as,I)}catch{}},[ce,I]);const fe=Da(I,I==="rooms"?x.activeRoom?.id:c?.id),jn=s.useRef(fe),Tn=s.useRef(!1);s.useEffect(()=>{if(fe!==jn.current){if(jn.current=fe,Tn.current){Tn.current=!1;return}he(La(fe))}},[fe]),s.useEffect(()=>{if(!(!fe||jn.current!==fe))try{if(Z){localStorage.setItem(fe,Z);return}localStorage.removeItem(fe)}catch{}},[fe,Z]);const oe=I==="rooms"&&!!x.activeRoom,{keyboardOverlap:Ls,keyboardOpen:Wt}=Ki({enabled:(O||An)&&(!!c||oe),allowNonMobileViewport:An}),yt=An&&Wt,Xt=s.useMemo(()=>{const e=pt.trim().toLowerCase();return(e?xn.filter(r=>r.name.toLowerCase().includes(e)):xn).slice(0,10)},[xn,pt]),En=s.useMemo(()=>w?Vi(pt,ba):[],[w,pt]),be=s.useMemo(()=>{const e=En.map(r=>({kind:"command",command:r,disabled:!w?.agentRunning})),n=Xt.map(r=>({kind:"skill",skill:r}));return[...e,...n]},[En,Xt,w]),at=s.useMemo(()=>Array.from(ve.values()),[ve]),Te=s.useMemo(()=>I!=="rooms"||!x.activeRoom?null:{roomId:x.activeRoom.id,roomName:x.activeRoom.name,memberIds:new Set(x.activeRoomMembers.map(e=>e.agentId))},[ce,I,x.activeRoom,x.activeRoomMembers]),Ue=s.useMemo(()=>{const e=at.filter(u=>Ha(u.name,Ge));if(!Te)return e;const n=e.filter(u=>Te.memberIds.has(u.id));if(Ge.trim().length===0)return n;const r=e.filter(u=>!Te.memberIds.has(u.id));return[...n,...r]},[at,Ge,Te]),In=s.useMemo(()=>{const e=new Map;for(const n of at)e.set(n.name.toLowerCase(),n);return e},[at]),Za=s.useMemo(()=>Xt.map(e=>e.id).join("\0"),[Xt]);s.useEffect(()=>{ze(0)},[Za]),s.useEffect(()=>{Ft(0)},[Ge,Se]),s.useEffect(()=>()=>{Ne.current!==null&&window.clearTimeout(Ne.current)},[]),s.useEffect(()=>{const e=Rs.current;if(!e||!Q||W)return;const n=new IntersectionObserver(r=>{r[0].isIntersecting&&_()},{threshold:.1});return n.observe(e),()=>n.disconnect()},[Q,W,_]);const it=s.useCallback(()=>oe?x.activeRoom?.id??null:c?.id??null,[oe,x.activeRoom?.id,c?.id]),Ps=s.useCallback((e,n)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(n)}"]`):e.querySelector(`.chat-message[data-message-id="${n.replace(/"/g,'\\"')}"]`),[]),Fs=s.useCallback(()=>{const e=le.current;if(!e)return;const n=e.getBoundingClientRect().top,r=new Set;e.querySelectorAll(".chat-message--assistant:not(.chat-message--failure)[data-message-id]").forEach(u=>{const p=u.getAttribute("data-message-id");p&&u.getBoundingClientRect().top<n&&r.add(p)}),Qa(u=>u.size===r.size&&Array.from(u).every(p=>r.has(p))?u:r)},[]),qt=s.useCallback(()=>{!le.current||nt.current!==null||(nt.current=window.requestAnimationFrame(()=>{nt.current=null,Fs()}))},[Fs]),Gt=s.useCallback(()=>{const e=le.current,n=it();if(!e||!n)return;const r=e.scrollTop,u=e.querySelectorAll(".chat-message[data-message-id]"),p=Array.from(u).find(X=>X.offsetTop+X.offsetHeight>=r)??u[0]??null,F=p?.getAttribute("data-message-id")??null,ne=p?p.offsetTop-r:0;wt.current={threadId:n,scrollTop:r,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:F,anchorOffset:ne,wasPinnedBefore:!ue.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[it]),_s=s.useCallback(()=>{const e=le.current;if(!e)return;const r=e.scrollTop+e.clientHeight>=e.scrollHeight-50;_t(!r),ue.current=!r,Gt(),qt()},[Gt,qt]),Ee=s.useCallback((e,n)=>{if(!e.isConnected||!n?.force&&ue.current)return;let r=0,u=0,p=-1;const F=6,ne=()=>{if(e.isConnected&&!(!n?.force&&ue.current)){if(e.scrollTop=e.scrollHeight,e.scrollHeight===p?u+=1:(u=0,p=e.scrollHeight),r+=1,r>=F||u>=2){_t(!1),ue.current=!1;return}window.requestAnimationFrame(ne)}};ne()},[]),ot=oe?x.messages:N;s.useLayoutEffect(()=>(qt(),()=>{nt.current!==null&&(window.cancelAnimationFrame(nt.current),nt.current=null)}),[ot,qt]),s.useLayoutEffect(()=>{const e=le.current,n=it(),r=wt.current;if(!e||!n||!r||r.threadId!==n||r.wasPinnedBefore)return;const u=(typeof performance<"u"?performance.now():Date.now())-r.capturedAtMs,p=e.scrollHeight>e.clientHeight,F=u>3e3,ne=r.scrollTop<=0&&r.anchorOffset<=0&&p;if(!ue.current||F||ne){wt.current=null;return}let X=r.scrollTop;if(r.anchorMessageId){const re=Ps(e,r.anchorMessageId);re?X=re.offsetTop-r.anchorOffset:X=r.scrollTop+(e.scrollHeight-r.scrollHeight)}else X=r.scrollTop+(e.scrollHeight-r.scrollHeight);e.scrollTop=Math.max(0,X),ue.current=!0,_t(!0),wt.current=null},[ot,it,Ps]);const Dn=s.useCallback(e=>{},[ot.length,oe]),we=s.useCallback(e=>{Dn(e);const n=le.current;n&&(wt.current=null,ue.current=!1,Ee(n))},[Ee,Dn]);s.useLayoutEffect(()=>{Le.current!==null&&(window.clearTimeout(Le.current),Le.current=null);const e=oe?x.activeRoom?.id??null:c?.id??null;if(!e){Ot.current=null;return}const n={threadId:e,loaded:oe?!x.messagesLoading:!W,hasMessages:oe?x.messages.length>0:N.length>0},r=Ot.current,u=r?.threadId!==e,p=r?.threadId===e&&!r.loaded&&n.loaded,F=r?.threadId===e&&!r.hasMessages&&n.hasMessages;if(!(r===null||u||p||F))return;const X=le.current;if(X)return Dn(u?"thread-change":p?"finished-loading":F?"first-messages":"mount"),Ee(X,{force:!0}),oe||(Le.current=window.setTimeout(()=>{if(Le.current=null,ue.current)return;const re=le.current;re&&Ee(re)},250)),Ot.current=n,()=>{Le.current!==null&&(window.clearTimeout(Le.current),Le.current=null)}},[oe,x.activeRoom?.id,x.messages.length,x.messagesLoading,c?.id,N.length,W,Ee]),s.useEffect(()=>{!$||ue.current||we("streaming")},[$,H,P,we]),s.useEffect(()=>{const e=it();if(!e){Ut.current=0,Cn.current=null;return}if(Cn.current!==e){Cn.current=e,Ut.current=ot.length;return}const n=Ut.current,r=ot.length,u=r>n,p=!ue.current;Ut.current=r,u&&p&&we("new-message")},[ot,it,we]),s.useEffect(()=>{Ls<=0||!le.current||we("keyboard")},[Ls,we]),Wi(Oe&&Wt),s.useLayoutEffect(()=>{if(!Oe||!c&&!oe||typeof window>"u")return;const e=Mn.current,n=window.visualViewport;if(!e||!n)return;const r=p=>{if(!(p instanceof HTMLElement))return!1;if(p.tagName==="TEXTAREA")return!0;if(p.tagName!=="INPUT")return!1;const F=p.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(F)},u=()=>{if(Ht.current){e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange="";return}const p=Math.max(0,window.innerHeight-n.offsetTop-n.height),F=n.offsetTop||0;e.style.setProperty("--vv-height",`${n.height}px`),e.style.setProperty("--vv-offset-top",`${F}px`),e.style.setProperty("--keyboard-overlap",`${p}px`);const ne=(p>0||F>0)&&r(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",ne),e.style.setProperty("--chat-keyboard-accessory-clearance",ne&&Zn()?"calc(var(--space-2xl) + var(--space-md))":"0px"),ne&&F>0?(e.style.transform=`translateY(${F}px)`,e.style.willChange="transform"):(e.style.transform="",e.style.willChange="")};return u(),n.addEventListener("resize",u),n.addEventListener("scroll",u),document.addEventListener("focusin",u),document.addEventListener("focusout",u),window.addEventListener("pageshow",u),document.addEventListener("visibilitychange",u),()=>{n.removeEventListener("resize",u),n.removeEventListener("scroll",u),document.removeEventListener("focusin",u),document.removeEventListener("focusout",u),window.removeEventListener("pageshow",u),document.removeEventListener("visibilitychange",u),e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange=""}},[c,Oe,oe]),s.useEffect(()=>{const e=()=>Me(null);if(te)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[te]),s.useEffect(()=>{if(!Oe||!Wt)return;const e=n=>{n.target?.closest(".chat-messages")||n.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[Oe,Wt]),s.useEffect(()=>{const e=js.current;if(js.current=I,I==="rooms"&&!x.activeRoom){Ot.current=null;return}if(!(I==="direct"&&(e===null||e==="rooms"))&&!(I==="rooms"&&(e===null||e==="direct")))return;const u=le.current;u&&(Ee(u,{force:!0}),ue.current=!1,_t(!1))},[I,x.activeRoom,Ee]),s.useEffect(()=>{if(!c&&!oe||oe&&!O)return;const e=()=>{const r=!ue.current;Gt(),r&&O&&le.current&&we("visibility-restore")},n=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",n),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",n),window.removeEventListener("pageshow",e)}},[O,Oe,c,oe,Gt,we]),s.useEffect(()=>{if(oe||typeof ResizeObserver>"u")return;const e=le.current;if(!e)return;const n=new ResizeObserver(()=>{ue.current||Ee(e)});return n.observe(e),()=>{n.disconnect()}},[oe,Ee,c?.id,I]),s.useEffect(()=>{Es.current=pe},[pe]),s.useEffect(()=>()=>{for(const e of Es.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of xt.current.values())window.clearTimeout(e);xt.current.clear()},[]);const rt=s.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const r of Array.from(e)){if(!Lo.includes(r.type))continue;const u=r.type.startsWith("image/");n.push({file:r,previewUrl:u?URL.createObjectURL(r):""})}n.length>0&&Ze(r=>[...r,...n])},[]),$s=s.useCallback(e=>{Ze(n=>{const r=n[e];return r?.previewUrl&&URL.revokeObjectURL(r.previewUrl),n.filter((u,p)=>p!==e)})},[]),Bs=s.useCallback(e=>{rt(e.clipboardData?.files)},[rt]),ct=s.useCallback(async e=>{try{return await G(e),Ce(!1),O&&$e(!1),!0}catch{return o(i("chat.failedToCreateSession","Failed to create chat session"),"error"),!1}},[G,o,O,i]),Yt=s.useCallback(()=>{if(R?.chatNewSessionMode==="always-default"&&v){if(v.kind==="agent"){ct({agentId:v.agentId});return}ct({agentId:xe,modelProvider:v.modelProvider,modelId:v.modelId,thinkingLevel:v.thinkingLevel});return}Ce(!0)},[v,R?.chatNewSessionMode,ct]),de=s.useCallback(e=>{const n=e??ie.current;if(!n)return;const r=Vt==="tablet"?Ro:hs;n.style.height="auto",n.style.height=`${To(n.scrollHeight,r)}px`,n.style.overflowY=jo(n.scrollHeight,r)},[Vt]),zs=s.useCallback(e=>{ie.current=e,e&&de(e)},[de]);s.useLayoutEffect(()=>{de(),Rn.current&&(Rn.current=!1,ie.current?.focus())},[I,Z,c?.id,x.activeRoom?.id,de]),s.useEffect(()=>{if(D===void 0||D===Ts.current||!A?.trim())return;Ts.current=D;const e=n=>{n&&(Tn.current=!0),Ve("direct"),Rn.current=!0,he(A)};if(!$&&R?.chatNewSessionMode==="always-default"&&v){const n=v.kind==="agent"?{agentId:v.agentId}:{agentId:xe,modelProvider:v.modelProvider,modelId:v.modelId,thinkingLevel:v.thinkingLevel};ct(n).then(r=>e(r||I!=="direct"));return}e(I!=="direct")},[v,I,R?.chatNewSessionMode,ct,A,D,$,de]);const lt=s.useCallback(()=>{if(he(""),fe)try{localStorage.removeItem(fe)}catch{}Be(!1),vt(""),Qe(!1),Ye(""),Je(-1),Ze(e=>{for(const n of e)n.previewUrl&&URL.revokeObjectURL(n.previewUrl);return[]})},[fe]),Ln=s.useCallback(()=>{const e=Z.trim(),n=pe.map(u=>u.file);if(!e&&n.length===0||!c)return;if(w){const u=Xi(e,ba);if(u){if(!w.agentRunning){o(i("chat.commandNoRunningAgent","No running agent to steer"),"warning");return}if(n.length>0){o(i("chat.commandNoAttachments","Attachments aren't supported with commands — remove them before sending"),"warning");return}lt(),u.command.run({taskId:w.taskId,projectId:w.projectId,remainder:u.remainder}).then(()=>{o(i("chat.commandSteerSuccess","Sent to the running agent"),"success")}).catch(p=>{const F=p instanceof Error&&p.message.trim()?p.message:i("chat.commandSteerFailed","Failed to send to the running agent");o(F,"error")});return}}if(e==="/clear"||e==="/new"){if(c.agentId.startsWith(qi)){lt(),o(i("chat.newNotAllowedForTaskChat","This chat is tied to a task — /new and /clear can't clear it"),"warning");return}lt(),j(),S(),G({agentId:c.agentId,modelProvider:c.modelProvider??void 0,modelId:c.modelId??void 0,thinkingLevel:c.thinkingLevel??void 0}).catch(()=>{o(i("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}const r=new Set(n);he("");try{g(e,n,{onDelivered:()=>{Ze(u=>{for(const p of u)r.has(p.file)&&p.previewUrl&&URL.revokeObjectURL(p.previewUrl);return u.filter(p=>!r.has(p.file))})},onFailed:()=>{he(u=>u||e)}})}catch{he(e)}},[Z,pe,c,lt,S,j,G,o,g,w,i]),Pn=s.useCallback(async()=>{const e=Z.trim(),n=pe.map(r=>r.file);if(!(!e&&n.length===0)){if(I==="rooms"){if(!x.activeRoom)return;if(e==="/clear"||e==="/new"){lt();try{await x.clearRoom(x.activeRoom.id)}catch{o(i("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(Nn.current)return;Nn.current=!0;const r=Z,u=new Set(n);he("");try{await x.sendRoomMessage(e,{files:n}),Ze(p=>{for(const F of p)u.has(F.file)&&F.previewUrl&&URL.revokeObjectURL(F.previewUrl);return p.filter(F=>!u.has(F.file))})}catch(p){if(p instanceof Oa){Ze(X=>{for(const re of X)u.has(re.file)&&re.previewUrl&&URL.revokeObjectURL(re.previewUrl);return X.filter(re=>!u.has(re.file))});const ne=p.message.trim()?p.message:i("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");o(i("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:ne}),"error");return}he(r);const F=p instanceof Error&&p.message.trim()?p.message:i("chat.failedToSendRoomMessage","Failed to send room message");o(F,"error")}finally{Nn.current=!1}return}Ln()}},[Z,pe,ce,I,x,x.clearRoom,lt,o,Ln]),Qt=s.useCallback(async e=>{if(I==="rooms"){if(!x.activeRoom)return;try{await x.sendRoomMessage(e)}catch(n){const r=n instanceof Error&&n.message.trim()?n.message:i("chat.failedToSendRoomMessage","Failed to send room message");o(r,"error")}return}c&&g(e)},[c,o,ce,I,x,g,i]),Fn=s.useCallback(e=>{he(n=>{const r=is(n);if(!r)return n;const u=`/skill:${e.name} `,p=n.slice(0,r.start)+u+n.slice(r.end);return window.requestAnimationFrame(()=>{ie.current&&(de(ie.current),ie.current.focus())}),p}),Be(!1),vt(""),ze(0)},[de]),_n=s.useCallback((e,n)=>{if(n){o(i("chat.commandNoRunningAgent","No running agent to steer"),"warning");return}he(r=>{const u=is(r);if(!u)return r;const p=`${e.trigger} `,F=r.slice(0,u.start)+p+r.slice(u.end);return window.requestAnimationFrame(()=>{ie.current&&(de(ie.current),ie.current.focus())}),F}),Be(!1),vt(""),ze(0)},[de,o,i]),Jt=s.useCallback(e=>{const n=ie.current;if(!n||yn<0)return;const r=n.selectionStart??st.current,u=n.selectionEnd??r,p=Math.max(r,u),F=Math.min(yn,p),X=`${`@${e.name.replace(/\s+/g,"_")}`} `,re=Z.slice(0,F)+X+Z.slice(p),dt=F+X.length;he(re),Qe(!1),Ye(""),Ft(0),Je(-1),window.requestAnimationFrame(()=>{ie.current&&(de(ie.current),ie.current.focus(),ie.current.setSelectionRange(dt,dt))})},[yn,Z,de]),kt=s.useCallback((e,n)=>{const u=ie.current?.selectionStart??st.current,p=Z.lastIndexOf("#",u),F=p>=0?p+n.length:e.length;he(e),V.dismissMention(),zt(!1),window.requestAnimationFrame(()=>{ie.current&&(de(ie.current),ie.current.focus(),ie.current.setSelectionRange(F,F))})},[V,Z,de]),Os=s.useCallback(e=>{if(st.current=e.currentTarget.selectionStart??st.current,V.mentionActive&&V.combinedItems.length>0){if(V.handleKeyDown(e,Z),e.key==="Enter"||e.key==="Tab"){const n=V.combinedItems[V.selectedIndex];n?.kind==="task"?kt(V.selectTask(n.task,Z),`#${n.task.id}`):n?.kind==="file"&&kt(V.selectFile(n.file,Z),`#${n.file.path}`)}return}if(Se&&e.key==="ArrowDown"){e.preventDefault(),Ue.length>0&&Ft(n=>(n+1)%Ue.length);return}if(Se&&e.key==="ArrowUp"){e.preventDefault(),Ue.length>0&&Ft(n=>n===0?Ue.length-1:n-1);return}if(Se&&e.key==="Enter"){e.preventDefault();const n=Ue[Pt]??Ue[0];n&&Jt(n);return}if(Se&&e.key==="Escape"){e.preventDefault(),Qe(!1),Ye(""),Je(-1);return}if(Xe&&e.key==="ArrowDown"){e.preventDefault(),be.length>0&&ze(n=>(n+1)%be.length);return}if(Xe&&e.key==="ArrowUp"){e.preventDefault(),be.length>0&&ze(n=>n===0?be.length-1:n-1);return}if(Xe&&(e.key==="Enter"||e.key==="Tab")&&be.length>0){e.preventDefault();const n=be[qe]??be[0];n?.kind==="skill"?Fn(n.skill):n?.kind==="command"&&_n(n.command,n.disabled);return}if(Xe&&e.key==="Escape"){e.preventDefault(),Be(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Pn())},[Se,Ue,Pt,Jt,Xe,be,qe,Fn,_n,Pn,V,kt,Z]),Zt=s.useCallback((e,n)=>{const r=Po(e,n);if(r){Qe(!0),Ye(r.filter),Je(r.start);return}Qe(!1),Ye(""),Je(-1)},[]),Us=s.useCallback(e=>{const n=e.target,r=n.value,u=n.selectionStart??r.length;de(n),st.current=u,he(r);const p=is(r);p?(Be(!0),vt(p.filter)):(Be(!1),vt("")),Zt(r,u),V.detectMention(r,u),zt(V.mentionActive),V.mentionActive&&kn(n)},[Zt,de]),en=s.useCallback(e=>{const n=e.currentTarget,r=n.selectionStart??n.value.length;st.current=r,Zt(n.value,r),V.detectMention(n.value,r),zt(V.mentionActive),V.mentionActive&&kn(n)},[Zt,V,kn]),Hs=s.useCallback(e=>{e.key!=="Escape"&&en(e)},[en]),Ks=s.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(Ht.current=!0,Ae.current!==null&&window.clearTimeout(Ae.current),Ae.current=window.setTimeout(()=>{Ht.current=!1,Ae.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),je.current!==null&&window.clearTimeout(je.current),je.current=window.setTimeout(()=>{je.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Ne.current!==null&&window.clearTimeout(Ne.current),Ne.current=window.setTimeout(()=>{Be(!1),Qe(!1),Ye(""),Je(-1),zt(!1),V.dismissMention(),Ne.current=null},120)},[V]),Vs=s.useCallback(()=>{Ht.current=!1,Ae.current!==null&&(window.clearTimeout(Ae.current),Ae.current=null),Ne.current!==null&&(window.clearTimeout(Ne.current),Ne.current=null),je.current!==null&&(window.clearTimeout(je.current),je.current=null)},[]);s.useEffect(()=>()=>{Ae.current!==null&&window.clearTimeout(Ae.current),je.current!==null&&window.clearTimeout(je.current)},[]);const ei=s.useCallback(async e=>{Me(null);try{await L(e),o(i("chat.conversationArchived","Conversation archived"),"success")}catch{o(i("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[L,o]),Ws=s.useCallback(e=>{const n=ae.find(r=>r.id===e)??(c?.id===e?c:null);Me(null),Re(!1),vn(n?.title??""),Tt({sessionId:e,title:n?.title??""})},[c,ae]),Xs=s.useCallback(async()=>{if(jt)try{await B(jt.sessionId,pn),Tt(null),vn(""),o(i("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[o,jt,B,pn,i]),qs=s.useCallback(async(e,n)=>{Me(null),Re(!1);try{await Y(e,n),o(n?i("chat.conversationPinned","Conversation pinned"):i("chat.conversationUnpinned","Conversation unpinned"),"success")}catch{}},[o,Y,i]),ti=s.useCallback(async e=>{Et(null),Me(null);try{await M(e),o(i("chat.conversationDeleted","Conversation deleted"),"success")}catch{o(i("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[M,o]),Ct=s.useCallback(e=>{try{localStorage.setItem(Ea,String(e))}catch{}},[]),ni=s.useCallback(e=>{if(O||yt)return;e.preventDefault(),e.stopPropagation();const n=e.currentTarget;typeof n.setPointerCapture=="function"&&n.setPointerCapture(e.pointerId);const r=e.clientX,u=We;let p=u;document.body.style.userSelect="none";const F=X=>{const re=X.clientX-r,dt=Math.max(ln,Math.min(dn,u+re));p=dt,bn(dt),Ct(dt)},ne=X=>{typeof n.releasePointerCapture=="function"&&n.releasePointerCapture(X.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",F),document.removeEventListener("pointerup",ne),Ct(p)};document.addEventListener("pointermove",F),document.addEventListener("pointerup",ne)},[O,Ct,We,yt]),si=s.useCallback(e=>{if(O||yt||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const n=e.shiftKey?50:10,r=e.key==="ArrowLeft"?-n:n,u=Math.max(ln,Math.min(dn,We+r));bn(u),Ct(u)},[O,Ct,We,yt]),Gs=s.useCallback(e=>{const n=ae.find(r=>r.id===e);me("direct",e,n?.lastMessageAt??n?.updatedAt),J(e),Re(!1),O&&$e(!1)},[ae,O,me,J]),$n=s.useCallback(()=>{J(""),$e(!0),Re(!1)},[J]),Bn=s.useCallback(()=>{x.selectRoom(null),$e(!0),Re(!1)},[x]),ai=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(un,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:i("chat.startNewConversation","Start a new conversation")}),t.jsxs("button",{className:"btn btn-primary",onClick:Yt,children:[t.jsx(ut,{size:16}),i("chat.newChat","New Chat")]})]}),Ie=Fa(c,c?.agentId?ve.get(c.agentId)??null:null,Lt),zn=s.useMemo(()=>{if(!Ie?.provider||!Ie.modelId)return null;const e=wn.find(n=>n.provider===Ie.provider&&n.id===Ie.modelId);return e?.contextWindow?e.contextWindow:null},[Ie?.modelId,Ie?.provider,wn]),ii=s.useMemo(()=>So(N,$?H:void 0),[$,N,H]),Pe=da(Ie?.provider,Ie?.modelId),He=Ie?.provider??null,On=!!(c||$||N.length>0),tn=O&&!gt&&(I==="rooms"?oe:On),nn=O?tn:I==="rooms"?oe:!!c,Ys=s.useRef(nn);s.useEffect(()=>{const e=Ys.current;Ys.current=nn,O&&(e||!nn||Ms({type:"view",revert:I==="rooms"?Bn:$n}))},[I,$n,Bn,nn,O,Ms]);const Qs=c?.agentId===xe?Pe??"Fusion":c?.title||ve.get(c?.agentId??"")?.name||c?.agentId||"Chat",oi=c?.title||i("chat.untitledSession","Untitled"),ri=!!(Pe&&Pe!==Qs),ci=!O&&On&&zn!==null,Js=ja(ii),sn=zn!==null?ja(zn):null,Un=sn?i("chat.contextWindowAria","Estimated {{used}} of {{total}} context tokens",{used:Js,total:sn}):null,li=tn&&I==="direct"&&!!c,Zs=tn&&I==="direct",ea=tn&&I==="rooms",Hn=ve.get(c?.agentId??"")?.name||(c?.agentId===xe?Pe??"Fusion":c?.agentId?.slice(0,30)??"Fusion"),Kn=!1,Vn=c?.agentId===xe,di=e=>e.length>50?`${e.slice(0,50)}…`:e;s.useEffect(()=>{if(!$t)return;const e=n=>{Ns.current?.contains(n.target)||Re(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[$t]),s.useEffect(()=>{if(!Bt)return;const e=r=>{As.current?.contains(r.target)||bt(!1)},n=r=>{r.key==="Escape"&&bt(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",n),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",n)}},[Bt]),s.useEffect(()=>{(!O||I!=="direct"||gt)&&Re(!1)},[O,I,gt]),s.useEffect(()=>{bt(!1)},[x.activeRoom?.id]);const ta=s.useCallback((e,n)=>{const r=xt.current.get(e);r&&window.clearTimeout(r),Cs(p=>({...p,[e]:n}));const u=window.setTimeout(()=>{Cs(p=>{const{[e]:F,...ne}=p;return ne}),xt.current.delete(e)},2e3);xt.current.set(e,u)},[]),na=s.useCallback(async(e,n)=>{const r=await Gi(n);ta(e,r?"success":"error")},[ta]),Wn=c?.agentId===xe,Xn=s.useCallback((e,n,r)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${tt[e]==="success"?" chat-message-copy-action--success":""}${tt[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":r??`chat-copy-response-${e}`,"aria-label":tt[e]==="success"?i("chat.responseCopied","Response copied"):tt[e]==="error"?i("chat.copyFailed","Copy failed"):i("chat.copyResponse","Copy response"),onClick:()=>{na(e,n)},children:tt[e]==="success"?t.jsx(Yi,{size:14}):t.jsx(Qi,{size:14})}),[tt,na]),qn=s.useCallback(e=>{const n=le.current;if(!n)return;const r=`[data-testid="chat-message-${e}"]`,u=n.querySelector(r);if(!u)return;const p=u.getBoundingClientRect().top-n.getBoundingClientRect().top+n.scrollTop,F=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;n.scrollTo({top:p,behavior:F?"auto":"smooth"})},[]),sa=c?.cliExecutorAdapterId??null,Gn=!!sa,ui=sa==="generic"?"generic":"hybrid",mi=c?.cliSessionFile||c?.id||"",aa=!Gn&&!$,ia=()=>t.jsxs("div",{className:"chat-messages",ref:le,onScroll:_s,children:[t.jsx("div",{ref:Rs,className:"chat-load-more-sentinel",children:Q&&W&&t.jsx("div",{className:"chat-loading-older",children:i("chat.loadingOlderMessages","Loading older messages…")})}),$?t.jsxs(t.Fragment,{children:[N.map((e,n)=>t.jsx(Jn,{message:e,forcePlain:!1,agentName:Hn,hideAssistantIdentity:Vn,showAssistantModelTag:Kn,activeModelTag:Pe,activeModelProvider:He,activeSessionId:c?.id??null,mentionAgentsByName:In,roomContext:null,copyAction:Wn&&e.role==="assistant"?Xn(e.id,e.content):void 0,onScrollToTop:qn,isTopClipped:Sn.has(e.id),isAwaitingQuestionAnswer:e.role==="assistant"&&n===N.length-1&&!$,submittedQuestionAnswer:Ia(N,n),onQuestionSubmit:Qt,canEdit:aa,onEditMessage:b},e.id)),t.jsx(io,{streamingText:H,streamingThinking:P,streamingToolCalls:ee,forcePlain:!1,agentName:Hn,hideAssistantIdentity:Vn,showAssistantModelTag:Kn,activeModelTag:Pe,activeModelProvider:He,copyAction:Wn&&H?Xn("__streaming__",H,"chat-copy-response-streaming"):void 0,onQuestionSubmit:Qt})]}):W?t.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):N.length===0&&!c?ai():N.length===0&&c?t.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):t.jsx(t.Fragment,{children:N.map((e,n)=>t.jsx(Jn,{message:e,forcePlain:!1,agentName:Hn,hideAssistantIdentity:Vn,showAssistantModelTag:Kn,activeModelTag:Pe,activeModelProvider:He,activeSessionId:c?.id??null,mentionAgentsByName:In,roomContext:null,copyAction:Wn&&e.role==="assistant"?Xn(e.id,e.content):void 0,onScrollToTop:qn,isTopClipped:Sn.has(e.id),isAwaitingQuestionAnswer:e.role==="assistant"&&n===N.length-1&&!$,submittedQuestionAnswer:Ia(N,n),onQuestionSubmit:Qt,canEdit:aa,onEditMessage:b},e.id))}),t.jsx("div",{ref:Ss})]}),oa=()=>t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Kt,type:"file","data-testid":"chat-file-input",accept:Pa,multiple:!0,style:{display:"none"},onChange:e=>{rt(e.target.files),e.target.value=""}}),Xe&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":i("chat.skillSuggestions","Skill suggestions"),children:qa&&En.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:i("chat.loadingSkills","Loading skills…")}):be.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:pt?i("chat.noSkillsFound","No skills found"):i("chat.noSkillsAvailable","No skills available")}):be.map((e,n)=>e.kind==="command"?t.jsxs("button",{type:"button",role:"option","aria-selected":n===qe,"aria-disabled":e.disabled,className:`chat-skill-menu-item chat-command-menu-item${n===qe?" chat-skill-menu-item--highlighted":""}${e.disabled?" chat-command-menu-item--disabled":""}`,onMouseDown:r=>r.preventDefault(),onMouseEnter:()=>ze(n),onClick:()=>_n(e.command,e.disabled),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.command.trigger}),t.jsx("span",{className:"chat-skill-menu-item-description",children:e.disabled?i("chat.commandNoRunningAgentHint","No running agent to steer"):e.command.description})]},`command-${e.command.trigger}`):t.jsxs("button",{type:"button",role:"option","aria-selected":n===qe,className:`chat-skill-menu-item${n===qe?" chat-skill-menu-item--highlighted":""}`,onMouseDown:r=>r.preventDefault(),onMouseEnter:()=>ze(n),onClick:()=>Fn(e.skill),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.skill.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.skill.relativePath,children:e.skill.relativePath})]},e.skill.id))}),pe.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:pe.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>$s(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),h.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-pending-stack","data-testid":"chat-pending-stack",children:h.map((e,n)=>t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:i("chat.queuedMessage","Queued: {{preview}}",{preview:di(e)})}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":i("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":`chat-pending-dismiss-${n}`,onClick:()=>j(n),children:"×"})]},`${n}-${e}`))}),t.jsx("div",{className:"chat-pending-divider","aria-hidden":"true"})]}),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":i("chat.attachFiles","Attach files"),onClick:()=>Kt.current?.click(),children:t.jsx(pa,{size:16})}),!Gn&&t.jsx(Ca,{level:c?.thinkingLevel,defaultThinkingLevel:E,models:wn,favoriteProviders:Va,favoriteModels:Wa,agents:Array.from(ve.values()),agentId:c?.agentId,modelProvider:c?.modelProvider,modelId:c?.modelId,onChange:e=>{c&&U(c.id,e)},onChangeModel:e=>{c&&T(c.id,e)},disabled:!c}),t.jsxs("div",{className:`chat-input-wrapper${ys?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),et(!0)},onDragLeave:()=>et(!1),onDrop:e=>{e.preventDefault(),et(!1),rt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:zs,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:Z,onChange:Us,onKeyDown:Os,onKeyUp:Hs,onClick:en,onBlur:Ks,onFocus:Vs,onPaste:Bs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Zn()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(Sa,{agents:at,filter:Ge,highlightedIndex:Pt,visible:Se,onSelect:Jt,position:"below",roomMemberIds:Te?.memberIds,roomName:Te?.roomName}),t.jsx(fo,{visible:V.mentionActive&&!Se,position:Ga,tasks:V.tasks,files:V.files,selectedIndex:V.selectedIndex,onSelectTask:e=>{kt(V.selectTask(e,Z),`#${e.id}`)},onSelectFile:e=>{kt(V.selectFile(e,Z),`#${e.path}`)},loading:V.loading})]}),t.jsx(va,{isStreaming:$,canSend:!!(Z.trim()||pe.length>0),onSend:Ln,onStop:S})]})]}),hi=O?void 0:{width:`${We}px`},ra=ae.filter(e=>e.pinnedAt!=null),ca=ae.filter(e=>e.pinnedAt==null),Mt=te?ae.find(e=>e.id===te.sessionId)??(c?.id===te.sessionId?c:void 0):void 0,fi=li?t.jsxs("div",{className:"chat-mobile-session-menu",ref:Ns,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":$t,onClick:()=>Re(e=>!e),children:[He?t.jsx(Qn,{provider:He,size:"md"}):t.jsx(hn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:oi}),t.jsx(an,{size:16,"aria-hidden":"true"})]}),$t&&t.jsxs("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:[[{id:"pinned",label:i("chat.pinned","Pinned"),testId:"chat-mobile-pinned-divider",sessions:ra},{id:"recent",label:i("chat.recent","Recent"),testId:"chat-mobile-recent-divider",sessions:ca}].filter(e=>e.sessions.length>0).map(e=>t.jsxs("section",{className:"chat-session-section","data-testid":`chat-mobile-session-section-${e.id}`,children:[t.jsx("div",{className:"chat-pinned-divider","data-testid":e.testId,children:e.label}),e.sessions.map(n=>t.jsxs("div",{className:`chat-mobile-session-option-row${c?.id===n.id?" chat-mobile-session-option-row--active":""}`,role:"none",children:[t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${c?.id===n.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${n.id}`,onClick:()=>Gs(n.id),children:t.jsxs("span",{className:"chat-mobile-session-option-title",children:[n.title||i("chat.untitledSession","Untitled"),n.pinnedAt?t.jsx(on,{className:"chat-session-pinned-indicator",size:14,"data-testid":`chat-session-pinned-indicator-${n.id}`,"aria-label":i("chat.pinned","Pinned")}):null]})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-pin","data-testid":`chat-mobile-session-pin-${n.id}`,"aria-label":n.pinnedAt?i("chat.unpinConversationAria","Unpin conversation {{title}}",{title:n.title||i("chat.untitledSession","Untitled")}):i("chat.pinConversationAria","Pin conversation {{title}}",{title:n.title||i("chat.untitledSession","Untitled")}),title:!n.pinnedAt&&K>=3?i("chat.pinLimit","You can pin up to 3 conversations"):void 0,disabled:!n.pinnedAt&&K>=3,onClick:()=>qs(n.id,!n.pinnedAt),children:n.pinnedAt?t.jsx(ua,{size:14}):t.jsx(on,{size:14})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-rename","data-testid":`chat-mobile-session-rename-${n.id}`,"aria-label":i("chat.renameConversationAria","Rename conversation {{title}}",{title:n.title||i("chat.untitledSession","Untitled")}),onClick:()=>Ws(n.id),children:t.jsx(ma,{size:14})})]},n.id))]},e.id)),t.jsxs("button",{type:"button",role:"menuitem",className:"chat-mobile-session-new","data-testid":"chat-mobile-session-new",onClick:()=>{Re(!1),Yt()},children:[t.jsx(ut,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.newChat","New Chat")})]})]})]}):null,gi=t.jsxs("div",{className:"chat-sidebar-scope-toggle chat-view-header-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${I==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":I==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>Ve("direct"),children:[t.jsx(un,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.scopeDirect","Direct")})]}),t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${I==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":I==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>Ve("rooms"),children:[t.jsx(za,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.scopeRooms","Rooms")})]})]});return t.jsxs("div",{ref:Is,className:`chat-view${d?" chat-view--floating":""}${O?" chat-view--narrow":""}${Zs?" chat-view--mobile-direct-thread":""}`,children:[t.jsx(Ji,{icon:un,title:i("chat.title","Chat"),actions:t.jsxs(t.Fragment,{children:[Zs?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn-icon chat-back-btn",onClick:$n,"data-testid":"chat-back-btn","aria-label":i("chat.backToConversations","Back to conversations"),children:t.jsx(ha,{size:16})}),fi]}):gi,O?null:t.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:Yt,"data-testid":"chat-new-btn",children:[t.jsx(ut,{size:14}),i("chat.newChat","New Chat")]}),!d&&l?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:l,"aria-label":i("chat.popOut","Pop out chat"),title:i("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:t.jsx(fa,{size:16})}):null,d&&m?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:m,"aria-label":i("chat.maximizeToChatView","Open in Chat view"),title:i("chat.maximizeToChatView","Open in Chat view"),"data-testid":"chat-modal-maximize",children:t.jsx(fa,{size:16})}):null,d&&k?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:k,"aria-label":i("chat.minimizeToQuickChat","Minimize to quick chat"),title:i("chat.minimizeToQuickChat","Minimize to quick chat"),"data-testid":"chat-modal-minimize",children:t.jsx(Zi,{size:16})}):null,d&&C?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:C,"aria-label":i("chat.closeChat","Close chat"),title:i("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:t.jsx(eo,{size:16})}):null]})}),t.jsxs("div",{className:"chat-view__body",children:[t.jsxs("div",{className:`chat-sidebar${gt?"":" chat-sidebar--hidden"}`,style:hi,children:[I==="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(to,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:i("chat.searchConversations","Search conversations..."),value:ye,onChange:e=>se(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:z?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.loadingConversations","Loading...")}):ae.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.noConversationsYet","No conversations yet")}):t.jsx(t.Fragment,{children:[{id:"pinned",label:i("chat.pinned","Pinned"),testId:"chat-pinned-divider",sessions:ra},{id:"recent",label:i("chat.recent","Recent"),testId:"chat-recent-divider",sessions:ca}].filter(e=>e.sessions.length>0).map(e=>t.jsxs("section",{className:"chat-session-section","data-testid":`chat-session-section-${e.id}`,children:[t.jsx("div",{className:"chat-pinned-divider","data-testid":e.testId,children:e.label}),e.sessions.map(n=>{const r=c?.id===n.id,u=!r&&fs("direct",n.id,n.lastMessageAt??n.updatedAt),p=Fa(n,ve.get(n.agentId)??null,Lt),F=da(p?.provider,p?.modelId)??"Fusion",ne=n.title||i("chat.untitledSession","Untitled");return t.jsxs("div",{className:`chat-session-item${r?" chat-session-item--active":""}`,onClick:()=>Gs(n.id),onContextMenu:X=>{X.preventDefault(),gs(n.id,X.clientX,X.clientY)},"data-testid":`chat-session-${n.id}`,children:[t.jsx("button",{type:"button",className:"btn-icon chat-session-menu-btn","data-testid":"chat-session-menu-btn","aria-label":i("chat.conversationActionsAria","Conversation actions for {{title}}",{title:ne}),"aria-haspopup":"menu","aria-expanded":te?.sessionId===n.id,onClick:X=>{if(X.stopPropagation(),te?.sessionId===n.id){Me(null);return}const re=X.currentTarget.getBoundingClientRect();gs(n.id,re.right,re.bottom,{anchorRight:!0})},children:t.jsx(no,{size:14})}),t.jsxs("div",{className:"chat-session-title",children:[ne,n.pinnedAt?t.jsx(on,{className:"chat-session-pinned-indicator",size:14,"data-testid":`chat-session-pinned-indicator-${n.id}`,"aria-label":i("chat.pinned","Pinned")}):null,u?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${n.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),t.jsx("div",{className:"chat-session-preview",children:n.lastMessagePreview||i("chat.noMessages","No messages")}),n.matchedMessagePreview?t.jsx("div",{className:"chat-session-preview chat-session-preview--matched","data-testid":`chat-session-matched-preview-${n.id}`,children:i("chat.matchedInMessage",'Matched: "{{preview}}"',{preview:n.matchedMessagePreview})}):null,t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[p?.provider?t.jsx(Qn,{provider:p.provider,size:"sm"}):null,t.jsx("span",{children:ve.get(n.agentId)?.name||(n.agentId===xe?F:n.agentId.slice(0,30))})]}),t.jsx("span",{children:n.updatedAt?Eo(n.updatedAt,i):""})]})]},n.id)})]},e.id))})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!O&&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:()=>Dt(!0),children:[t.jsx(ut,{size:14}),i("chat.createRoom","Create room")]})}),x.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:i("chat.noRoomsYet","No rooms yet.")}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:x.rooms.map(e=>{const n=x.activeRoom?.id===e.id,r=!n&&fs("room",e.id,e.updatedAt);return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${n?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{me("room",e.id,e.updatedAt),x.selectRoom(e.id),O&&$e(!1)},onKeyDown:u=>{(u.key==="Enter"||u.key===" ")&&(u.preventDefault(),me("room",e.id,e.updatedAt),x.selectRoom(e.id),O&&$e(!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]}),r?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),n?t.jsx("span",{className:"chat-room-item-meta",children:i("chat.roomMemberCount","{{count}} member",{count:x.activeRoomMembers.length,defaultValue_one:"{{count}} member",defaultValue_other:"{{count}} members"})}):null]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":i("chat.deleteRoom","Delete room {{name}}",{name:e.name}),onClick:u=>{u.stopPropagation(),It(e.id)},children:t.jsx(ga,{size:14})})]},e.id)})})]}),I==="rooms"?O?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:()=>Dt(!0),children:[t.jsx(ut,{size:14}),i("chat.createRoom","Create room")]})}):null:O?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:Yt,"data-testid":"chat-new-btn",children:[t.jsx(ut,{size:14}),i("chat.newChat","New Chat")]})}):null]}),!O&>&&!yt&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":ln,"aria-valuemax":dn,"aria-valuenow":We,"aria-label":i("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:ni,onKeyDown:si}),te&&t.jsxs("div",{className:"chat-session-context-menu",ref:gn,role:"menu",style:{top:te.y,left:te.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>qs(te.sessionId,!Mt?.pinnedAt),"data-testid":"chat-context-pin",title:K>=3&&!Mt?.pinnedAt?i("chat.pinLimit","You can pin up to 3 conversations"):void 0,disabled:K>=3&&!Mt?.pinnedAt,children:[Mt?.pinnedAt?t.jsx(ua,{size:14}):t.jsx(on,{size:14}),Mt?.pinnedAt?i("chat.unpin","Unpin"):i("chat.pin","Pin")]}),t.jsxs("button",{onClick:()=>Ws(te.sessionId),"data-testid":"chat-context-rename",children:[t.jsx(ma,{size:14}),i("chat.rename","Rename")]}),t.jsxs("button",{onClick:()=>ei(te.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(so,{size:14}),i("chat.archive","Archive")]}),t.jsxs("button",{onClick:()=>{Me(null),Et(te.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(ga,{size:14}),i("chat.delete","Delete")]})]}),jt&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Tt(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"chat-rename-dialog-title",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{id:"chat-rename-dialog-title",children:i("chat.renameConversationTitle","Rename Conversation")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.renameConversationBody","Choose a new name for this conversation. Leave it blank to show Untitled.")}),t.jsx("label",{className:"chat-rename-label",htmlFor:"chat-rename-input",children:i("chat.conversationName","Conversation name")}),t.jsx("input",{id:"chat-rename-input",className:"input chat-rename-input",type:"text",value:pn,placeholder:i("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:e=>vn(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),Xs())},autoFocus:!0}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Tt(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Xs(),"data-testid":"chat-rename-save",children:i("chat.save","Save")})]})]})}),ps&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Et(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:i("chat.deleteConversationTitle","Delete Conversation?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.deleteConversationBody","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:()=>Et(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void ti(ps),children:i("chat.delete","Delete")})]})]})}),vs&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>It(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:i("chat.deleteRoomTitle","Delete Room?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.deleteRoomBody","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:()=>It(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await x.deleteRoom(vs),It(null)}catch{o(i("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:i("chat.delete","Delete")})]})]})}),I==="rooms"?t.jsxs("div",{ref:Mn,className:"chat-thread",children:[x.activeRoom?t.jsxs(t.Fragment,{children:[(!O||ea)&&t.jsxs("div",{className:"chat-room-thread-header",children:[ea&&t.jsx("button",{className:"btn-icon",onClick:Bn,"data-testid":"chat-back-btn",children:t.jsx(ha,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:As,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":Bt,onClick:()=>bt(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",x.activeRoom.name]}),t.jsx(an,{size:16,"aria-hidden":"true"})]}),Bt&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:x.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===x.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{me("room",e.id,e.updatedAt),x.selectRoom(e.id),bt(!1)},children:["#",e.name]},e.id))})]}),t.jsx("div",{className:"chat-room-thread-members",children:x.activeRoomMembers.map(e=>t.jsx(fn,{agent:ve.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:le,onScroll:_s,children:[x.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):x.messages.filter(e=>e.content.trim()!==Ta).length===0?t.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):x.messages.filter(e=>e.content.trim()!==Ta).map(e=>{const n=e.senderAgentId?ve.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):i("chat.you","You"),r={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(Jn,{message:r,forcePlain:!1,agentName:n,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:x.activeRoom?.id??null,mentionAgentsByName:In,roomContext:Te,onScrollToTop:qn,isTopClipped:Sn.has(e.id),isAwaitingQuestionAnswer:!1,onQuestionSubmit:Qt},e.id)}),t.jsx("div",{ref:Ss})]}),x.activeRoom&&ks&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>we("fab-click"),children:[t.jsx(an,{size:14}),i("chat.latest","Latest")]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:i("chat.selectRoomOrCreate","Select a room or create one")}),x.activeRoom&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Kt,type:"file",accept:Pa,multiple:!0,style:{display:"none"},onChange:e=>{rt(e.target.files),e.target.value=""}}),pe.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:pe.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>$s(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>Kt.current?.click(),children:t.jsx(pa,{size:16})}),t.jsx(Ca,{level:x.activeRoom.thinkingLevel,defaultThinkingLevel:E,showTargetSection:!1,onChange:e=>{x.updateRoomSettings(x.activeRoom.id,{thinkingLevel:e||null}).catch(()=>{o(i("chat.failedToUpdateRoomThinkingLevel","Failed to update room thinking effort"),"error")})}}),t.jsxs("div",{className:`chat-input-wrapper${ys?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),et(!0)},onDragLeave:()=>et(!1),onDrop:e=>{e.preventDefault(),et(!1),rt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:zs,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:Z,onChange:Us,onKeyDown:Os,onKeyUp:Hs,onClick:en,onBlur:Ks,onFocus:Vs,onPaste:Bs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Zn()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(Sa,{agents:at,filter:Ge,highlightedIndex:Pt,visible:Se,onSelect:Jt,position:"below",roomMemberIds:Te?.memberIds,roomName:Te?.roomName})]}),t.jsx(va,{isStreaming:!1,canSend:!!(Z.trim()||pe.length>0),onSend:Pn})]})]})]}):t.jsxs("div",{ref:Mn,className:"chat-thread",children:[!O&&(On||!O)&&t.jsx("div",{className:"chat-thread-header",children:t.jsxs("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:[He?t.jsx(Qn,{provider:He,size:"md"}):t.jsx(hn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Qs}),ri&&t.jsx("span",{className:"chat-model-tag",children:Pe}),ci&&sn&&Un?t.jsxs("span",{className:"chat-thread-header-context","data-testid":"chat-thread-context-window",title:Un,"aria-label":Un,children:[Js," / ",sn]}):null]})}),Gn?t.jsx(vo,{cliSessionId:mi,tier:ui,projectId:a,renderTranscript:ia,renderComposer:()=>c?oa():null}):t.jsxs(t.Fragment,{children:[ia(),ks&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>we("fab-click"),children:[t.jsx(an,{size:14}),i("chat.latest","Latest")]}),c&&oa()]})]}),t.jsx(po,{isOpen:Ka,onClose:()=>Dt(!1),projectId:a,existingRoomNames:x.rooms.map(e=>e.name),onCreate:async e=>{await x.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),I!=="rooms"&&Ve("rooms"),Dt(!1),O&&$e(!1)}})]}),ge&&t.jsx(_o,{projectId:a,defaultModel:Xa,defaultKind:v?.kind,defaultAgentId:v?.kind==="agent"?v.agentId:void 0,defaultThinkingLevel:E,defaultSelectedThinkingLevel:v?.kind==="model"?v.thinkingLevel:void 0,onClose:()=>Ce(!1),onCreate:ct})]})}export{Xo as ChatView,Wo as buildIssueChatPrefill,To as clampChatInputHeight,Ao as resolveChatContextMenuPosition,jo as resolveChatInputOverflowY,Fa as resolveSessionProvider};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as f,j as s,g as on,a as Vx,b as El,c as Ux}from"./vendor-react-SZ_qB27O.js";import{c as Ht,
|
|
1
|
+
import{r as f,j as s,g as on,a as Vx,b as El,c as Ux}from"./vendor-react-SZ_qB27O.js";import{c as Ht,gD as qx,dC as uh,L as _l,h as gi,gE as bi,a as or,w as lr,gF as Ml,aa as Tl,gG as yu,R as Kt,ax as Wx,gH as Hx,aK as Gx,aR as xi,gI as dh,dT as Xx,aV as fh,aW as mh,bp as Yx,aI as Il,c2 as Dl,c3 as Zx,gJ as Jx,al as Qx,f6 as ej,gK as tj,ad as vh,gL as rj,gM as nj,bI as gu,gN as bu,fj as aj,gi as xu,gO as ij,bc as To,gP as sj,gQ as oj,gR as lj,gS as cj,gj as uj,gT as dj,gU as fj,gV as mj,gf as vj,gW as hj,y as pj,aL as yj,gk as hh,gX as gj,bv as bj,u as xj,gY as jj,ar as wj,gZ as ju,g_ as Cj,g$ as kj,h0 as Sj,h1 as Pj,h2 as Nj,h3 as Oj,h4 as Rl,h5 as Ll,h6 as wu,cN as Ea,h7 as Cu,h8 as Io,h9 as ph,ha as Do,bd as yh,bJ as gh,Y as Aj,c4 as bh,d1 as Ej,x as Ro,cV as _j,C as $l,P as _a,hb as Mj,hc as Tj,v as Ij,eA as ku,X as Ca,E as Dj,p as Rj,a$ as Su,aG as Lj,hd as Pu,he as $j,hf as Bj,hg as Fj,hh as zj,dR as Kj,hi as Vj,hj as Uj}from"./index-D8TQBkB7.js";import{u as oe}from"./vendor-i18n-GF3RlKbq.js";import{a as xh,b as jh,p as qj,w as Wj}from"./vendor-reactflow-9C3XTE7_.js";import{w as wh,n as Ch,a as Ee,A as Bl,G as Hj,H as Gj,l as kh,t as ji,b as Pt,p as Lo,s as Ma,c as Sh,q as Xj,r as Yj,u as Zj,v as Jj,x as Qj,y as e0,z as t0,C as r0,D as n0,k as a0,E as i0,F as s0}from"./step-yuy0qJer.js";import{b as o0,p as l0}from"./band-CquvqAHh.js";import{d as Ta,n as c0,e as u0,f as $o,g as Rr,h as Fl,a as zl,i as Nu,j as zt,c as d0,k as wi,l as f0,m as m0}from"./linear-BX4tvjNK.js";import{i as dr,a as Gt}from"./init-Dmth1JHB.js";import{m as Ou,a as Au,p as v0,q as h0,u as p0,s as y0,r as g0,v as b0,w as x0,x as j0,y as w0,z as C0,A as k0,B as S0,t as P0}from"./time-DMMzMWYg.js";import{f as N0,b as O0}from"./defaultLocale-DX6XiGOO.js";import{i as A0,o as E0}from"./ordinal-DILIJJjt.js";import{r as _0}from"./agentsOrgChartLayout-BMvyuaLA.js";import{U as Kl}from"./upload-CFL3ZlNN.js";import{S as M0}from"./shield-alert-j_jHfoeI.js";import{b as T0}from"./agent-import-generation-Dl3UAfFr.js";import{r as I0,B as D0,R as R0,b as L0,a as $0}from"./ReportModal-BfNu73zb.js";import{PluginManager as B0}from"./PluginManager-5DK-HUkf.js";import{v as F0}from"./projectDetection-G3XuxD2X.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";import"./DirectoryPicker-Ba9x3E72.js";import"./folder-open-Dc23V8n6.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as a,j as r}from"./vendor-react-SZ_qB27O.js";import{a as $,w as O,cV as tr,bc as sr,cL as ie,L as pe,aH as _r,cW as Ar,cX as Tr,cY as Or,C as Fr,aZ as nr,cZ as $r,V as zr,c_ as Hr,c2 as Ir,c4 as Br,c$ as Vr,p as He,X as Wr,aQ as qr,R as Xr}from"./index-CE7C_XsS.js";import{u as fe}from"./vendor-i18n-GF3RlKbq.js";import{S as ar}from"./shield-alert-_iY63ED4.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const s=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",n=s==="root"?".":s,t=e.name,v=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():n,d=typeof e.confidence=="number"?e.confidence:1,b=s==="root"?"root":s,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:t,packagePath:v,confidence:d,cwd:n,source:s,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${t} (${b})`}}function te(e){const s=e.status,n=s==="starting"||s==="running"||s==="failed"||s==="stopped"?s:"stopped",t=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,v=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:n,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:t,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:t,detectedPort:e.detectedPort,manualPreviewUrl:v,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:v,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function Jr(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Kr(e){const n=(Array.isArray(e.lines)?e.lines:[]).map((t,v)=>Jr(t,v+1));return{lines:n,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:n.length}}function Yr(e,s){const n=typeof s.maxLines=="number"&&Number.isFinite(s.maxLines)?Math.max(1,Math.floor(s.maxLines)):100,t=typeof s.offset=="number"&&Number.isFinite(s.offset)?Math.max(0,Math.floor(s.offset)):0,v=typeof s.lastEventId=="number"&&Number.isFinite(s.lastEventId)?Math.max(0,Math.floor(s.lastEventId)):null,d=e.length,b=e.map((N,z)=>({id:z+1,text:N,stream:"stdout",timestamp:""}));if(v!==null)return{lines:b.filter(N=>N.id>v).slice(0,n),totalLines:d};const m=Math.max(d-t,0),k=Math.max(m-n,0);return{lines:b.slice(k,m),totalLines:d}}function Be(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function ir(e){try{const s=await $(O("/dev-server/candidates",e));return Be(s)}catch(s){if(s instanceof Error&&/\/dev-server\/candidates/.test(s.message)){const n=await $(O("/dev-server/detect",e));return Be(n)}throw s}}function he(e){return $(O("/dev-server/status",e)).then(te)}async function Ne(e={},s){const n=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&n.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&n.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&n.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const t=n.size>0?`?${n.toString()}`:"";try{const v=await $(O(`/dev-server/logs/history${t}`,s));return Kr(v)}catch(v){if(v instanceof Error&&/\/dev-server\/logs\/history/.test(v.message)){const d=await he(s);return Yr(d.logs,e)}throw v}}function or(e,s){const n=e.cwd??e.packagePath??".",t=e.scriptName;return $(O("/dev-server/start",s),{method:"POST",body:JSON.stringify({command:e.command,scriptName:t,scriptId:t,cwd:n,packagePath:e.packagePath})}).then(te)}function lr(e){return $(O("/dev-server/stop",e),{method:"POST"}).then(te)}function cr(e){return $(O("/dev-server/restart",e),{method:"POST"}).then(te)}async function dr(e,s){const n=typeof e=="string"?{url:e}:e;try{const t=await $(O("/dev-server/preview-url",s),{method:"POST",body:JSON.stringify(n)});return te(t)}catch(t){if(t instanceof Error&&/\/dev-server\/preview-url/.test(t.message)){const v=await $(O("/dev-server/preview-url",s),{method:"PUT",body:JSON.stringify(n)});return te(v)}throw t}}function Re(e){return tr(O("/dev-server/logs/stream",e))}async function Ue(e){try{return(await $(O("/devserver",e))).sessions??[]}catch{try{const s=await he(e);return[{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function vr(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}`,s))}catch{try{const n=await he(s);return!e||e==="default"||e===n.id?{config:{id:n.id??"default",name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Ve(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/start`,s),{method:"POST"})}catch{const n=await or({command:""},s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function We(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/stop`,s),{method:"POST"})}catch{const n=await lr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function qe(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/restart`,s),{method:"POST"})}catch{const n=await cr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,s,n){try{const t=await $(O(`/devserver/${encodeURIComponent(e)}/preview`,n),{method:"POST",body:JSON.stringify({url:s})});return{url:t.url??null,source:t.source??null}}catch{const t=await dr({url:s},n);return{url:t.previewUrl??t.manualUrl??null,source:"manual"}}}async function ke(e){try{return(await $(O("/devserver/detect",e))).candidates??[]}catch{try{return(await ir(e)).map(n=>({name:n.name,command:n.command,cwd:n.cwd,scriptName:n.scriptName,packagePath:n.packagePath}))}catch{return[]}}}function Gr(e,s){return tr(O(`/devserver/${encodeURIComponent(e)}/logs/stream`,s))}const De=500,Qr=3e3;function q(e){return e instanceof Error?e.message:String(e)}function ur(e){return e.length<=De?e:e.slice(-De)}function Ce(e,s){return ur([...e,s])}function re(e){try{return JSON.parse(e)}catch{return null}}function ve(e){const s=e.text??"";return e.stream==="stderr"?`[stderr] ${s}`:s}function Zr(e){return e?.previewUrl??null}async function Je(e){return he(e)}async function Ke(e,s){return or(e,s)}async function et(e){return lr(e)}async function rt(e){return cr(e)}async function Ye(e){return ir(e)}function K(e){try{return e()}catch{return null}}function je(){return typeof K(()=>Ue)=="function"&&typeof K(()=>vr)=="function"}function Z(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(s=>({timestamp:new Date().toISOString(),stream:s.startsWith("[stderr]")?"stderr":"stdout",text:s.replace(/^\[stderr\]\s*/,"")}))}}function tt(e){const{t:s}=fe("app"),[n,t]=a.useState(null),[v,d]=a.useState([]),[b,m]=a.useState([]),[k,N]=a.useState([]),[z,L]=a.useState(!0),[j,h]=a.useState(null),c=a.useRef(0),[p,D]=a.useState(null),F=a.useCallback(o=>{if(t(o),o?.logHistory){const i=o.logHistory.slice(-De).map(ve);m(i)}},[]),E=a.useCallback(async()=>{const o=c.current;try{if(je())if(p){const i=await vr(p,e);if(c.current!==o)return;F(i)}else{const i=await Ue(e);if(c.current!==o)return;d(i),i.length>0&&(D(i[0].config.id),F(i[0]))}else{const i=await Je(e);if(c.current!==o)return;const g=Z(i);d([g]),F(g)}h(null)}catch(i){if(c.current!==o)return;h(q(i))}},[F,e,p]);a.useEffect(()=>{c.current+=1;const o=c.current;t(null),d([]),m([]),N([]),L(!0),h(null),D(null),(async()=>{try{const[g,u]=await Promise.allSettled([je()?Ue(e):Je(e).then(y=>[Z(y)]),typeof K(()=>ke)=="function"?ke(e):Ye(e).then(y=>y.map(U=>({name:U.name,command:U.command,cwd:U.cwd,scriptName:U.scriptName,packagePath:U.packagePath})))]);if(c.current!==o)return;let w=null;if(g.status==="fulfilled"){const y=g.value;if(d(y),y.length>0){const U=y[0];je()&&D(U.config.id),F(U)}}else w=q(g.reason);u.status==="fulfilled"&&N(u.value),w&&h(w)}catch(g){if(c.current!==o)return;h(q(g))}finally{c.current===o&&L(!1)}})()},[F,e]),a.useEffect(()=>{const o=p?Gr(p,e):typeof K(()=>Re)=="function"?Re(e):null;if(!o)return;const i=c.current,g=sr(o,{events:{history:u=>{if(c.current!==i)return;const w=re(u.data);if(w?.lines){const y=w.lines.map(ve);m(ur(y))}},log:u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:log":u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:output":u=>{if(c.current!==i)return;const w=re(u.data);w?.line&&m(y=>Ce(y,w.line))},status:u=>{if(c.current!==i)return;const w=re(u.data),y=w?.status;y&&t(U=>U&&{...U,status:y,runtime:w.pid?{...U.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:U.runtime})},"dev-server:status":u=>{if(c.current!==i)return;const w=re(u.data);if(w?.status){const y=Z(w);t(y),d([y])}},stopped:()=>{c.current},failed:()=>{c.current}},onReconnect:()=>{c.current===i&&E()},onError:()=>{c.current===i&&h(u=>u??s("devserver.lostConnection","Lost log stream connection."))}});return()=>{g()}},[e,E,p]),a.useEffect(()=>{if(n?.status!=="running"&&n?.status!=="starting")return;const o=setInterval(()=>{E()},Qr);return()=>{clearInterval(o)}},[E,n?.status]);const _=a.useCallback(async(o,i)=>{c.current+=1;const g=c.current;try{let u;const w=typeof i=="string"&&i.length>0,y=n?.config?.cwd??".";if(!(w&&i!==y)&&p&&typeof K(()=>Ve)=="function")u=await Ve(p,e);else{const W=await Ke({command:o,cwd:i},e);u=Z(W)}if(c.current!==g)return;t(u),h(null)}catch(u){if(c.current!==g)return;throw h(q(u)),u}},[e,n?.config?.cwd,p]),R=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>We)=="function")i=await We(p,e);else{const g=await et(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),I=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>qe)=="function")i=await qe(p,e);else{const g=await rt(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),B=a.useCallback(async o=>{c.current+=1;const i=c.current;try{let g;if(p&&typeof K(()=>Xe)=="function")g=await Xe(p,o,e);else{const u=await dr({url:o},e);g={url:u.manualUrl??u.previewUrl??u.detectedUrl??null,source:u.manualUrl?"manual":"auto"}}if(c.current!==i)return;t(u=>u?{...u,previewUrl:g.url??void 0}:null),h(null)}catch(g){if(c.current!==i)return;throw h(q(g)),g}},[e,p]),H=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;try{i=await ke(e)}catch{i=(await Ye(e)).map(u=>({name:u.name,command:u.command,cwd:u.cwd,scriptName:u.scriptName,packagePath:u.packagePath}))}if(c.current!==o)return;N(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e]),P=a.useCallback(async(o,i)=>{if(typeof o!="string"&&!p)try{const w=o,y=await Ke({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),U=Z(y);t(U),d([U]),h(null);return}catch(w){throw h(q(w)),w}const g=typeof o=="string"?o:o.command,u=typeof o=="string"?i:o.cwd;await _(g,u)},[e,_,p]),x=a.useCallback(async()=>{await R()},[R]),f=a.useCallback(async()=>{await I()},[I]),A=a.useCallback(async o=>{await B(o)},[B]),T=a.useCallback(async()=>{await H()},[H]),X=a.useCallback(async()=>{await E()},[E]),C=Zr(n),S=n?{...n,pid:n.runtime?.pid}:null;return{session:n,sessions:v,logs:b,detectedCommands:k,previewUrl:C,isLoading:z,error:j,startServer:_,stopServer:R,restartServer:I,setPreviewUrl:B,detectCommands:H,refresh:E,candidates:k,serverState:S,loading:z,start:P,stop:x,restart:f,setManualUrl:A,detect:T,refreshStatus:X}}const Ge=500,Qe=100;function mr(e){return e.length>Ge?e.slice(-Ge):e}function pr(e){return e==="stderr"?"stderr":"stdout"}function ue(e){try{return JSON.parse(e.data)}catch{return null}}function me(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:"",stream:pr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function st(e,s){return{id:s,text:e,stream:"stdout",timestamp:""}}function Le(e,s){if(s.length===0)return e;const n=[...e],t=new Set(e.map(v=>v.id));for(const v of s)t.has(v.id)||(t.add(v.id),n.push(v));return n.sort((v,d)=>v.id-d.id),mr(n)}function nt(e,s){const[n,t]=a.useState([]),[v,d]=a.useState(!1),[b,m]=a.useState(!1),[k,N]=a.useState(!1),[z,L]=a.useState(null),j=a.useRef(null),h=a.useRef(!1),c=a.useRef(0),p=a.useRef(0),D=a.useRef(e),F=a.useRef(s),E=a.useRef(0),_=a.useRef(1);(D.current!==e||F.current!==s)&&(D.current=e,F.current=s,c.current++,ie({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,E.current=0,_.current=1,t([]),d(!1),m(!1),N(!1),L(null),j.current&&(j.current(),j.current=null)),a.useEffect(()=>{if(!s){j.current&&(j.current(),j.current=null);return}const P=c.current,x=++p.current;h.current=!1,d(!0);const f=(C,S)=>{const o=mr(C);t(o),L(S),N(S!==null?S>o.length:!1);const i=o.length>0?o[o.length-1].id:0;E.current=i,_.current=i+1},A=C=>{if(h.current||c.current!==P||!C||typeof C!="object")return;const S=C.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const i=S.filter(g=>typeof g=="string").map((g,u)=>st(g,u+1));f(i,i.length);return}const o=S.filter(i=>!!i&&typeof i=="object").map((i,g)=>me(i,g+1));f(o,o.length)},T=C=>{if(h.current||c.current!==P)return;const S=typeof C.text=="string"?C.text:typeof C.line=="string"?C.line:null;if(!S)return;const o=_.current,i=typeof C.id=="number"&&Number.isFinite(C.id)?C.id:o,g={id:i,text:S,stream:pr(C.stream),timestamp:typeof C.timestamp=="string"?C.timestamp:""};E.current=Math.max(E.current,i),_.current=Math.max(_.current,i+1),t(u=>Le(u,[g])),L(u=>u===null?u:Math.max(u+1,g.id))};async function X(){try{const S=await Ne({maxLines:Qe},e);if(h.current||c.current!==P||p.current!==x)return;const o=S.lines.map((i,g)=>me(i,g+1));f(o,S.totalLines)}catch{if(h.current||c.current!==P||p.current!==x)return;f([],null)}finally{!h.current&&c.current===P&&p.current===x&&d(!1)}const C=Re(e);j.current=sr(C,{events:{"dev-server:log":S=>{const o=ue(S);o&&T(o)},log:S=>{const o=ue(S);o&&T(o)},history:S=>{const o=ue(S);A(o)},"dev-server:history":S=>{const o=ue(S);A(o)}},onReconnect:()=>{ie({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:E.current??null,sseChannel:C,reason:"history-replay"}),!(h.current||c.current!==P)&&Ne({lastEventId:E.current,maxLines:50},e).then(S=>{if(h.current||c.current!==P)return;const o=S.lines.map((i,g)=>me(i,_.current+g));if(o.length>0){const i=o[o.length-1].id;E.current=Math.max(E.current,i),_.current=Math.max(_.current,i+1)}t(i=>Le(i,o)),L(S.totalLines)}).catch(()=>{})}}),ie({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:C})}return X(),()=>{h.current=!0,j.current&&(j.current(),j.current=null)}},[s,e]);const I=a.useCallback(async()=>{if(!s||b)return;const P=c.current,x=n.length;m(!0);try{const f=await Ne({maxLines:Qe,offset:x},e);if(h.current||c.current!==P)return;const A=f.lines.map((T,X)=>me(T,X+1));t(T=>Le(A,T)),N(f.totalLines>x+A.length),L(f.totalLines)}catch{}finally{m(!1)}},[s,n.length,b,e]),B=a.useCallback(()=>{t([])},[]),H=j.current!==null&&!v&&!h.current;return{entries:n,loading:v,loadingMore:b,hasMore:k,total:z,loadMore:I,clear:B,logs:n,isStreaming:H,clearLogs:B}}const at="This preview appears to block iframe embedding. Open it in a new tab instead.",it="The preview URL could not be loaded. Verify the server is running and the URL is correct.",ot="Preview is taking longer than expected and may block iframe embedding.";function lt(e){return e==="blocked"?at:e==="error"?it:null}function ct(e,s={}){const{loadTimeoutMs:n=1e4,detectionMethod:t=null}=s,v=a.useRef(null),d=a.useRef(null),[b,m]=a.useState("unknown"),[k,N]=a.useState(null),[z]=a.useState(t),L=a.useCallback(()=>{d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),j=a.useCallback(R=>{m(R),N(lt(R))},[]),h=a.useCallback(()=>{m("blocked"),N(ot)},[]);a.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let R=!1;return queueMicrotask(()=>{R||(m("loading"),N(null))}),()=>{R=!0,L()}},[L,e]),a.useEffect(()=>{if(b!=="loading"){L();return}const R=setTimeout(()=>{d.current=null,h()},n);return d.current=R,()=>{clearTimeout(R),d.current===R&&(d.current=null)}},[L,b,n,h]);const c=a.useCallback(()=>{const R=v.current;if(!R){j("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){j("blocked");return}}catch{}j("embedded")},[j]),p=a.useCallback(()=>{j("error")},[j]);a.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[L]);const D=a.useCallback(()=>{L(),m("unknown"),N(null)},[L]),F=D,E=a.useMemo(()=>b==="embedded",[b]),_=a.useMemo(()=>b==="blocked"||b==="error",[b]);return{embedStatus:b,isEmbedded:E,isBlocked:_,blockReason:k,detectionMethod:z,iframeRef:v,resetEmbedStatus:D,setEmbedStatus:j,retry:F,embedContext:k,handleIframeLoad:c,handleIframeError:p}}const dt=/\x1b\[[0-9;]*m/g,vt=50;function ut(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=vt}function Pe(e){return e.replace(dt,"")}function mt(e){if(!e)return"";const s=new Date(e);return Number.isNaN(s.getTime())?"":s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function pt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ft(e){if(e.stream==="stderr")return"error";const s=Pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(s)?"warn":/\b(error|fatal)\b/.test(s)?"error":"info"}function ht(e,s){if(!s)return e;const n=new RegExp(`(${pt(s)})`,"ig"),t=e.split(n),v=s.toLowerCase();return r.jsx(r.Fragment,{children:t.map((d,b)=>d.toLowerCase()===v?r.jsx("mark",{children:d},`${d}-${b}`):r.jsx("span",{children:d},`${d}-${b}`))})}function gt({entries:e,loading:s,loadingMore:n,hasMore:t,total:v,onLoadMore:d,isRunning:b}){const{t:m}=fe("app"),k=a.useRef(null),N=a.useRef(e.length),z=a.useRef(b),[L,j]=a.useState(!1),[h,c]=a.useState(!1),p=a.useRef(!1),[D,F]=a.useState(""),[E,_]=a.useState("all"),R=a.useMemo(()=>E==="all"?e:e.filter(f=>ft(f)===E),[e,E]),I=a.useMemo(()=>{const f=D.trim().toLowerCase();return f?R.filter(A=>Pe(A.text).toLowerCase().includes(f)):R},[R,D]),B=I.length,H=a.useCallback(f=>{p.current=f,c(f)},[]),P=a.useCallback(()=>{const f=k.current;f&&(f.scrollTop=f.scrollHeight,H(!1))},[H]);a.useEffect(()=>{const f=z.current,A=N.current,T=e.length>A;b&&(!f||!h&&T)&&P(),z.current=b,N.current=e.length},[e.length,b,h,P]);const x=a.useCallback(()=>{const f=k.current;f&&H(!ut(f))},[H]);return a.useEffect(()=>{s||e.length===0||!h&&b&&P()},[e,b,h,s,P]),a.useEffect(()=>{const f=k.current;if(!f||!b||typeof MutationObserver>"u")return;const A=new MutationObserver(()=>{p.current||P()});return A.observe(f,{childList:!0,characterData:!0,subtree:!0}),()=>A.disconnect()},[b,P]),s&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(pe,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${L?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:m("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[v!==null?`${e.length}/${v}`:`${e.length}`," ",m("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:E,onChange:f=>_(f.target.value),"data-testid":"devserver-log-severity-filter","aria-label":m("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:m("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:m("devserver.info","Info")}),r.jsx("option",{value:"warn",children:m("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:m("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.searchLogs","Search logs")}),r.jsx(_r,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:D,onChange:f=>F(f.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),D.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>j(f=>!f),"data-testid":"devserver-log-fullscreen-toggle","aria-label":L?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:L?r.jsx(Ar,{size:14}):r.jsx(Tr,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[t&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:d,disabled:n,"data-testid":"devserver-log-load-more-button",children:n?r.jsxs(r.Fragment,{children:[r.jsx(pe,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:x,"data-testid":"devserver-log-content",children:[!s&&I.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?m("devserver.noLogsYet","No logs yet. Start the dev server to see output."):R.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),I.map(f=>{const A=Pe(f.text),T=mt(f.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[T&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:T}),f.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:m("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Or(ht(A,D.trim()))})]},f.id)})]}),h&&b&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx(Fr,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const wt="devserver-preview-iframe";function bt({url:e,embedStatus:s,onEmbedStatusChange:n,iframeRef:t,blockReason:v,onRetry:d,className:b=wt,embedContext:m}){const{t:k}=fe("app"),N=v??m??null,[z,L]=a.useState(0);a.useEffect(()=>{!e||s!=="unknown"||(L(p=>p+1),n("loading"))},[s,n,e]);const j=a.useCallback(()=>{const p=t.current;if(!p){n("embedded");return}try{if(p.contentWindow?.location?.href==="about:blank"&&p.src!=="about:blank"){n("blocked");return}}catch{}n("embedded")},[t,n]),h=a.useCallback(p=>{p.stopPropagation(),n("error")},[n]),c=a.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:t,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:b,title:"Dev server preview",onLoad:j,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),s==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:k("preview.loading","Loading preview...")})]}),s==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.blockedTitle","Preview cannot be embedded")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]}),s==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.errorTitle","Unable to load preview")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]})]}):null}function xt(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}const yt=480;function St(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function fr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const s=e.parentElement;return s?.classList.contains("right-dock__body")?s:null}function Nt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function kt(e){if(!e||St())return!1;const s=fr(e);return s?Nt(s)<=yt:!1}function Ct(e){const[s,n]=a.useState(!1);return a.useEffect(()=>{const t=e.current;if(!t){n(!1);return}const v=fr(t),d=()=>n(kt(t));if(d(),!v||typeof ResizeObserver>"u")return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d);const b=new ResizeObserver(d);return b.observe(v),window.addEventListener("resize",d),()=>{b.disconnect(),window.removeEventListener("resize",d)}},[e]),s}let Ee=!1;function Ze(e){return e instanceof Error?e.message:String(e)}function hr(e){return e==="."?"root":e}function er(e){return e?e==="root"?".":e:null}function rr(e,s,n){return!s||e.scriptName!==s?!1:n?hr(e.cwd)===n:!0}function jt(e){return e.cwd==="."?"root":e.cwd}function Lt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function At({addToast:e,projectId:s,tasks:n}){const{t}=fe("app");a.useEffect(()=>(ie({view:"DevServerView",trigger:Ee?"route-active":"remount",projectId:s,replayAttempted:!1}),Ee=!1,()=>{Ee=!0,ie({view:"DevServerView",trigger:"route-inactive",projectId:s,replayAttempted:!1})}),[s]);const{session:v,detectedCommands:d,previewUrl:b,isLoading:m,error:k,startServer:N,stopServer:z,restartServer:L,setPreviewUrl:j,detectCommands:h,refresh:c}=tt(s),p=v?.status??"stopped",D=p==="running"||p==="starting",F=xt(t),E=F[p]??F.stopped,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,loadMore:P}=nt(s,!!s),x=b,f=v?.config?.cwd??null,A=a.useRef(null),T=Ct(A),[X,C]=a.useState(!0),[S,o]=a.useState(""),[i,g]=a.useState(""),[u,w]=a.useState(null),[y,U]=a.useState(null),[W,Me]=a.useState(null),Y=a.useMemo(()=>(n??[]).filter(l=>l.column==="in-progress"&&typeof l.worktree=="string"&&l.worktree.length>0),[n]),J=a.useMemo(()=>Y.find(l=>l.id===y)??null,[Y,y]);a.useEffect(()=>{y&&!Y.some(l=>l.id===y)&&U(null)},[Y,y]);const[se,gr]=a.useState("embedded"),[ne,ge]=a.useState(!1),_e=a.useRef(null),we=a.useRef(null),wr=se==="embedded"?x:null,{embedStatus:V,setEmbedStatus:br,resetEmbedStatus:oe,iframeRef:ee,isEmbedded:xr,isBlocked:be,blockReason:xe,retry:Ae}=ct(wr),[Te,G]=a.useState(!1),Oe=a.useRef(V);a.useEffect(()=>{const l=Oe.current!==V;be&&l&&G(!0),V==="embedded"&&G(!1),Oe.current=V},[V,be]),a.useEffect(()=>{G(!1)},[x]);const le=a.useMemo(()=>{if(!u)return null;const l=er(f);return d.find(M=>!(M.scriptName!==u||l&&M.cwd!==l||v?.config?.command&&M.command!==v.config.command))??d.find(M=>rr(M,u,f))??null},[d,v?.config?.command,u,f]);a.useEffect(()=>{typeof h=="function"&&h().catch(l=>{e(Ze(l),"error")})},[e,h]),a.useEffect(()=>{if(u){C(!1);return}C(!0)},[u]),a.useEffect(()=>{if(v?.status==="running"||v?.status==="starting"){v.config?.command?.trim().length>0&&o(v.config.command);return}if(le){o(le.command);return}d.length>0&&o(l=>l.trim().length>0?l:d[0]?.command??"")},[d,le,v?.config?.command,v?.status]),a.useEffect(()=>{g(x??"")},[x]);const ce=a.useCallback(()=>{ge(!1),window.requestAnimationFrame(()=>_e.current?.focus())},[]),yr=$r(ce);a.useEffect(()=>{if(!ne)return;we.current?.focus();const l=M=>{if(M.key==="Escape"){ce();return}if(M.key!=="Tab")return;const ae=Array.from(we.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(ze=>!ze.hasAttribute("disabled")&&ze.getAttribute("aria-hidden")!=="true"),Q=ae[0],Se=ae.at(-1);!Q||!Se||(M.shiftKey&&document.activeElement===Q?(M.preventDefault(),Se.focus()):!M.shiftKey&&document.activeElement===Se&&(M.preventDefault(),Q.focus()))};return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[ce,ne]),a.useEffect(()=>{!T&&ne&&ge(!1)},[T,ne]);const ye=a.useCallback(()=>{x&&window.open(x,"_blank","noopener,noreferrer")},[x]),Fe=a.useCallback(()=>{G(!1),Ae()},[Ae]),Sr=a.useCallback(()=>{try{const l=ee.current;if(l?.contentWindow){l.contentWindow.location.reload(),G(!1),oe();return}}catch{}if(!(!x||!ee.current))try{const l=new URL(x);l.searchParams.set("_t",Date.now().toString()),ee.current.src=l.toString(),G(!1),oe()}catch{ee.current.src=x,G(!1),oe()}},[x,ee,oe]),de=a.useCallback(async(l,M,ae)=>{Me(l);try{await M(),e(ae,"success")}catch(Q){e(Ze(Q),"error")}finally{Me(null)}},[e]),Nr=a.useCallback(l=>{w(l.scriptName),C(!1),o(l.command),e(t("devserver.toast.selectedScript","Selected {{name}} script.",{name:l.scriptName}),"success")},[e]),kr=a.useCallback(()=>{w(null),C(!0),e(t("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Cr=a.useCallback(l=>{D&&l&&l!==y&&e(t("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),U(l)},[e,D,y,t]),jr=()=>{const l=S.trim();if(l.length===0){e(t("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const M=er(f)??".",Q=J?.worktree??null??le?.cwd??M;de("start",()=>N(l,Q),t("devserver.toast.started","Dev server started."))},Lr=()=>{de("stop",z,t("devserver.toast.stopped","Dev server stopped."))},Er=()=>{de("restart",L,t("devserver.toast.restarted","Dev server restarted."))},Rr=()=>{const l=i.trim(),M=l.length>0?l:null;de("preview",()=>j(M),M?t("devserver.toast.previewUpdated","Preview URL updated."):t("devserver.toast.previewCleared","Preview URL override cleared."))},Ur=a.useCallback(()=>{k&&c()},[k,c]),Dr=p==="starting"||p==="running"||W!==null,Pr=p==="stopped"||W!==null,Mr=p==="stopped"||p==="starting"||W!==null,$e=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[t("devserver.auto","Auto"),x?` · ${x}`:t("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>gr(l=>l==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:se==="embedded"?t("devserver.externalOnly","External only"):t("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.openInNewTab","Open in new tab"),onClick:ye,disabled:!x,"data-testid":"devserver-preview-open-tab",children:r.jsx(qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.refreshPreview","Refresh preview"),onClick:Sr,disabled:!x,"data-testid":"devserver-preview-refresh",children:r.jsx(Xr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":V,"data-embedded":xr?"true":"false",children:[!x&&!D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.startDevServer","Start a dev server to see a live preview here.")}),!x&&D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),x&&se==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:t("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ye,"data-testid":"devserver-preview-external-open-tab",children:t("devserver.openInNewTab","Open in new tab")})]}),x&&se==="embedded"&&Te&&be&&r.jsxs("div",{className:V==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[V==="error"?r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:V==="error"?t("devserver.previewFailed","Preview failed"):t("devserver.previewBlocked","Preview blocked")}),xe&&r.jsx("p",{className:"devserver-preview-blocked-context",children:xe})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:t("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:ye,"data-testid":"devserver-preview-fallback-open-tab",children:t("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Fe,"data-testid":"devserver-preview-fallback-retry",children:t("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),x&&se==="embedded"&&!Te&&r.jsx(bt,{url:x,embedStatus:V,onEmbedStatusChange:br,iframeRef:ee,blockReason:xe,onRetry:Fe})]})]});return r.jsxs("div",{ref:A,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":T?"true":"false",children:[r.jsx(zr,{icon:Hr,title:t("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${E.className}`,"data-testid":"dev-server-status-badge",children:E.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:jr,disabled:Dr,"data-testid":"dev-server-start-button",children:[r.jsx(Ir,{size:14}),r.jsx("span",{children:W==="start"?t("devserver.starting","Starting..."):t("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Lr,disabled:Pr,"data-testid":"dev-server-stop-button",children:[r.jsx(Br,{size:14}),r.jsx("span",{children:W==="stop"?t("devserver.stopping","Stopping..."):t("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Er,disabled:Mr,"data-testid":"dev-server-restart-button",children:[r.jsx(Vr,{size:14}),r.jsx("span",{children:W==="restart"?t("devserver.restarting","Restarting..."):t("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":t("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.configuration","Configuration")}),m&&r.jsx("span",{className:"dev-server-muted",children:t("devserver.loading","Loading...")})]}),m&&!v&&d.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:t("devserver.loadingConfig","Loading dev server configuration...")})]}),k&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:k}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ur,children:t("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:t("devserver.scriptSelection","Script Selection")}),u&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:u}),r.jsx("span",{className:"dev-server-candidate-source",children:f??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>C(!0),"data-testid":"dev-server-change-selection",children:t("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:kr,"data-testid":"dev-server-clear-selection",children:t("devserver.clear","Clear")})]}),X&&d.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:t("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),X&&d.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:d.map(l=>{const M=rr(l,u,f);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${M?"dev-server-candidate--selected":""}`,onClick:()=>Nr(l),"data-testid":`dev-server-candidate-${l.scriptName}-${hr(l.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:l.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Lt(l.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:jt(l)})]},`${l.cwd}::${l.scriptName}::${l.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:t("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:t("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:y??"",onChange:l=>Cr(l.target.value.length>0?l.target.value:null),disabled:Y.length===0,"aria-label":t("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:t("devserver.projectRootNoTask","Project root (no task)")}),Y.map(l=>r.jsx("option",{value:l.id,children:l.title?`${l.id} — ${l.title}`:l.id},l.id))]}),Y.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:t("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),J&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:J.title?`${J.id} — ${J.title}`:J.id})}),r.jsx("p",{className:"dev-server-task-description",children:J.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:J.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:t("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:S,onChange:l=>o(l.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:p==="running"||p==="starting"})]}),(p==="running"||p==="starting")&&v&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.runningCommand","Running command")}),r.jsx("code",{children:v.config?.command??S})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:t("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:i,onChange:l=>g(l.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Rr,disabled:W==="preview","data-testid":"dev-server-set-preview",children:t("devserver.save","Save")})]}),x&&r.jsx("p",{className:"dev-server-preview-hint",children:t("devserver.autoDetected","Auto-detected: {{url}}",{url:x})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":t("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:t("devserver.lines","{{count}} lines",{count:H??_.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(gt,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,onLoadMore:P,isRunning:D})})]})}),T?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":t("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:x||t("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:x?t("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):t("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:_e,onClick:()=>ge(!0),"data-testid":"devserver-preview-modal-open",children:t("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":t("devserver.previewLabel","Dev server preview"),children:$e()}),T&&ne&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...yr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:we,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:t("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ce,"aria-label":t("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Wr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:$e()})]})})]})}export{At as DevServerView};
|
|
1
|
+
import{r as a,j as r}from"./vendor-react-SZ_qB27O.js";import{a as $,w as O,cX as tr,bc as sr,cN as ie,L as pe,aH as _r,cY as Ar,cZ as Tr,c_ as Or,C as Fr,aZ as nr,c$ as $r,V as zr,d0 as Hr,c2 as Ir,c4 as Br,d1 as Vr,p as He,X as Wr,aQ as qr,R as Xr}from"./index-D8TQBkB7.js";import{u as fe}from"./vendor-i18n-GF3RlKbq.js";import{S as ar}from"./shield-alert-j_jHfoeI.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const s=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",n=s==="root"?".":s,t=e.name,v=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():n,d=typeof e.confidence=="number"?e.confidence:1,b=s==="root"?"root":s,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:t,packagePath:v,confidence:d,cwd:n,source:s,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${t} (${b})`}}function te(e){const s=e.status,n=s==="starting"||s==="running"||s==="failed"||s==="stopped"?s:"stopped",t=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,v=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:n,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:t,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:t,detectedPort:e.detectedPort,manualPreviewUrl:v,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:v,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function Jr(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Kr(e){const n=(Array.isArray(e.lines)?e.lines:[]).map((t,v)=>Jr(t,v+1));return{lines:n,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:n.length}}function Yr(e,s){const n=typeof s.maxLines=="number"&&Number.isFinite(s.maxLines)?Math.max(1,Math.floor(s.maxLines)):100,t=typeof s.offset=="number"&&Number.isFinite(s.offset)?Math.max(0,Math.floor(s.offset)):0,v=typeof s.lastEventId=="number"&&Number.isFinite(s.lastEventId)?Math.max(0,Math.floor(s.lastEventId)):null,d=e.length,b=e.map((N,z)=>({id:z+1,text:N,stream:"stdout",timestamp:""}));if(v!==null)return{lines:b.filter(N=>N.id>v).slice(0,n),totalLines:d};const m=Math.max(d-t,0),k=Math.max(m-n,0);return{lines:b.slice(k,m),totalLines:d}}function Be(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function ir(e){try{const s=await $(O("/dev-server/candidates",e));return Be(s)}catch(s){if(s instanceof Error&&/\/dev-server\/candidates/.test(s.message)){const n=await $(O("/dev-server/detect",e));return Be(n)}throw s}}function he(e){return $(O("/dev-server/status",e)).then(te)}async function Ne(e={},s){const n=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&n.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&n.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&n.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const t=n.size>0?`?${n.toString()}`:"";try{const v=await $(O(`/dev-server/logs/history${t}`,s));return Kr(v)}catch(v){if(v instanceof Error&&/\/dev-server\/logs\/history/.test(v.message)){const d=await he(s);return Yr(d.logs,e)}throw v}}function or(e,s){const n=e.cwd??e.packagePath??".",t=e.scriptName;return $(O("/dev-server/start",s),{method:"POST",body:JSON.stringify({command:e.command,scriptName:t,scriptId:t,cwd:n,packagePath:e.packagePath})}).then(te)}function lr(e){return $(O("/dev-server/stop",e),{method:"POST"}).then(te)}function cr(e){return $(O("/dev-server/restart",e),{method:"POST"}).then(te)}async function dr(e,s){const n=typeof e=="string"?{url:e}:e;try{const t=await $(O("/dev-server/preview-url",s),{method:"POST",body:JSON.stringify(n)});return te(t)}catch(t){if(t instanceof Error&&/\/dev-server\/preview-url/.test(t.message)){const v=await $(O("/dev-server/preview-url",s),{method:"PUT",body:JSON.stringify(n)});return te(v)}throw t}}function Re(e){return tr(O("/dev-server/logs/stream",e))}async function Ue(e){try{return(await $(O("/devserver",e))).sessions??[]}catch{try{const s=await he(e);return[{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function vr(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}`,s))}catch{try{const n=await he(s);return!e||e==="default"||e===n.id?{config:{id:n.id??"default",name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Ve(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/start`,s),{method:"POST"})}catch{const n=await or({command:""},s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function We(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/stop`,s),{method:"POST"})}catch{const n=await lr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function qe(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/restart`,s),{method:"POST"})}catch{const n=await cr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,s,n){try{const t=await $(O(`/devserver/${encodeURIComponent(e)}/preview`,n),{method:"POST",body:JSON.stringify({url:s})});return{url:t.url??null,source:t.source??null}}catch{const t=await dr({url:s},n);return{url:t.previewUrl??t.manualUrl??null,source:"manual"}}}async function ke(e){try{return(await $(O("/devserver/detect",e))).candidates??[]}catch{try{return(await ir(e)).map(n=>({name:n.name,command:n.command,cwd:n.cwd,scriptName:n.scriptName,packagePath:n.packagePath}))}catch{return[]}}}function Gr(e,s){return tr(O(`/devserver/${encodeURIComponent(e)}/logs/stream`,s))}const De=500,Qr=3e3;function q(e){return e instanceof Error?e.message:String(e)}function ur(e){return e.length<=De?e:e.slice(-De)}function Ce(e,s){return ur([...e,s])}function re(e){try{return JSON.parse(e)}catch{return null}}function ve(e){const s=e.text??"";return e.stream==="stderr"?`[stderr] ${s}`:s}function Zr(e){return e?.previewUrl??null}async function Je(e){return he(e)}async function Ke(e,s){return or(e,s)}async function et(e){return lr(e)}async function rt(e){return cr(e)}async function Ye(e){return ir(e)}function K(e){try{return e()}catch{return null}}function je(){return typeof K(()=>Ue)=="function"&&typeof K(()=>vr)=="function"}function Z(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(s=>({timestamp:new Date().toISOString(),stream:s.startsWith("[stderr]")?"stderr":"stdout",text:s.replace(/^\[stderr\]\s*/,"")}))}}function tt(e){const{t:s}=fe("app"),[n,t]=a.useState(null),[v,d]=a.useState([]),[b,m]=a.useState([]),[k,N]=a.useState([]),[z,E]=a.useState(!0),[j,h]=a.useState(null),c=a.useRef(0),[p,D]=a.useState(null),F=a.useCallback(o=>{if(t(o),o?.logHistory){const i=o.logHistory.slice(-De).map(ve);m(i)}},[]),L=a.useCallback(async()=>{const o=c.current;try{if(je())if(p){const i=await vr(p,e);if(c.current!==o)return;F(i)}else{const i=await Ue(e);if(c.current!==o)return;d(i),i.length>0&&(D(i[0].config.id),F(i[0]))}else{const i=await Je(e);if(c.current!==o)return;const g=Z(i);d([g]),F(g)}h(null)}catch(i){if(c.current!==o)return;h(q(i))}},[F,e,p]);a.useEffect(()=>{c.current+=1;const o=c.current;t(null),d([]),m([]),N([]),E(!0),h(null),D(null),(async()=>{try{const[g,u]=await Promise.allSettled([je()?Ue(e):Je(e).then(y=>[Z(y)]),typeof K(()=>ke)=="function"?ke(e):Ye(e).then(y=>y.map(U=>({name:U.name,command:U.command,cwd:U.cwd,scriptName:U.scriptName,packagePath:U.packagePath})))]);if(c.current!==o)return;let w=null;if(g.status==="fulfilled"){const y=g.value;if(d(y),y.length>0){const U=y[0];je()&&D(U.config.id),F(U)}}else w=q(g.reason);u.status==="fulfilled"&&N(u.value),w&&h(w)}catch(g){if(c.current!==o)return;h(q(g))}finally{c.current===o&&E(!1)}})()},[F,e]),a.useEffect(()=>{const o=p?Gr(p,e):typeof K(()=>Re)=="function"?Re(e):null;if(!o)return;const i=c.current,g=sr(o,{events:{history:u=>{if(c.current!==i)return;const w=re(u.data);if(w?.lines){const y=w.lines.map(ve);m(ur(y))}},log:u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:log":u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:output":u=>{if(c.current!==i)return;const w=re(u.data);w?.line&&m(y=>Ce(y,w.line))},status:u=>{if(c.current!==i)return;const w=re(u.data),y=w?.status;y&&t(U=>U&&{...U,status:y,runtime:w.pid?{...U.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:U.runtime})},"dev-server:status":u=>{if(c.current!==i)return;const w=re(u.data);if(w?.status){const y=Z(w);t(y),d([y])}},stopped:()=>{c.current},failed:()=>{c.current}},onReconnect:()=>{c.current===i&&L()},onError:()=>{c.current===i&&h(u=>u??s("devserver.lostConnection","Lost log stream connection."))}});return()=>{g()}},[e,L,p]),a.useEffect(()=>{if(n?.status!=="running"&&n?.status!=="starting")return;const o=setInterval(()=>{L()},Qr);return()=>{clearInterval(o)}},[L,n?.status]);const _=a.useCallback(async(o,i)=>{c.current+=1;const g=c.current;try{let u;const w=typeof i=="string"&&i.length>0,y=n?.config?.cwd??".";if(!(w&&i!==y)&&p&&typeof K(()=>Ve)=="function")u=await Ve(p,e);else{const W=await Ke({command:o,cwd:i},e);u=Z(W)}if(c.current!==g)return;t(u),h(null)}catch(u){if(c.current!==g)return;throw h(q(u)),u}},[e,n?.config?.cwd,p]),R=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>We)=="function")i=await We(p,e);else{const g=await et(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),I=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>qe)=="function")i=await qe(p,e);else{const g=await rt(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),B=a.useCallback(async o=>{c.current+=1;const i=c.current;try{let g;if(p&&typeof K(()=>Xe)=="function")g=await Xe(p,o,e);else{const u=await dr({url:o},e);g={url:u.manualUrl??u.previewUrl??u.detectedUrl??null,source:u.manualUrl?"manual":"auto"}}if(c.current!==i)return;t(u=>u?{...u,previewUrl:g.url??void 0}:null),h(null)}catch(g){if(c.current!==i)return;throw h(q(g)),g}},[e,p]),H=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;try{i=await ke(e)}catch{i=(await Ye(e)).map(u=>({name:u.name,command:u.command,cwd:u.cwd,scriptName:u.scriptName,packagePath:u.packagePath}))}if(c.current!==o)return;N(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e]),P=a.useCallback(async(o,i)=>{if(typeof o!="string"&&!p)try{const w=o,y=await Ke({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),U=Z(y);t(U),d([U]),h(null);return}catch(w){throw h(q(w)),w}const g=typeof o=="string"?o:o.command,u=typeof o=="string"?i:o.cwd;await _(g,u)},[e,_,p]),x=a.useCallback(async()=>{await R()},[R]),f=a.useCallback(async()=>{await I()},[I]),A=a.useCallback(async o=>{await B(o)},[B]),T=a.useCallback(async()=>{await H()},[H]),X=a.useCallback(async()=>{await L()},[L]),C=Zr(n),S=n?{...n,pid:n.runtime?.pid}:null;return{session:n,sessions:v,logs:b,detectedCommands:k,previewUrl:C,isLoading:z,error:j,startServer:_,stopServer:R,restartServer:I,setPreviewUrl:B,detectCommands:H,refresh:L,candidates:k,serverState:S,loading:z,start:P,stop:x,restart:f,setManualUrl:A,detect:T,refreshStatus:X}}const Ge=500,Qe=100;function mr(e){return e.length>Ge?e.slice(-Ge):e}function pr(e){return e==="stderr"?"stderr":"stdout"}function ue(e){try{return JSON.parse(e.data)}catch{return null}}function me(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:"",stream:pr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function st(e,s){return{id:s,text:e,stream:"stdout",timestamp:""}}function Ee(e,s){if(s.length===0)return e;const n=[...e],t=new Set(e.map(v=>v.id));for(const v of s)t.has(v.id)||(t.add(v.id),n.push(v));return n.sort((v,d)=>v.id-d.id),mr(n)}function nt(e,s){const[n,t]=a.useState([]),[v,d]=a.useState(!1),[b,m]=a.useState(!1),[k,N]=a.useState(!1),[z,E]=a.useState(null),j=a.useRef(null),h=a.useRef(!1),c=a.useRef(0),p=a.useRef(0),D=a.useRef(e),F=a.useRef(s),L=a.useRef(0),_=a.useRef(1);(D.current!==e||F.current!==s)&&(D.current=e,F.current=s,c.current++,ie({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,L.current=0,_.current=1,t([]),d(!1),m(!1),N(!1),E(null),j.current&&(j.current(),j.current=null)),a.useEffect(()=>{if(!s){j.current&&(j.current(),j.current=null);return}const P=c.current,x=++p.current;h.current=!1,d(!0);const f=(C,S)=>{const o=mr(C);t(o),E(S),N(S!==null?S>o.length:!1);const i=o.length>0?o[o.length-1].id:0;L.current=i,_.current=i+1},A=C=>{if(h.current||c.current!==P||!C||typeof C!="object")return;const S=C.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const i=S.filter(g=>typeof g=="string").map((g,u)=>st(g,u+1));f(i,i.length);return}const o=S.filter(i=>!!i&&typeof i=="object").map((i,g)=>me(i,g+1));f(o,o.length)},T=C=>{if(h.current||c.current!==P)return;const S=typeof C.text=="string"?C.text:typeof C.line=="string"?C.line:null;if(!S)return;const o=_.current,i=typeof C.id=="number"&&Number.isFinite(C.id)?C.id:o,g={id:i,text:S,stream:pr(C.stream),timestamp:typeof C.timestamp=="string"?C.timestamp:""};L.current=Math.max(L.current,i),_.current=Math.max(_.current,i+1),t(u=>Ee(u,[g])),E(u=>u===null?u:Math.max(u+1,g.id))};async function X(){try{const S=await Ne({maxLines:Qe},e);if(h.current||c.current!==P||p.current!==x)return;const o=S.lines.map((i,g)=>me(i,g+1));f(o,S.totalLines)}catch{if(h.current||c.current!==P||p.current!==x)return;f([],null)}finally{!h.current&&c.current===P&&p.current===x&&d(!1)}const C=Re(e);j.current=sr(C,{events:{"dev-server:log":S=>{const o=ue(S);o&&T(o)},log:S=>{const o=ue(S);o&&T(o)},history:S=>{const o=ue(S);A(o)},"dev-server:history":S=>{const o=ue(S);A(o)}},onReconnect:()=>{ie({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:L.current??null,sseChannel:C,reason:"history-replay"}),!(h.current||c.current!==P)&&Ne({lastEventId:L.current,maxLines:50},e).then(S=>{if(h.current||c.current!==P)return;const o=S.lines.map((i,g)=>me(i,_.current+g));if(o.length>0){const i=o[o.length-1].id;L.current=Math.max(L.current,i),_.current=Math.max(_.current,i+1)}t(i=>Ee(i,o)),E(S.totalLines)}).catch(()=>{})}}),ie({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:C})}return X(),()=>{h.current=!0,j.current&&(j.current(),j.current=null)}},[s,e]);const I=a.useCallback(async()=>{if(!s||b)return;const P=c.current,x=n.length;m(!0);try{const f=await Ne({maxLines:Qe,offset:x},e);if(h.current||c.current!==P)return;const A=f.lines.map((T,X)=>me(T,X+1));t(T=>Ee(A,T)),N(f.totalLines>x+A.length),E(f.totalLines)}catch{}finally{m(!1)}},[s,n.length,b,e]),B=a.useCallback(()=>{t([])},[]),H=j.current!==null&&!v&&!h.current;return{entries:n,loading:v,loadingMore:b,hasMore:k,total:z,loadMore:I,clear:B,logs:n,isStreaming:H,clearLogs:B}}const at="This preview appears to block iframe embedding. Open it in a new tab instead.",it="The preview URL could not be loaded. Verify the server is running and the URL is correct.",ot="Preview is taking longer than expected and may block iframe embedding.";function lt(e){return e==="blocked"?at:e==="error"?it:null}function ct(e,s={}){const{loadTimeoutMs:n=1e4,detectionMethod:t=null}=s,v=a.useRef(null),d=a.useRef(null),[b,m]=a.useState("unknown"),[k,N]=a.useState(null),[z]=a.useState(t),E=a.useCallback(()=>{d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),j=a.useCallback(R=>{m(R),N(lt(R))},[]),h=a.useCallback(()=>{m("blocked"),N(ot)},[]);a.useEffect(()=>{if(E(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let R=!1;return queueMicrotask(()=>{R||(m("loading"),N(null))}),()=>{R=!0,E()}},[E,e]),a.useEffect(()=>{if(b!=="loading"){E();return}const R=setTimeout(()=>{d.current=null,h()},n);return d.current=R,()=>{clearTimeout(R),d.current===R&&(d.current=null)}},[E,b,n,h]);const c=a.useCallback(()=>{const R=v.current;if(!R){j("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){j("blocked");return}}catch{}j("embedded")},[j]),p=a.useCallback(()=>{j("error")},[j]);a.useEffect(()=>{if(E(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[E]);const D=a.useCallback(()=>{E(),m("unknown"),N(null)},[E]),F=D,L=a.useMemo(()=>b==="embedded",[b]),_=a.useMemo(()=>b==="blocked"||b==="error",[b]);return{embedStatus:b,isEmbedded:L,isBlocked:_,blockReason:k,detectionMethod:z,iframeRef:v,resetEmbedStatus:D,setEmbedStatus:j,retry:F,embedContext:k,handleIframeLoad:c,handleIframeError:p}}const dt=/\x1b\[[0-9;]*m/g,vt=50;function ut(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=vt}function Pe(e){return e.replace(dt,"")}function mt(e){if(!e)return"";const s=new Date(e);return Number.isNaN(s.getTime())?"":s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function pt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ft(e){if(e.stream==="stderr")return"error";const s=Pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(s)?"warn":/\b(error|fatal)\b/.test(s)?"error":"info"}function ht(e,s){if(!s)return e;const n=new RegExp(`(${pt(s)})`,"ig"),t=e.split(n),v=s.toLowerCase();return r.jsx(r.Fragment,{children:t.map((d,b)=>d.toLowerCase()===v?r.jsx("mark",{children:d},`${d}-${b}`):r.jsx("span",{children:d},`${d}-${b}`))})}function gt({entries:e,loading:s,loadingMore:n,hasMore:t,total:v,onLoadMore:d,isRunning:b}){const{t:m}=fe("app"),k=a.useRef(null),N=a.useRef(e.length),z=a.useRef(b),[E,j]=a.useState(!1),[h,c]=a.useState(!1),p=a.useRef(!1),[D,F]=a.useState(""),[L,_]=a.useState("all"),R=a.useMemo(()=>L==="all"?e:e.filter(f=>ft(f)===L),[e,L]),I=a.useMemo(()=>{const f=D.trim().toLowerCase();return f?R.filter(A=>Pe(A.text).toLowerCase().includes(f)):R},[R,D]),B=I.length,H=a.useCallback(f=>{p.current=f,c(f)},[]),P=a.useCallback(()=>{const f=k.current;f&&(f.scrollTop=f.scrollHeight,H(!1))},[H]);a.useEffect(()=>{const f=z.current,A=N.current,T=e.length>A;b&&(!f||!h&&T)&&P(),z.current=b,N.current=e.length},[e.length,b,h,P]);const x=a.useCallback(()=>{const f=k.current;f&&H(!ut(f))},[H]);return a.useEffect(()=>{s||e.length===0||!h&&b&&P()},[e,b,h,s,P]),a.useEffect(()=>{const f=k.current;if(!f||!b||typeof MutationObserver>"u")return;const A=new MutationObserver(()=>{p.current||P()});return A.observe(f,{childList:!0,characterData:!0,subtree:!0}),()=>A.disconnect()},[b,P]),s&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(pe,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${E?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:m("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[v!==null?`${e.length}/${v}`:`${e.length}`," ",m("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:L,onChange:f=>_(f.target.value),"data-testid":"devserver-log-severity-filter","aria-label":m("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:m("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:m("devserver.info","Info")}),r.jsx("option",{value:"warn",children:m("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:m("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.searchLogs","Search logs")}),r.jsx(_r,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:D,onChange:f=>F(f.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),D.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>j(f=>!f),"data-testid":"devserver-log-fullscreen-toggle","aria-label":E?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:E?r.jsx(Ar,{size:14}):r.jsx(Tr,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[t&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:d,disabled:n,"data-testid":"devserver-log-load-more-button",children:n?r.jsxs(r.Fragment,{children:[r.jsx(pe,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:x,"data-testid":"devserver-log-content",children:[!s&&I.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?m("devserver.noLogsYet","No logs yet. Start the dev server to see output."):R.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),I.map(f=>{const A=Pe(f.text),T=mt(f.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[T&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:T}),f.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:m("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Or(ht(A,D.trim()))})]},f.id)})]}),h&&b&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx(Fr,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const wt="devserver-preview-iframe";function bt({url:e,embedStatus:s,onEmbedStatusChange:n,iframeRef:t,blockReason:v,onRetry:d,className:b=wt,embedContext:m}){const{t:k}=fe("app"),N=v??m??null,[z,E]=a.useState(0);a.useEffect(()=>{!e||s!=="unknown"||(E(p=>p+1),n("loading"))},[s,n,e]);const j=a.useCallback(()=>{const p=t.current;if(!p){n("embedded");return}try{if(p.contentWindow?.location?.href==="about:blank"&&p.src!=="about:blank"){n("blocked");return}}catch{}n("embedded")},[t,n]),h=a.useCallback(p=>{p.stopPropagation(),n("error")},[n]),c=a.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:t,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:b,title:"Dev server preview",onLoad:j,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),s==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:k("preview.loading","Loading preview...")})]}),s==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.blockedTitle","Preview cannot be embedded")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]}),s==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.errorTitle","Unable to load preview")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]})]}):null}function xt(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}const yt=480;function St(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function fr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const s=e.parentElement;return s?.classList.contains("right-dock__body")?s:null}function Nt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function kt(e){if(!e||St())return!1;const s=fr(e);return s?Nt(s)<=yt:!1}function Ct(e){const[s,n]=a.useState(!1);return a.useEffect(()=>{const t=e.current;if(!t){n(!1);return}const v=fr(t),d=()=>n(kt(t));if(d(),!v||typeof ResizeObserver>"u")return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d);const b=new ResizeObserver(d);return b.observe(v),window.addEventListener("resize",d),()=>{b.disconnect(),window.removeEventListener("resize",d)}},[e]),s}let Le=!1;function Ze(e){return e instanceof Error?e.message:String(e)}function hr(e){return e==="."?"root":e}function er(e){return e?e==="root"?".":e:null}function rr(e,s,n){return!s||e.scriptName!==s?!1:n?hr(e.cwd)===n:!0}function jt(e){return e.cwd==="."?"root":e.cwd}function Et(e){return e.length<=60?e:`${e.slice(0,60)}…`}function At({addToast:e,projectId:s,tasks:n}){const{t}=fe("app");a.useEffect(()=>(ie({view:"DevServerView",trigger:Le?"route-active":"remount",projectId:s,replayAttempted:!1}),Le=!1,()=>{Le=!0,ie({view:"DevServerView",trigger:"route-inactive",projectId:s,replayAttempted:!1})}),[s]);const{session:v,detectedCommands:d,previewUrl:b,isLoading:m,error:k,startServer:N,stopServer:z,restartServer:E,setPreviewUrl:j,detectCommands:h,refresh:c}=tt(s),p=v?.status??"stopped",D=p==="running"||p==="starting",F=xt(t),L=F[p]??F.stopped,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,loadMore:P}=nt(s,!!s),x=b,f=v?.config?.cwd??null,A=a.useRef(null),T=Ct(A),[X,C]=a.useState(!0),[S,o]=a.useState(""),[i,g]=a.useState(""),[u,w]=a.useState(null),[y,U]=a.useState(null),[W,Me]=a.useState(null),Y=a.useMemo(()=>(n??[]).filter(l=>l.column==="in-progress"&&typeof l.worktree=="string"&&l.worktree.length>0),[n]),J=a.useMemo(()=>Y.find(l=>l.id===y)??null,[Y,y]);a.useEffect(()=>{y&&!Y.some(l=>l.id===y)&&U(null)},[Y,y]);const[se,gr]=a.useState("embedded"),[ne,ge]=a.useState(!1),_e=a.useRef(null),we=a.useRef(null),wr=se==="embedded"?x:null,{embedStatus:V,setEmbedStatus:br,resetEmbedStatus:oe,iframeRef:ee,isEmbedded:xr,isBlocked:be,blockReason:xe,retry:Ae}=ct(wr),[Te,G]=a.useState(!1),Oe=a.useRef(V);a.useEffect(()=>{const l=Oe.current!==V;be&&l&&G(!0),V==="embedded"&&G(!1),Oe.current=V},[V,be]),a.useEffect(()=>{G(!1)},[x]);const le=a.useMemo(()=>{if(!u)return null;const l=er(f);return d.find(M=>!(M.scriptName!==u||l&&M.cwd!==l||v?.config?.command&&M.command!==v.config.command))??d.find(M=>rr(M,u,f))??null},[d,v?.config?.command,u,f]);a.useEffect(()=>{typeof h=="function"&&h().catch(l=>{e(Ze(l),"error")})},[e,h]),a.useEffect(()=>{if(u){C(!1);return}C(!0)},[u]),a.useEffect(()=>{if(v?.status==="running"||v?.status==="starting"){v.config?.command?.trim().length>0&&o(v.config.command);return}if(le){o(le.command);return}d.length>0&&o(l=>l.trim().length>0?l:d[0]?.command??"")},[d,le,v?.config?.command,v?.status]),a.useEffect(()=>{g(x??"")},[x]);const ce=a.useCallback(()=>{ge(!1),window.requestAnimationFrame(()=>_e.current?.focus())},[]),yr=$r(ce);a.useEffect(()=>{if(!ne)return;we.current?.focus();const l=M=>{if(M.key==="Escape"){ce();return}if(M.key!=="Tab")return;const ae=Array.from(we.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(ze=>!ze.hasAttribute("disabled")&&ze.getAttribute("aria-hidden")!=="true"),Q=ae[0],Se=ae.at(-1);!Q||!Se||(M.shiftKey&&document.activeElement===Q?(M.preventDefault(),Se.focus()):!M.shiftKey&&document.activeElement===Se&&(M.preventDefault(),Q.focus()))};return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[ce,ne]),a.useEffect(()=>{!T&&ne&&ge(!1)},[T,ne]);const ye=a.useCallback(()=>{x&&window.open(x,"_blank","noopener,noreferrer")},[x]),Fe=a.useCallback(()=>{G(!1),Ae()},[Ae]),Sr=a.useCallback(()=>{try{const l=ee.current;if(l?.contentWindow){l.contentWindow.location.reload(),G(!1),oe();return}}catch{}if(!(!x||!ee.current))try{const l=new URL(x);l.searchParams.set("_t",Date.now().toString()),ee.current.src=l.toString(),G(!1),oe()}catch{ee.current.src=x,G(!1),oe()}},[x,ee,oe]),de=a.useCallback(async(l,M,ae)=>{Me(l);try{await M(),e(ae,"success")}catch(Q){e(Ze(Q),"error")}finally{Me(null)}},[e]),Nr=a.useCallback(l=>{w(l.scriptName),C(!1),o(l.command),e(t("devserver.toast.selectedScript","Selected {{name}} script.",{name:l.scriptName}),"success")},[e]),kr=a.useCallback(()=>{w(null),C(!0),e(t("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Cr=a.useCallback(l=>{D&&l&&l!==y&&e(t("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),U(l)},[e,D,y,t]),jr=()=>{const l=S.trim();if(l.length===0){e(t("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const M=er(f)??".",Q=J?.worktree??null??le?.cwd??M;de("start",()=>N(l,Q),t("devserver.toast.started","Dev server started."))},Er=()=>{de("stop",z,t("devserver.toast.stopped","Dev server stopped."))},Lr=()=>{de("restart",E,t("devserver.toast.restarted","Dev server restarted."))},Rr=()=>{const l=i.trim(),M=l.length>0?l:null;de("preview",()=>j(M),M?t("devserver.toast.previewUpdated","Preview URL updated."):t("devserver.toast.previewCleared","Preview URL override cleared."))},Ur=a.useCallback(()=>{k&&c()},[k,c]),Dr=p==="starting"||p==="running"||W!==null,Pr=p==="stopped"||W!==null,Mr=p==="stopped"||p==="starting"||W!==null,$e=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[t("devserver.auto","Auto"),x?` · ${x}`:t("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>gr(l=>l==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:se==="embedded"?t("devserver.externalOnly","External only"):t("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.openInNewTab","Open in new tab"),onClick:ye,disabled:!x,"data-testid":"devserver-preview-open-tab",children:r.jsx(qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.refreshPreview","Refresh preview"),onClick:Sr,disabled:!x,"data-testid":"devserver-preview-refresh",children:r.jsx(Xr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":V,"data-embedded":xr?"true":"false",children:[!x&&!D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.startDevServer","Start a dev server to see a live preview here.")}),!x&&D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),x&&se==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:t("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ye,"data-testid":"devserver-preview-external-open-tab",children:t("devserver.openInNewTab","Open in new tab")})]}),x&&se==="embedded"&&Te&&be&&r.jsxs("div",{className:V==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[V==="error"?r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:V==="error"?t("devserver.previewFailed","Preview failed"):t("devserver.previewBlocked","Preview blocked")}),xe&&r.jsx("p",{className:"devserver-preview-blocked-context",children:xe})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:t("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:ye,"data-testid":"devserver-preview-fallback-open-tab",children:t("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Fe,"data-testid":"devserver-preview-fallback-retry",children:t("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),x&&se==="embedded"&&!Te&&r.jsx(bt,{url:x,embedStatus:V,onEmbedStatusChange:br,iframeRef:ee,blockReason:xe,onRetry:Fe})]})]});return r.jsxs("div",{ref:A,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":T?"true":"false",children:[r.jsx(zr,{icon:Hr,title:t("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${L.className}`,"data-testid":"dev-server-status-badge",children:L.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:jr,disabled:Dr,"data-testid":"dev-server-start-button",children:[r.jsx(Ir,{size:14}),r.jsx("span",{children:W==="start"?t("devserver.starting","Starting..."):t("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Er,disabled:Pr,"data-testid":"dev-server-stop-button",children:[r.jsx(Br,{size:14}),r.jsx("span",{children:W==="stop"?t("devserver.stopping","Stopping..."):t("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Lr,disabled:Mr,"data-testid":"dev-server-restart-button",children:[r.jsx(Vr,{size:14}),r.jsx("span",{children:W==="restart"?t("devserver.restarting","Restarting..."):t("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":t("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.configuration","Configuration")}),m&&r.jsx("span",{className:"dev-server-muted",children:t("devserver.loading","Loading...")})]}),m&&!v&&d.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:t("devserver.loadingConfig","Loading dev server configuration...")})]}),k&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:k}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ur,children:t("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:t("devserver.scriptSelection","Script Selection")}),u&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:u}),r.jsx("span",{className:"dev-server-candidate-source",children:f??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>C(!0),"data-testid":"dev-server-change-selection",children:t("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:kr,"data-testid":"dev-server-clear-selection",children:t("devserver.clear","Clear")})]}),X&&d.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:t("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),X&&d.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:d.map(l=>{const M=rr(l,u,f);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${M?"dev-server-candidate--selected":""}`,onClick:()=>Nr(l),"data-testid":`dev-server-candidate-${l.scriptName}-${hr(l.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:l.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Et(l.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:jt(l)})]},`${l.cwd}::${l.scriptName}::${l.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:t("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:t("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:y??"",onChange:l=>Cr(l.target.value.length>0?l.target.value:null),disabled:Y.length===0,"aria-label":t("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:t("devserver.projectRootNoTask","Project root (no task)")}),Y.map(l=>r.jsx("option",{value:l.id,children:l.title?`${l.id} — ${l.title}`:l.id},l.id))]}),Y.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:t("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),J&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:J.title?`${J.id} — ${J.title}`:J.id})}),r.jsx("p",{className:"dev-server-task-description",children:J.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:J.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:t("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:S,onChange:l=>o(l.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:p==="running"||p==="starting"})]}),(p==="running"||p==="starting")&&v&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.runningCommand","Running command")}),r.jsx("code",{children:v.config?.command??S})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:t("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:i,onChange:l=>g(l.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Rr,disabled:W==="preview","data-testid":"dev-server-set-preview",children:t("devserver.save","Save")})]}),x&&r.jsx("p",{className:"dev-server-preview-hint",children:t("devserver.autoDetected","Auto-detected: {{url}}",{url:x})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":t("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:t("devserver.lines","{{count}} lines",{count:H??_.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(gt,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,onLoadMore:P,isRunning:D})})]})}),T?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":t("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:x||t("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:x?t("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):t("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:_e,onClick:()=>ge(!0),"data-testid":"devserver-preview-modal-open",children:t("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":t("devserver.previewLabel","Dev server preview"),children:$e()}),T&&ne&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...yr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:we,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:t("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ce,"aria-label":t("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Wr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:$e()})]})})]})}export{At as DevServerView};
|