@runfusion/fusion 0.58.0 → 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/dist/bin.js +16034 -13546
- package/dist/client/.vite/manifest.json +251 -248
- package/dist/client/assets/AgentDetailView-BBjuuYbU.js +18 -0
- package/dist/client/assets/{AgentPermissionPolicyEditor-3x5cc2cp.js → AgentPermissionPolicyEditor-DOdy1ln0.js} +1 -1
- package/dist/client/assets/{AgentsView-B77vHi_7.js → AgentsView-DlyT08sc.js} +4 -4
- package/dist/client/assets/ChatView-CJBnc6rJ.js +6 -0
- package/dist/client/assets/CommandCenter-BhRLZmOH.js +99 -0
- package/dist/client/assets/CommandCenter-DSrIaOro.css +1 -0
- package/dist/client/assets/{DevServerView-BXmkO05R.js → DevServerView-DRpi8Xqz.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-CZ3EXSE5.js → DirectoryPicker-Bw_A-64N.js} +1 -1
- package/dist/client/assets/{DocumentsView-BSWFgTsC.css → DocumentsView-BSC7wh2B.css} +1 -1
- package/dist/client/assets/{DocumentsView-GlAyW64J.js → DocumentsView-w0eDbpbG.js} +2 -2
- package/dist/client/assets/{EvalsView-BLmcsNNf.js → EvalsView-DxQALLwD.js} +1 -1
- package/dist/client/assets/ExperimentalAgentOnboardingModal-BuEWZrjl.js +1 -0
- package/dist/client/assets/{GoalsView-BRfZ4qGe.js → GoalsView-C3MGEtSt.js} +1 -1
- package/dist/client/assets/InsightsView-C0-BkE8_.js +11 -0
- package/dist/client/assets/{MemoryView-ChkuBpUf.js → MemoryView-Dd8uiLHH.js} +2 -2
- package/dist/client/assets/{PiExtensionsManager-DXwQdB7b.js → PiExtensionsManager-DlsEVOjG.js} +1 -1
- package/dist/client/assets/{PluginManager-B8zAjhqf.js → PluginManager-Cf9AOCcC.js} +1 -1
- package/dist/client/assets/{PullRequestView-DL1E1ixh.js → PullRequestView-hm77QtHV.js} +2 -2
- package/dist/client/assets/{ResearchView-BCYCHiyQ.js → ResearchView-BMQEnYH6.js} +1 -1
- package/dist/client/assets/SecretsView-Dc3sWf40.js +1 -0
- package/dist/client/assets/{SessionTerminal-BvK8A98c.css → SessionTerminal-CDTiqrd7.css} +1 -1
- package/dist/client/assets/SessionTerminal-CEv1G-9-.js +2 -0
- package/dist/client/assets/SettingsModal-DFrTDsBm.js +21 -0
- package/dist/client/assets/{SettingsModal-U7ma-5OU.js → SettingsModal-TuphE_CP.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-BCDoA33s.js → SetupWizardModal-CNGogJJp.js} +2 -2
- package/dist/client/assets/{ShadcnColorPicker-EVU2cXpo.js → ShadcnColorPicker-1Z7JIWTE.js} +2 -2
- package/dist/client/assets/{SkillsView-V48VsthB.js → SkillsView-CjPvmnz6.js} +1 -1
- package/dist/client/assets/TodoView-CUD4xw3T.css +1 -0
- package/dist/client/assets/TodoView-DmJPSWOu.js +6 -0
- package/dist/client/assets/WorkflowNodeEditor-BqO2yRXe.js +8 -0
- package/dist/client/assets/{agentSkills-B-QDeW2q.js → agentSkills-BNahUMFe.js} +1 -1
- package/dist/client/assets/app-BzgEwAOr.js +13 -0
- package/dist/client/assets/{app-RIK4I745.js → app-C7eDKtXM.js} +3 -3
- package/dist/client/assets/{app-SHNioZxk.js → app-CL1Ik1qS.js} +3 -3
- package/dist/client/assets/{app-De_pkbYi.js → app-Ckb9wA3K.js} +3 -3
- package/dist/client/assets/{app-cZgmPvs6.js → app-Den3D7oy.js} +3 -3
- package/dist/client/assets/{app--U62_ZWS.js → app-nAsTBQMW.js} +3 -3
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-DvR35aCH.js → architectureDiagram-3BPJPVTR-Bb_ZGdtz.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-ciQdpSqc.js → blockDiagram-GPEHLZMM-CWfWJnIM.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CV0Z6UEL.js → c4Diagram-AAUBKEIU-Dufe_2hy.js} +1 -1
- package/dist/client/assets/channel-BYHFEnHT.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CkAQRX3g.js → chunk-2J33WTMH-BdKWX3Y7.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-CJXvYVcN.js → chunk-4BX2VUAB-CQ9_zgu6.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-DOv0lN1u.js → chunk-55IACEB6-DEFTCISD.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-tRsHXz7i.js → chunk-727SXJPM-8RnJp1fx.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CfzOMXn9.js → chunk-AQP2D5EJ-DJg6awe1.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BKvUZ2cn.js → chunk-FMBD7UC4-Bw-OImRT.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-FqiVnW7u.js → chunk-ND2GUHAM-BSx9p0RO.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BAJDyCpZ.js → chunk-QZHKN3VN-Dbdv72P6.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BLstvJ1W.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BLstvJ1W.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DYizdcNp.js → cose-bilkent-S5V4N54A-CXtcC6U2.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BDWwvXJx.js → dagre-BM42HDAG-BO0r4g14.js} +1 -1
- package/dist/client/assets/{dashboard-view-DmfIFCV-.js → dashboard-view-BTnVGch5.js} +1 -1
- package/dist/client/assets/{dashboard-view-BYn_jRw9.js → dashboard-view-CoDeYJbQ.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-C8ic2E9q.js → diagram-2AECGRRQ-CLmeU2g6.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-H5IDcv9E.js → diagram-5GNKFQAL-CKyM23Jy.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DkczJXd6.js → diagram-KO2AKTUF-ByeVRDs_.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-P1vh7RIU.js → diagram-LMA3HP47-r8qKTJDn.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-CgeybA5t.js → diagram-OG6HWLK6-D2ugPdm7.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-DSJa4zRQ.js → erDiagram-TEJ5UH35-dLzbDn0G.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-DG91ZWS9.js → flowDiagram-I6XJVG4X-et7EENd6.js} +1 -1
- package/dist/client/assets/{folder-open-iGyAYoN-.js → folder-open-BVtcjVIK.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-dkOQjOK8.js → ganttDiagram-6RSMTGT7-DmiabChP.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-GqrJtmDT.js → gitGraphDiagram-PVQCEYII-I1vbhqer.js} +1 -1
- package/dist/client/assets/index-C2HFa2A-.css +1 -0
- package/dist/client/assets/index-inWk2g6R.js +2540 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BfFhhqbU.js → infoDiagram-5YYISTIA-xd6L9Gq3.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DBBV-PIS.js → ishikawaDiagram-YF4QCWOH-fUeEYBvD.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-xZisXOgZ.js → journeyDiagram-JHISSGLW-B7xjU8Oh.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-CbOJloOw.js → kanban-definition-UN3LZRKU-CJ8oRjFI.js} +1 -1
- package/dist/client/assets/{mermaid.core-DKBiVV3q.js → mermaid.core-2udKsaH3.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-Bf9V63ac.js → mindmap-definition-RKZ34NQL-CVywzN7Q.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-0ukMaTVl.js → pieDiagram-4H26LBE5-8vzzC4Mg.js} +1 -1
- package/dist/client/assets/{puzzle-BvEf9PLH.js → puzzle-D60d3Nv1.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CwXZAtYI.js → quadrantDiagram-W4KKPZXB-Cxyb4Mom.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DVsu9t-w.js → requirementDiagram-4Y6WPE33-Bs5RaG7r.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DOJUnv7J.js → sankeyDiagram-5OEKKPKP-Jf7Zq43D.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B67g0g9m.js → sequenceDiagram-3UESZ5HK-CG0I780H.js} +1 -1
- package/dist/client/assets/{shield-alert-4FPCIFZ2.js → shield-alert-B7JyuWPR.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CPPa0bHh.js → stateDiagram-AJRCARHV-C1c5XtKG.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Dyj14elw.js → stateDiagram-v2-BHNVJYJU-Cv7_pOt_.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-UVWf2E8M.js → timeline-definition-PNZ67QCA-BWg-lsI0.js} +1 -1
- package/dist/client/assets/{upload-BkgVjwwc.js → upload-Dxv5FPaS.js} +1 -1
- package/dist/client/assets/{users-9nCT4liw.js → users-DvKg3opr.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CqGrv1wQ.js → vennDiagram-CIIHVFJN-gFjFmLlv.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-aA0pos_F.js → wardley-L42UT6IY-BaCNX8ou.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-C-O5tD1L.js → wardleyDiagram-YWT4CUSO-BRR6aw0q.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-qoIF674C.js → xychartDiagram-2RQKCTM6-D6Gwn1XW.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +14159 -12709
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +27 -1
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +4 -7
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +0 -5
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +0 -5
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +0 -5
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +0 -5
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +4 -7
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +0 -5
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +0 -5
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +0 -5
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +0 -5
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ShareBlocksPanel.tsx +4 -1
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/__tests__/ShareBlocksPanel.test.tsx +41 -2
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +0 -5
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/SKILL.md +1 -1
- package/skill/fusion/references/engine-tools.md +1 -0
- package/skill/fusion/references/extension-tools.md +10 -0
- package/skill/fusion/references/fusion-capabilities.md +1 -0
- package/dist/client/assets/AgentDetailView-whCXABbu.js +0 -18
- package/dist/client/assets/ChatView-CninsTIm.js +0 -6
- package/dist/client/assets/CommandCenter-B9q-zM9p.css +0 -1
- package/dist/client/assets/CommandCenter-C6LmdUin.js +0 -71
- package/dist/client/assets/ExperimentalAgentOnboardingModal-DvDix9pH.js +0 -1
- package/dist/client/assets/InsightsView-X4RlcgrU.js +0 -11
- package/dist/client/assets/SecretsView-B48BIZKw.js +0 -1
- package/dist/client/assets/SessionTerminal-CUyYlq16.js +0 -2
- package/dist/client/assets/SettingsModal-DbjBoUYD.js +0 -21
- package/dist/client/assets/TodoView-DmpJmxu7.css +0 -1
- package/dist/client/assets/TodoView-MZ9Pfl65.js +0 -6
- package/dist/client/assets/WorkflowNodeEditor-B95Dvf-O.js +0 -8
- package/dist/client/assets/app-SucmTDhV.js +0 -13
- package/dist/client/assets/channel-Y_Uhrtqx.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DhicwSPE.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DhicwSPE.js +0 -1
- package/dist/client/assets/index-Bg8SMXUs.css +0 -1
- package/dist/client/assets/index-DO9Ch72Y.js +0 -2544
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{r as n,j as t,b as gr}from"./vendor-react-SZ_qB27O.js";import{c as pr,aE as mt,aC as at,dU as ha,dV as Rs,bM as Kt,dW as rs,aH as ue,dX as Ut,bs as Dt,dY as fa,dZ as zt,d_ as vr,bm as Rn,dT as jt,d$ as br,e0 as pn,e1 as yr,e2 as wr,e3 as xr,e4 as kr,e5 as Sr,a6 as za,e6 as Cr,aD as ws,bt as ga,e7 as Mr,e8 as Rr,e9 as is,ea as Ar,eb as Nr,ec as Tr,ed as Er,ee as jr,ef as Dr,eg as Lr,aW as Ir,bH as Ha,br as An,eh as xs,az as Nn,ei as Fr,ej as Pr,bk as _r,a9 as $r,b0 as Cn,N as Or,bU as Br,ek as zr,f as Hr,aJ as Ur,el as Ua,em as Kr,dG as Vr,F as Gr,en as Wr,eo as qr,ep as Xr,eq as pa,v as Qr,p as Yr,q as Jr,dD as os,C as vn,s as cs,P as Tt,V as Zr,bp as va,ds as ba,dr as ei,X as ti,bW as ni,u as ls,bG as si,er as ds,es as ya,et as us,eu as wa,ev as xa,ew as ai,ex as ri,bE as ka}from"./index-inWk2g6R.js";import{u as rt}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as Sa}from"./SessionTerminal-CEv1G-9-.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";import"./shield-alert-B7JyuWPR.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 ii=[["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"}]],Ka=pr("hash",ii);function Ca(s){const{sessionId:r,tempUserMessageId:o,initialText:f,initialThinking:u,initialToolCalls:m,setStreamingText:v,setStreamingThinking:h,setStreamingToolCalls:b,cancelStreamingFlushesRef:i,addToast:F,onDone:I,onError:S,onFallbackSession:T}=s;let d=f??"",_=u??"",M=m?[...m]:[],Q,R=null,te=null;const V=()=>{R=null,v(d)},be=()=>{te=null,h(_)},A=()=>{R!==null&&(cancelAnimationFrame(R),R=null),te!==null&&(cancelAnimationFrame(te),te=null)};return i.current=A,{handlers:{onThinking:G=>{_+=G,te===null&&(te=requestAnimationFrame(be))},onText:G=>{d+=G,R===null&&(R=requestAnimationFrame(V))},onToolStart:G=>{M=[...M,{toolName:G.toolName,args:G.args,isError:!1,status:"running"}],b(M)},onToolEnd:G=>{const ae=[...M];for(let H=ae.length-1;H>=0;H--){const Z=ae[H];if(Z?.toolName===G.toolName&&Z.status==="running"){ae[H]={...Z,status:"completed",isError:G.isError,result:G.result},M=ae,b(ae);return}}M=[...ae,{toolName:G.toolName,isError:G.isError,result:G.result,status:"completed"}],b(M)},onFallback:G=>{Q=G,T?.(G,r),F?.(`Primary model unavailable. Switched to fallback ${G.fallbackModel}.`,"warning")},onDone:G=>{A(),I({messageId:G.messageId,message:G.message,accumulated:{text:d,thinking:_,toolCalls:M,fallbackInfo:Q}})},onError:(G,ae)=>{A(),S(G,o,ae)}},cancelFlushes:A}}const oi="fusion:chat-pending:";function As(s){return s?`${oi}${s}`:null}function ci(s){const r=As(s);if(!r||typeof window>"u")return[];try{const o=localStorage.getItem(r);if(!o)return[];try{const u=JSON.parse(o);if(Array.isArray(u))return u.filter(m=>typeof m=="string"&&m.trim().length>0)}catch{}const f=o.trim();return f?[f]:[]}catch{return[]}}function ms(s,r){const o=As(s);if(!(!o||typeof window>"u"))try{const f=r.filter(u=>u.trim().length>0);if(f.length===0){localStorage.removeItem(o);return}localStorage.setItem(o,JSON.stringify(f))}catch{}}function bn(s){const r=As(s);if(!(!r||typeof window>"u"))try{localStorage.removeItem(r)}catch{}}const hs="kb-chat-active-session",Be="__fn_agent__",li="task-planner:";function ks(s){return s.agentId.startsWith(li)}function di(s){return ks(s)&&!s.lastMessageAt&&!s.lastMessagePreview}function Ma(s){const r=typeof s=="string"?s.trim():"",o=r.indexOf("/");return!r||o<=0||o>=r.length-1?{}:{modelProvider:r.slice(0,o),modelId:r.slice(o+1)}}function ui(s){const r=s?.toolCalls;if(!Array.isArray(r))return;const o=r.map(f=>{if(!f||typeof f!="object")return null;const u=f,m=typeof u.toolName=="string"?u.toolName:"";if(!m)return null;const v=u.args;return{toolName:m,...v&&typeof v=="object"?{args:v}:{},isError:!!u.isError,result:u.result,status:"completed"}}).filter(f=>f!==null);return o.length>0?o:void 0}function mi(s){const r=s?.fallback;if(!r||typeof r!="object")return;const o=r,f=typeof o.primaryModel=="string"?o.primaryModel:"",u=typeof o.fallbackModel=="string"?o.fallbackModel:"",m=o.triggerPoint;if(!(!f||!u||m!=="session-creation"&&m!=="prompt-time"))return{primaryModel:f,fallbackModel:u,triggerPoint:m}}function hi(s){const r=s?.failureInfo;if(!r||typeof r!="object")return;const o=r,f=typeof o.summary=="string"?o.summary.trim():"";if(!f)return;const u=(()=>{const m=o.reference;if(!m||typeof m!="object")return;const v=m,h=typeof v.kind=="string"?v.kind.trim():"",b=typeof v.id=="string"?v.id.trim():"";if(!(!h||!b))return{kind:h,id:b,...typeof v.label=="string"&&v.label.trim()?{label:v.label.trim()}:{}}})();return{summary:f,...typeof o.errorClass=="string"&&o.errorClass.trim()?{errorClass:o.errorClass.trim()}:{},...typeof o.code=="string"&&o.code.trim()?{code:o.code.trim()}:{},...typeof o.detail=="string"&&o.detail.trim()?{detail:o.detail.trim()}:{},...u?{reference:u}:{}}}function Ra(s,r){const o="Failed to get response";return typeof s=="string"?{summary:s.trim()||o}:{summary:typeof s.summary=="string"&&s.summary.trim()?s.summary.trim():o,...typeof s.errorClass=="string"&&s.errorClass.trim()?{errorClass:s.errorClass.trim()}:{},...typeof s.code=="string"&&s.code.trim()?{code:s.code.trim()}:{},...typeof s.detail=="string"&&s.detail.trim()?{detail:s.detail.trim()}:{},...s.reference?{reference:s.reference}:{}}}function yn(s){return{id:s.id,sessionId:s.sessionId,role:s.role,content:s.content,thinkingOutput:s.thinkingOutput,toolCalls:ui(s.metadata),fallbackInfo:mi(s.metadata),failureInfo:hi(s.metadata),attachments:s.attachments,createdAt:s.createdAt}}function fs(s,r){if(s.some(u=>u.id===r.id))return s;const o=s.findIndex(u=>u.role==="user"&&u.id.startsWith("temp-")&&u.sessionId===r.sessionId&&u.content.trim()===r.content.trim());if(o<0)return[...s,r];const f=[...s];return f[o]=r,f}function fi(s,r){const o=n.useCallback(l=>l?`${mt.CHAT_SESSIONS_PREFIX}${l}`:null,[]),f=n.useCallback((l,y)=>l&&y?`${mt.CHAT_MESSAGES_PREFIX}${l}:${y}`:null,[]),u=n.useCallback(l=>{const y=o(l);return y?(at(y,{maxAgeMs:ha})??[]).filter(j=>!ks(j)):[]},[o]),[m,v]=n.useState(()=>u(s)),[h,b]=n.useState(null),[i,F]=n.useState(()=>u(s).length===0),[I,S]=n.useState([]),[T,d]=n.useState(!1),[_,M]=n.useState(!1),[Q,R]=n.useState(""),[te,V]=n.useState(""),[be,A]=n.useState([]),[ie,G]=n.useState([]),[ae,H]=n.useState(""),[Z,D]=n.useState(new Map),q=n.useRef(0),[Se,N]=n.useState(!1),{agentsMap:me}=Rs(s),g=n.useRef(null),k=n.useRef(null),E=n.useRef(!1),p=n.useRef([]),B=n.useRef(()=>!1),z=n.useRef(null),ce=n.useRef(m),ne=n.useRef(h),fe=n.useRef(I),Y=n.useRef(_);ce.current=m,ne.current=h,fe.current=I,Y.current=_,n.useEffect(()=>{p.current=ie},[ie]);const U=n.useRef(new Set),ge=n.useRef(0),C=n.useRef(s);C.current!==s&&(Kt({view:"useChat",trigger:"project-context-change",projectId:s,replayAttempted:!1,detail:{previousProjectId:C.current??null}}),C.current=s,ge.current++);const ye=n.useCallback(async()=>{ce.current.length===0&&F(!0);try{const y=[...(await rs(s)).sessions].sort((j,K)=>new Date(K.updatedAt).getTime()-new Date(j.updatedAt).getTime());v(y);const x=o(s);x&&ue(x,y,{maxBytes:5e5})}catch{const l=u(s);if(ce.current.length===0&&l.length===0){const y=o(s);y&&Ut(y)}}finally{F(!1)}},[o,s]);n.useEffect(()=>{const l=u(s);v(l),F(l.length===0)},[s,u]),n.useEffect(()=>{ye()},[ye,s]);const Re=n.useRef(()=>{}),le=n.useRef(!1);n.useEffect(()=>{le.current=!1,k.current=null},[s]),n.useEffect(()=>{if(i||le.current||ne.current)return;const l=Dt(hs,s);if(!l){le.current=!0;return}const y=m.find(x=>x.id===l);if(y){le.current=!0,Re.current(l,y);return}le.current=!0},[i,m,s]);const Ee=n.useCallback((l,y)=>{const x=f(l,y);return x?at(x,{maxAgeMs:ha})??[]:[]},[f]),je=n.useCallback((l,y)=>{const x=Ee(s,l);return x.length>0?(S(x),d(!1),!0):(y?.clearOnMiss!==!1&&S([]),!1)},[s,Ee]),ve=n.useCallback(async(l,y)=>{const x=typeof y?.offset=="number"&&y.offset>0||typeof y?.before=="string",j=f(s,l),K=x?[]:Ee(s,l),L=K.length>0;!x&&L?(S(K),d(!1)):d(!0);try{const O=await fa(l,{limit:50,order:"desc",...y},s),P=O.messages.slice().reverse().map(yn),X=ne.current?.id===l||y?.commitForStreamingAttach===!0&&k.current?.sessionId===l;if(x)X&&(S(ee=>[...P,...ee]),N(O.messages.length>=50));else if(X){const ee=Y.current&&ne.current?.id===l,W=P.every(de=>de.sessionId===l),J=fe.current.length>0&&fe.current.every(de=>de.sessionId===l),se=ee&&J&&(!W||P.length===0);S(de=>{if(ee&&de.length>0){const Pe=de.every(Ue=>Ue.sessionId===l);if(Pe&&(!W||P.length===0))return de;if(Pe&&P.length>0){const Ue=[...de],yt=new Set(de.map(Ie=>Ie.id));for(const Ie of P)yt.has(Ie.id)||(Ue.push(Ie),yt.add(Ie.id));return Ue}}return P}),N(O.messages.length>=50),j&&W&&!se&&ue(j,P,{maxBytes:5e5})}}catch{!x&&fe.current.length===0&&L&&(S(K),d(!1))}finally{d(!1)}},[f,s,Ee]),ze=n.useCallback(()=>{z.current?.(),z.current=null,p.current=[],G([]),R(""),V(""),A([]),M(!1)},[]),ht=n.useCallback(l=>{const y=ne.current?.id;if(typeof l=="number"){const x=p.current.filter((j,K)=>K!==l);p.current=x,G(x),ms(y,x);return}bn(y),p.current=[],G([])},[]),we=n.useCallback(()=>{const[l,...y]=p.current,x=l?.trim();if(!x)return;const j=ne.current?.id;p.current=y,G(y),ms(j,y),It.current(x)},[]),ft=n.useCallback(async(l,y)=>{try{const{session:x}=await zt(l,s);if(ne.current?.id!==l||p.current.length===0)return;if(x.isGenerating||x.inFlightGeneration){B.current(l,x.inFlightGeneration,{silent:y?.silent,priorThreadLoadAlreadyStarted:!0});return}we()}catch{}},[we,s]),xe=n.useCallback((l,y,x)=>{if(g.current||!l)return!0;E.current=!1;const j=fe.current,K=j.length===0||j[0]?.sessionId!==l;k.current={sessionId:l,replayFromEventId:typeof y?.replayFromEventId=="number"?y.replayFromEventId:null},K&&!x?.priorThreadLoadAlreadyStarted&&(je(l,{clearOnMiss:!1}),ve(l,{commitForStreamingAttach:!0})),y&&(R(y.streamingText),V(y.streamingThinking),A(y.toolCalls)),M(!0);const{handlers:L}=Ca({sessionId:l,tempUserMessageId:"",initialText:y?.streamingText,initialThinking:y?.streamingThinking,initialToolCalls:y?.toolCalls,setStreamingText:R,setStreamingThinking:V,setStreamingToolCalls:A,cancelStreamingFlushesRef:z,addToast:x?.silent?void 0:r,onFallbackSession:(P,X)=>{const ee=Ma(P.fallbackModel);v(W=>W.map(J=>J.id===X?{...J,...ee}:J)),b(W=>W&&W.id===X?{...W,...ee}:W)},onDone:()=>{R(""),V(""),A([]),M(!1),Y.current=!1,g.current=null,k.current=null,ve(l),we()},onError:P=>{R(""),V(""),A([]),M(!1),Y.current=!1,g.current=null,k.current=null;const X=Ra(P);x?.silent||r?.(X.summary,"error"),ve(l),ft(l,{silent:x?.silent})}});Kt({view:"useChat",trigger:"sse-open",projectId:s,replayAttempted:typeof y?.replayFromEventId=="number",replayFromEventId:y?.replayFromEventId??null,lastEventId:y?.replayFromEventId??null});const O=vr(l,L,s,{...typeof y?.replayFromEventId=="number"?{lastEventId:y.replayFromEventId}:{}});return g.current=O,!0},[r,we,ft,je,ve,s]);B.current=xe;const _e=n.useCallback((l,y)=>{const x=ne.current?.id??null;if(l&&x===l&&!y)return;g.current&&(g.current.close(),g.current=null),k.current=null;const j=y??m.find(K=>K.id===l);b(j||null),ne.current=j||null,l&&zt(l,s).then(({session:K})=>{K.isGenerating&&ne.current?.id===l&&(b(L=>!L||L.id!==l?L:{...L,...K}),g.current||xe(l,K.inFlightGeneration,{silent:!0}))}).catch(()=>{}),ze(),N(!1),l?(je(l),ve(l)):S([]),j?.isGenerating&&xe(j.id,j.inFlightGeneration,{priorThreadLoadAlreadyStarted:!0}),l?Rn(hs,l,s):jt(hs,s)},[xe,je,m,ve,s,ze]);Re.current=_e,n.useEffect(()=>{const l=h?.id;if(!l)return;const y=ci(l);if(y.length===0)return;p.current=y,G(y);let x=!1;return zt(l,s).then(({session:j})=>{if(!(x||ne.current?.id!==l||p.current.length===0)){if(j.isGenerating){g.current||xe(l,j.inFlightGeneration);return}!Y.current&&!g.current&&we()}}).catch(()=>{}),()=>{x=!0}},[h?.id,xe,we,s]);const Vt=n.useCallback(async l=>{const y=ne.current?.id,x=await br(l,s);g.current&&(g.current.close(),g.current=null),k.current=null;const j={id:x.session.id,title:x.session.title,agentId:x.session.agentId,status:x.session.status,modelProvider:x.session.modelProvider,modelId:x.session.modelId,thinkingLevel:x.session.thinkingLevel,createdAt:x.session.createdAt,updatedAt:x.session.updatedAt};return v(K=>K.some(L=>L.id===j.id)?K:[j,...K]),bn(y),ze(),_e(j.id,j),j},[s,ze,_e]),gt=n.useCallback(async l=>{bn(l),await pn(l,{status:"archived"},s),v(y=>y.filter(x=>x.id!==l)),h?.id===l&&(k.current=null,b(null),S([]))},[h,s]),it=n.useCallback(async(l,y)=>{const x=y.trim()||null,j=m,K=h;v(L=>L.map(O=>O.id===l?{...O,title:x}:O)),b(L=>L?.id===l?{...L,title:x}:L);try{const O=(await pn(l,{title:x},s)).session;v(P=>P.map(X=>X.id===l?{...X,title:O.title,updatedAt:O.updatedAt}:X)),b(P=>P?.id===l?{...P,title:O.title,updatedAt:O.updatedAt}:P)}catch(L){throw v(j),b(K),r?.("Failed to rename conversation","error"),L}},[h,r,s,m]),He=n.useCallback(async(l,y)=>{const x=m,j=h,L=y.agentId!==void 0?{agentId:y.agentId,modelProvider:null,modelId:null}:{agentId:Be,modelProvider:y.modelProvider??null,modelId:y.modelId??null};v(O=>O.map(P=>P.id===l?{...P,...L}:P)),b(O=>O?.id===l?{...O,...L}:O);try{const P=(await pn(l,L,s)).session,X={agentId:P.agentId,modelProvider:P.modelProvider,modelId:P.modelId,updatedAt:P.updatedAt};v(ee=>ee.map(W=>W.id===l?{...W,...X}:W)),b(ee=>ee?.id===l?{...ee,...X}:ee)}catch(O){throw v(x),b(j),r?.("Failed to update chat model","error"),O}},[h,r,s,m]),Je=n.useCallback(async(l,y)=>{const x=y.trim()||null,j=m,K=h;v(L=>L.map(O=>O.id===l?{...O,thinkingLevel:x}:O)),b(L=>L?.id===l?{...L,thinkingLevel:x}:L);try{const O=(await pn(l,{thinkingLevel:x},s)).session;v(P=>P.map(X=>X.id===l?{...X,thinkingLevel:O.thinkingLevel,updatedAt:O.updatedAt}:X)),b(P=>P?.id===l?{...P,thinkingLevel:O.thinkingLevel,updatedAt:O.updatedAt}:P)}catch(L){throw v(j),b(K),r?.("Failed to update thinking level","error"),L}},[h,r,s,m]),Lt=n.useCallback(async l=>{bn(l),h?.id===l&&g.current&&(g.current.close(),g.current=null),h?.id===l&&(k.current=null),await yr(l,s);const y=f(s,l);y&&Ut(y),v(x=>x.filter(j=>j.id!==l)),h?.id===l&&(b(null),S([]))},[h,f,s]),Tn=n.useCallback(async()=>{if(!h||!Se)return;const l=fe.current[0]?.createdAt;l&&await ve(h.id,{before:l})},[h,Se,ve]),pt=n.useCallback(()=>{h&&(E.current=!0,z.current?.(),z.current=null,g.current?.close(),g.current=null,k.current=null,wr(h.id,s).catch(()=>{}),M(!1),Y.current=!1,R(""),V(""),A([]),we())},[h,s,we]),It=n.useRef(()=>{}),De=xr(),vt=n.useCallback(async l=>{try{await ye();const y=await zt(l,s);ne.current?.id===l&&b(x=>!x||x.id!==l?x:{...x,...y.session}),y.session.isGenerating?(R(""),V(""),A([]),M(!0),Y.current=!0,xe(l,y.session.inFlightGeneration,{silent:!0})):(R(""),V(""),A([]),M(!1),Y.current=!1,await ve(l))}catch{}},[xe,ve,s,ye]),bt=n.useCallback((l,y)=>{if(!h)return;if(Y.current){const L=l.trim();if(!L)return;const O=[...p.current,L];p.current=O,G(O),ms(h.id,O);return}E.current=!1,g.current&&(g.current.close(),g.current=null),k.current=null;const x=`temp-${Date.now()}`,j={id:x,sessionId:h.id,role:"user",content:l,createdAt:new Date().toISOString()};S(L=>[...L,j]),R(""),V(""),A([]),M(!0),Y.current=!0;const{handlers:K}=Ca({sessionId:h.id,tempUserMessageId:x,setStreamingText:R,setStreamingThinking:V,setStreamingToolCalls:A,cancelStreamingFlushesRef:z,addToast:r,onFallbackSession:(L,O)=>{const P=Ma(L.fallbackModel);v(X=>X.map(ee=>ee.id===O?{...ee,...P}:ee)),b(X=>X&&X.id===O?{...X,...P}:X)},onDone:({messageId:L,message:O,accumulated:P})=>{const X=O?{...yn(O),...P.text.length>0?{content:P.text}:{}}:{id:L||`msg-${Date.now()}`,sessionId:h.id,role:"assistant",content:P.text,thinkingOutput:P.thinking,toolCalls:P.toolCalls.length>0?P.toolCalls:void 0,fallbackInfo:P.fallbackInfo,createdAt:new Date().toISOString()};U.current.add(X.id),S(ee=>[...ee,X]),R(""),V(""),A([]),M(!1),Y.current=!1,g.current=null,k.current=null,setTimeout(()=>{U.current.delete(X.id)},1e3),ye(),we()},onError:(L,O,P)=>{const X=Ra(L),ee=typeof L=="string"?L:X.summary,W=Cr(ee),J=P?.requestAccepted===!0;S(se=>{const de=J?se:se.filter(Pe=>Pe.id!==O);return W?de:[...de,{id:`error-${Date.now()}`,sessionId:h.id,role:"assistant",content:X.summary,failureInfo:X,createdAt:new Date().toISOString()}]}),R(""),V(""),A([]),M(!1),Y.current=!1,g.current=null,k.current=null,console.error("[useChat] Stream error:",L),W?(console.info("[useChat] Suppressed tab-suspension stream error:",L),h?.id&&(R(""),V(""),A([]),M(!0),Y.current=!0,vt(h.id))):(r?.(X.summary,"error"),J&&fa(h.id,{limit:50,order:"desc"},s).then(se=>{if(ne.current?.id!==h.id)return;const de=se.messages.slice().reverse().map(yn);S(Pe=>de.reduce(fs,Pe))}).catch(()=>{}),ye()),E.current||we()}});g.current=kr(h.id,l,K,y,s)},[h,s,ye,r,xe,vt,we]);It.current=bt;const En=n.useCallback(async(l,y)=>{if(Y.current||!h)return;const x=y.trim();if(!x)return;const j=h.id,K=fe.current,L=K.findIndex(P=>P.id===l);if(L===-1)return;S(K.slice(0,L));try{await Sr(j,l,x,s)}catch(P){console.error("[useChat] Failed to edit message:",P),r?.("Failed to edit message","error"),await ve(j);return}const O=f(s,j);O&&Ut(O),bt(x)},[h,s,r,ve,f,bt]),Ze=ae.trim();n.useEffect(()=>{if(!Ze){q.current++,D(new Map);return}const l=++q.current,y=setTimeout(()=>{(async()=>{try{const x=await rs(s,void 0,{q:Ze,titleOnly:!1});if(q.current!==l)return;const j=new Map;for(const K of x.sessions)K.matchedMessagePreview&&j.set(K.id,K.matchedMessagePreview);D(j)}catch{q.current===l&&D(new Map)}})()},300);return()=>clearTimeout(y)},[Ze,s]);const Gt=(()=>{if(!Ze)return m;const l=Ze.toLowerCase(),y=m.filter(j=>j.title?.toLowerCase().includes(l)||j.agentId.toLowerCase().includes(l));if(Z.size===0)return y;const x=new Map;for(const j of y)x.set(j.id,j);for(const j of m){const K=Z.get(j.id);if(K===void 0)continue;const L=x.get(j.id);x.set(j.id,{...L??j,matchedMessagePreview:K})}return Array.from(x.values()).sort((j,K)=>new Date(K.updatedAt).getTime()-new Date(j.updatedAt).getTime())})();return n.useEffect(()=>{if(!h?.id||h.isGenerating!==!0||g.current)return;const l=typeof h.inFlightGeneration?.replayFromEventId=="number"?h.inFlightGeneration.replayFromEventId:null,y=k.current;y?.sessionId===h.id&&y.replayFromEventId===l||xe(h.id,h.inFlightGeneration,{silent:!0})},[h?.id,h?.isGenerating,h?.inFlightGeneration,xe]),n.useEffect(()=>{if(!ne.current?.isGenerating||(g.current||xe(ne.current.id,ne.current.inFlightGeneration),!Y.current||g.current||!ne.current))return;const l=setInterval(async()=>{if(!Y.current||g.current||!ne.current){clearInterval(l);return}try{(await rs(s)).sessions.find(j=>j.id===ne.current?.id)?.isGenerating||(clearInterval(l),await ve(ne.current.id),R(""),V(""),A([]),M(!1),Y.current=!1,we())}catch{}},3e3);return()=>clearInterval(l)},[xe,ve,s,h,we]),n.useEffect(()=>De.onBecameVisible(()=>{const y=ne.current;if(!y||g.current)return;const x=ge.current;zt(y.id,s).then(j=>{if(!(ge.current!==x||g.current)){if(j.session.isGenerating){R(""),V(""),A([]),M(!0),Y.current=!0,xe(y.id,j.session.inFlightGeneration,{silent:!0});return}Y.current&&(R(""),V(""),A([]),M(!1),Y.current=!1,we(),ve(y.id))}}).catch(()=>{})}),[xe,ve,s,De,we]),n.useEffect(()=>{const l=ge.current,y=s?`?projectId=${encodeURIComponent(s)}`:"",x=()=>ge.current!==l,j=ee=>{if(x())return;const W=JSON.parse(ee.data);if(ks(W)){di(W)||ye();return}v(J=>J.some(se=>se.id===W.id)?J:[W,...J])},K=ee=>{if(x())return;const W=JSON.parse(ee.data);v(J=>[...J.map(de=>de.id===W.id?W:de)]),ne.current?.id===W.id&&(b(W),W.isGenerating&&!g.current&&xe(W.id,W.inFlightGeneration))},L=ee=>{if(x())return;const{id:W}=JSON.parse(ee.data);v(se=>se.filter(de=>de.id!==W));const J=f(s,W);J&&Ut(J),ne.current?.id===W&&(b(null),S([]))},O=ee=>{if(x())return;const W=JSON.parse(ee.data),J=yn(W);if(ce.current.some(se=>se.id===J.sessionId)||ye(),!U.current.has(J.id)){if(ne.current?.id===J.sessionId&&Y.current&&J.role==="user"){S(se=>fs(se,J));return}if(ne.current?.id===J.sessionId&&Y.current&&!g.current&&J.role==="assistant"){S(se=>se.some(de=>de.id===J.id)?se:[...se,J]),R(""),V(""),A([]),M(!1),Y.current=!1,we();return}ne.current?.id===J.sessionId&&!Y.current&&S(se=>se.some(de=>de.id===J.id)?se:J.role==="user"?fs(se,J):[...se,J])}},P=ee=>{if(x())return;const{id:W}=JSON.parse(ee.data);S(J=>J.filter(se=>se.id!==W))};return za(`/api/events${y}`,{events:{"chat:session:created":j,"chat:session:updated":K,"chat:session:deleted":L,"chat:message:added":O,"chat:message:deleted":P}})},[xe,f,s,we,ye]),n.useEffect(()=>()=>{g.current&&(g.current.close(),g.current=null),k.current=null},[]),{sessions:m,activeSession:h,sessionsLoading:i,messages:I,messagesLoading:T,isStreaming:_,streamingText:Q,streamingThinking:te,streamingToolCalls:be,pendingMessages:ie,selectSession:_e,createSession:Vt,archiveSession:gt,renameSession:it,setSessionModel:He,setSessionThinkingLevel:Je,deleteSession:Lt,sendMessage:bt,editMessageAndResend:En,stopStreaming:pt,clearPendingMessage:ht,loadMoreMessages:Tn,hasMoreMessages:Se,searchQuery:ae,setSearchQuery:H,filteredSessions:Gt,refreshSessions:ye,agentsMap:me}}function wn(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function gi(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function gs(s,r){const o=gi(),f=r?.warm===!0,u=wn(),m=new Map;let v=!1,h=!1;return{mark(i){v||h||!o||m.has(i)||m.set(i,wn())},complete:i=>{if(!o||v||h){v=!0;return}v=!0,m.set("complete",wn());const F=Array.from(m.entries()).sort((d,_)=>d[1]-_[1]);let I=u;const S={};for(const[d,_]of F)S[d]=Math.max(0,_-I),I=_;const T=Math.max(0,wn()-u);try{console.debug("[room-open]",{roomId:s,warm:f,totalMs:T,phases:S,...i??{}})}catch{}},cancel(){h=!0,v=!0}}}const st="fusion:chat-active-room";class Va extends Error{roomId;constructor(r,o){super(r),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=o}}function Ss(s){return[...s].sort((r,o)=>new Date(o.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function ut(s,r){const o=s.findIndex(u=>u.id===r.id);if(o===-1)return Ss([r,...s]);const f=[...s];return f[o]=r,Ss(f)}function Ye(s){try{return JSON.parse(s.data)}catch{return null}}function pi(s,r,o){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:s,role:"user",content:r,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...o?.length?{attachments:o}:{},createdAt:new Date().toISOString()}}function Aa(s,r,o){if(s.some(u=>u.id===r.id))return s;const f=o?s.findIndex(u=>u.id===o):-1;if(f>=0){const u=[...s];return u[f]=r,u}if(r.role==="user"){const u=s.findIndex(m=>m.role==="user"&&m.id.startsWith("temp-")&&m.content.trim()===r.content.trim());if(u>=0){const m=[...s];return m[u]=r,m}}return[...s,r]}function vi(s,r){const{t:o}=rt("app"),f=`${mt.CHAT_ROOMS}:${s??"global"}`,u=`${mt.ACTIVE_CHAT_ROOM_ID}:${s??"global"}`,m=n.useCallback(g=>`${mt.CHAT_ROOM_MESSAGES_PREFIX}${s??"global"}:${g}`,[s]),v=n.useCallback(g=>`${mt.CHAT_ROOM_MEMBERS_PREFIX}${s??"global"}:${g}`,[s]),[h,b]=n.useState(()=>{const g=at(f,{maxAgeMs:ws});return Array.isArray(g)?g:[]}),[i,F]=n.useState(()=>h.length===0),[I,S]=n.useState(null),[T,d]=n.useState(()=>{const g=at(u,{maxAgeMs:ga});return g?h.find(k=>k.id===g)??null:null}),[_,M]=n.useState([]),[Q,R]=n.useState([]),[te,V]=n.useState(!1),be=n.useRef(h),A=n.useRef(T),ie=n.useRef(0),G=n.useRef(s);be.current=h,A.current=T,G.current!==s&&(G.current=s,ie.current+=1);const ae=n.useCallback(async g=>{if(!g){M([]),R([]),V(!1);return}const k=gs(g.id,{warm:!1});k.mark("select");const E=at(m(g.id),{maxAgeMs:Mr}),p=at(v(g.id),{maxAgeMs:ws}),B=Array.isArray(E)&&E.length>0,z=Array.isArray(p)&&p.length>0;B||z?(k.mark("cache-hit"),B&&(R(E),k.mark("hydrate")),z&&M(p),V(!1)):(R([]),V(!0));try{const[ce,ne]=await Promise.all([Rr(g.id,s),is(g.id,{limit:100,order:"desc"},s)]);k.mark("members-fetch"),k.mark("messages-fetch"),ue(v(g.id),ce.members,{maxBytes:5e5}),ue(m(g.id),ne.messages,{maxBytes:5e5}),A.current?.id===g.id&&(M(ce.members),R(ne.messages),k.mark("hydrate"))}catch{!B&&!z&&(M([]),R([]))}finally{V(!1),k.complete({warm:B,membersCached:z})}},[v,m,s]),H=n.useCallback(async()=>{be.current.length===0&&F(!0);try{const g=await Ar({},s),k=Ss(g.rooms);b(k),ue(f,k,{maxBytes:5e5}),S(null);const E=at(u,{maxAgeMs:ga})??Dt(st,s);if(E){const p=k.find(B=>B.id===E)??null;p?(d(p),ae(p)):(jt(st,s),ue(u,"",{maxBytes:5e5}))}}catch(g){const k=g instanceof Error?g.message:o("chatRooms.error.failedToLoad","Failed to load chat rooms");S(k),r?.(k,"error")}finally{F(!1)}},[u,r,ae,s,f]),Z=n.useCallback(g=>{if(!g){A.current=null,d(null),jt(st,s),ue(u,"",{maxBytes:5e5}),ae(null);return}const k=be.current.find(E=>E.id===g)??null;A.current=k,d(k),k&&(Rn(st,k.id,s),ue(u,k.id,{maxBytes:5e5}),ae(k))},[u,ae,s]),D=n.useCallback(async g=>{const E=(await Nr({name:g.name,memberAgentIds:g.memberAgentIds},s)).room;return b(p=>ut(p,E)),A.current=E,d(E),Rn(st,E.id,s),ue(u,E.id,{maxBytes:5e5}),await ae(E),E},[u,ae,s]),q=n.useCallback(async(g,k)=>{const p=(await Tr(g,k,s)).room;return b(B=>ut(B,p)),A.current?.id===p.id&&(A.current=p,d(p)),p},[s]),Se=n.useCallback(async g=>{await Er(g,s),b(k=>k.filter(E=>E.id!==g)),ue(m(g),[],{maxBytes:5e5}),ue(v(g),[],{maxBytes:5e5}),A.current?.id===g&&(A.current=null,d(null),M([]),R([]),jt(st,s),ue(u,"",{maxBytes:5e5}))},[u,v,m,s]),N=n.useCallback(async(g,k)=>{const E=A.current,p=E?.id;if(!p)throw new Error(o("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const B=gs(p,{warm:!1}),z=k?.files?.map(fe=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:fe.name,originalName:fe.name,mimeType:fe.type||"application/octet-stream",size:fe.size,createdAt:new Date().toISOString()})),ce=pi(p,g,z?.length?z:k?.attachments);A.current?.id===p&&R(fe=>{const Y=[...fe,ce];return ue(m(p),Y,{maxBytes:5e5}),Y});let ne=!1;try{const fe=[];if(k?.files?.length)for(const C of k.files)try{const ye=await jr(p,C,s);fe.push(ye.attachment)}catch{throw new Error(o("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:C.name}))}const Y=[...k?.attachments??[],...fe],U=await Dr(p,{content:g,...Y.length?{attachments:Y}:{}},s);ne=!0,U.message?.createdAt&&E&&b(C=>ut(C,{...E,updatedAt:U.message.createdAt})),A.current?.id===p&&R(C=>{const ye=Aa(C,U.message,ce.id);return ue(m(p),ye,{maxBytes:5e5}),ye});const ge=await is(p,{limit:100,order:"desc"},s);if(ue(m(p),ge.messages,{maxBytes:5e5}),A.current?.id!==p)return;R(ge.messages),B.mark("hydrate")}catch(fe){let Y=null;try{const ge=await is(p,{limit:100,order:"desc"},s);Y=ge.messages,ue(m(p),ge.messages,{maxBytes:5e5}),A.current?.id===p&&(R(ge.messages),B.mark("hydrate"))}catch{!ne&&A.current?.id===p&&R(ge=>{const C=ge.filter(ye=>ye.id!==ce.id);return ue(m(p),C,{maxBytes:5e5}),C})}const U=Y?.some(ge=>ge.role==="user"&&ge.content.trim()===ce.content.trim());if(ne||U){const ge=fe instanceof Error&&fe.message.trim()?fe.message:o("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new Va(ge,p)}throw fe}finally{B.complete({source:"send-room-message"})}},[m,s]),me=n.useCallback(async g=>{!g||!be.current.some(k=>k.id===g)||(await Lr(g,s),ue(m(g),[],{maxBytes:5e5}),A.current?.id===g&&R([]))},[m,s]);return n.useEffect(()=>{H()},[H]),n.useEffect(()=>{const g=ie.current,k=s?`/api/events?projectId=${encodeURIComponent(s)}`:"/api/events";return za(k,{onReconnect:()=>{Kt({view:"useChatRooms",trigger:"sse-reconnect",projectId:s,replayAttempted:!1});const E=A.current?.id;if(E){const p=gs(E,{warm:!0});p.mark("sse-reconnect-refresh"),H().finally(()=>p.complete({source:"sse-reconnect"}));return}H()},events:{"chat:room:created":E=>{if(ie.current!==g)return;const p=Ye(E);p&&b(B=>ut(B,p))},"chat:room:updated":E=>{if(ie.current!==g)return;const p=Ye(E);p&&(b(B=>ut(B,p)),A.current?.id===p.id&&(A.current=p,d(p)))},"chat:room:deleted":E=>{if(ie.current!==g)return;const p=Ye(E);p?.id&&(b(B=>B.filter(z=>z.id!==p.id)),ue(m(p.id),[],{maxBytes:5e5}),ue(v(p.id),[],{maxBytes:5e5}),A.current?.id===p.id&&(A.current=null,d(null),M([]),R([]),jt(st,s),ue(u,"",{maxBytes:5e5})))},"chat:room:member:added":E=>{if(ie.current!==g)return;const p=Ye(E);!p||A.current?.id!==p.roomId||M(B=>{if(B.some(ce=>ce.agentId===p.agentId))return B;const z=[...B,p];return ue(v(p.roomId),z,{maxBytes:5e5}),z})},"chat:room:member:removed":E=>{if(ie.current!==g)return;const p=Ye(E);!p||A.current?.id!==p.roomId||M(B=>{const z=B.filter(ce=>ce.agentId!==p.agentId);return ue(v(p.roomId),z,{maxBytes:5e5}),z})},"chat:room:message:added":E=>{if(ie.current!==g)return;const p=Ye(E);p&&(b(B=>{const z=B.find(ce=>ce.id===p.roomId);return z?ut(B,{...z,updatedAt:p.createdAt}):B}),A.current?.id===p.roomId&&R(B=>{const z=Aa(B,p);return z===B?B:(ue(m(p.roomId),z,{maxBytes:5e5}),z)}))},"chat:room:message:updated":E=>{if(ie.current!==g)return;const p=Ye(E);!p||A.current?.id!==p.roomId||R(B=>{const z=B.map(ce=>ce.id===p.id?p:ce);return ue(m(p.roomId),z,{maxBytes:5e5}),z})},"chat:room:message:deleted":E=>{if(ie.current!==g)return;const p=Ye(E);p?.id&&R(B=>{const z=B.filter(ne=>ne.id!==p.id),ce=A.current?.id;return ce&&ue(m(ce),z,{maxBytes:5e5}),z})},"chat:room:messages:cleared":E=>{if(ie.current!==g)return;const p=Ye(E);p?.roomId&&(ue(m(p.roomId),[],{maxBytes:5e5}),A.current?.id===p.roomId&&R([]),b(B=>{const z=B.find(ce=>ce.id===p.roomId);return z?ut(B,{...z,updatedAt:new Date().toISOString()}):B}))}}})},[u,v,m,s,H]),n.useEffect(()=>{T&&(h.some(g=>g.id===T.id)||(A.current=null,d(null),M([]),R([]),jt(st,s),ue(u,"",{maxBytes:5e5})))},[T,u,s,h]),{rooms:h,roomsLoading:i,roomsError:I,activeRoom:T,activeRoomMembers:_,messages:Q,messagesLoading:te,selectRoom:Z,createRoom:D,updateRoomSettings:q,deleteRoom:Se,sendRoomMessage:N,clearRoom:me,refreshRooms:H}}const Ht={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},Na=200;function Cs(s){if(!s)return null;const r=new Date(s).getTime();return Number.isFinite(r)?r:null}function Ga(s){const r=Object.entries(s);if(r.length<=Na)return s;const o=r.map(([f,u])=>({id:f,timestamp:u,value:Cs(u)??0})).sort((f,u)=>u.value-f.value).slice(0,Na);return Object.fromEntries(o.map(({id:f,timestamp:u})=>[f,u]))}function xn(s){if(!s)return{};try{const r=JSON.parse(s);if(!r||typeof r!="object")return{};const o={};for(const[f,u]of Object.entries(r))typeof f=="string"&&typeof u=="string"&&(o[f]=u);return Ga(o)}catch{return{}}}function bi(s){const[r,o]=n.useState(()=>{try{return xn(Dt(Ht.direct,s))}catch{return{}}}),[f,u]=n.useState(()=>{try{return xn(Dt(Ht.room,s))}catch{return{}}});n.useEffect(()=>{try{o(xn(Dt(Ht.direct,s)))}catch{o({})}try{u(xn(Dt(Ht.room,s)))}catch{u({})}},[s]);const m=n.useMemo(()=>({direct:r,room:f}),[r,f]),v=n.useCallback((I,S)=>{const T=Ga(S);try{Rn(Ht[I],JSON.stringify(T),s)}catch{}return T},[s]),h=n.useCallback((I,S)=>{if(I==="direct"){o(T=>v(I,S(T)));return}u(T=>v(I,S(T)))},[v]),b=n.useCallback((I,S,T)=>{const d=Cs(T);if(d===null)return!1;const _=m[I][S],M=Cs(_);return M===null?!0:d>M},[m]),i=n.useCallback((I,S,T)=>{if(!S)return;const d=T??new Date().toISOString();h(I,_=>({..._,[S]:d}))},[h]),F=n.useCallback((I,S)=>{S.length!==0&&h(I,T=>{const d={...T};for(const _ of S)_.id&&(d[_.id]=_.lastActivityAt??new Date().toISOString());return d})},[h]);return{isUnread:b,markRead:i,markAllRead:F}}const yi=["",...xs];function wi({level:s,onChange:r,defaultThinkingLevel:o="off",models:f=[],favoriteProviders:u=[],favoriteModels:m=[],agents:v=[],agentId:h,modelProvider:b,modelId:i,onChangeModel:F,disabled:I=!1}){const{t:S}=rt("app"),[T,d]=n.useState(!1),[_,M]=n.useState(()=>h&&h!==Be?"agent":"model"),Q=n.useRef(null),R=s??"",te=b&&i?`${b}/${i}`:"",V=h&&h!==Be?h:"",be=R!==""||!!te||!!V,A="chat-thinking-level-listbox";n.useEffect(()=>{if(!T)return;const N=me=>{const g=me.target;if(!(g instanceof Node))return;const k=Q.current?.contains(g),E=g instanceof Element&&!!g.closest(".model-combobox-dropdown--portal");!k&&!E&&d(!1)};return document.addEventListener("pointerdown",N),()=>document.removeEventListener("pointerdown",N)},[T]),n.useEffect(()=>{d(!1),M(V?"agent":"model")},[R,V,te]);const ie=n.useMemo(()=>v.find(N=>N.id===V),[v,V]),G=N=>N===""?S("modelSelection.thinkingDefault","Default ({{level}})",{level:o??"off"}):S(`models.options.${N}`,N==="xhigh"?"Very High":N.charAt(0).toUpperCase()+N.slice(1)),ae=N=>{d(!1),r(N)},H=N=>{const me=N.indexOf("/");me<=0||(d(!1),F?.({modelProvider:N.slice(0,me),modelId:N.slice(me+1)}))},Z=N=>{N&&(d(!1),F?.({agentId:N}))},D=N=>{N.key==="Escape"&&d(!1)},q=(N,me)=>{if(N.key==="Escape"){N.preventDefault(),d(!1);return}(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),ae(me))},Se=(N,me)=>{if(N.key==="Escape"){N.preventDefault(),d(!1);return}(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),Z(me))};return t.jsxs("div",{className:"chat-thinking-level-root",ref:Q,children:[t.jsx("button",{type:"button",className:`btn-icon chat-thinking-btn${be?" chat-thinking-btn--active":""}`,"data-testid":"chat-thinking-btn","aria-haspopup":"dialog","aria-expanded":T,"aria-controls":A,"aria-label":S("chat.thinkingLevelButton","Thinking level"),title:S("chat.thinkingLevelButton","Thinking level"),disabled:I,onClick:()=>d(N=>!N),onKeyDown:D,children:t.jsx(Ir,{size:16})}),T?t.jsxs("div",{className:"chat-thinking-popover",role:"presentation","data-testid":"chat-thinking-popover",children:[t.jsxs("section",{className:"chat-thinking-target-section","aria-label":S("chat.modelAgentSection","Model / Agent"),children:[t.jsx("div",{className:"chat-thinking-section-title",children:S("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${_==="model"?" chat-thinking-mode-btn--active":""}`,"data-testid":"chat-thinking-mode-model",onClick:()=>M("model"),children:S("chat.newChatModeModel","Model")}),t.jsx("button",{type:"button",className:`chat-thinking-mode-btn${_==="agent"?" chat-thinking-mode-btn--active":""}`,"data-testid":"chat-thinking-mode-agent",onClick:()=>M("agent"),children:S("chat.newChatModeAgent","Agent")})]}),_==="model"?t.jsxs("div",{className:"chat-thinking-model-picker","data-testid":"chat-thinking-model-picker",children:[t.jsx(Ha,{models:f,value:te,onChange:H,label:S("chat.newChatModeModel","Model"),placeholder:S("chat.selectModel","Select a model"),disabled:!F||f.length===0,favoriteProviders:u,favoriteModels:m,menuWidth:"readable"}),f.length===0?t.jsx("div",{className:"chat-thinking-empty","data-testid":"chat-thinking-model-empty",children:S("chat.noModelsAvailable","No models available")}):null]}):t.jsx("div",{className:"chat-thinking-agent-list","data-testid":"chat-thinking-agent-list",children:v.length===0?t.jsx("div",{className:"chat-thinking-empty","data-testid":"chat-thinking-agent-empty",children:S("chat.noAgentsAvailable","No agents available")}):v.map(N=>{const me=V===N.id;return t.jsxs("button",{type:"button",className:`chat-thinking-agent-item${me?" chat-thinking-agent-item--selected":""}`,"data-testid":`chat-thinking-agent-${N.id}`,"aria-pressed":me,disabled:!F,onClick:()=>Z(N.id),onKeyDown:g=>Se(g,N.id),children:[t.jsx(An,{size:16}),t.jsx("span",{className:"chat-thinking-agent-name",children:N.name||N.id}),N.role?t.jsx("span",{className:"chat-thinking-agent-role",children:N.role}):null]},N.id)})}),ie?t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-agent",children:S("chat.currentAgentTarget","Current agent: {{name}}",{name:ie.name||ie.id})}):te?t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-model",children:S("chat.currentModelTarget","Current model: {{model}}",{model:te})}):t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-default",children:S("chat.currentDefaultTarget","Using the default chat target")})]}),t.jsxs("section",{className:"chat-thinking-level-section","aria-label":S("chat.thinkingLevelButton","Thinking level"),children:[t.jsx("div",{className:"chat-thinking-section-title",children:S("chat.thinkingLevelSection","Thinking level")}),t.jsx("div",{id:A,className:"chat-thinking-popover-list",role:"listbox","aria-label":S("chat.thinkingLevelButton","Thinking level"),children:yi.map(N=>{const me=R===N;return t.jsx("button",{type:"button",role:"option","aria-selected":me,className:`chat-thinking-popover-option${me?" active":""}`,"data-testid":`chat-thinking-option-${N||"default"}`,onClick:()=>ae(N),onKeyDown:g=>q(g,N),children:G(N)},N||"default")})})]})]}):null]})}function Ta(s){return s.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function Wa(s,r){const o=r.trim();if(!o)return!0;const f=Ta(o);return Ta(s).includes(f)||s.toLowerCase().includes(o.toLowerCase())}function Ea({agents:s,filter:r,highlightedIndex:o,visible:f,onSelect:u,position:m="below",roomMemberIds:v,roomName:h}){const{t:b}=rt("app"),i=n.useMemo(()=>s.filter(_=>Wa(_.name,r)),[s,r]),F=!!v,I=F&&r.trim().length>0,S=n.useMemo(()=>F?i.filter(_=>v?.has(_.id)):i,[i,v,F]),T=n.useMemo(()=>F?i.filter(_=>!v?.has(_.id)):[],[i,v,F]),d=I?[...S,...T]:S;return f?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${m}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":b("agentMention.suggestionsLabel","Agent mention suggestions"),children:d.length===0?t.jsx("div",{className:"agent-mention-empty",children:b("agentMention.noAgentsFound","No agents found")}):t.jsxs(t.Fragment,{children:[F&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:h?b("agentMention.membersOf","Members of #{{roomName}}",{roomName:h}):b("agentMention.roomMembers","Room members")}),S.map((_,M)=>t.jsxs("button",{type:"button",className:`agent-mention-item${M===o?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${_.id}`,onMouseDown:Q=>Q.preventDefault(),onClick:()=>u(_),role:"option","aria-selected":M===o,children:[t.jsx(Nn,{agent:_,size:20}),F&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":b("agentMention.roomMemberBadge","Room member")}),t.jsx("span",{className:"agent-mention-name",children:_.name}),t.jsx("span",{className:"agent-mention-role",children:_.role})]},_.id)),F&&!I&&T.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:b("agentMention.typeToSearch","Type to search other agents")}),F&&I&&T.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:b("agentMention.otherAgents","Other agents")}),T.map((_,M)=>{const Q=S.length+M;return t.jsxs("button",{type:"button",className:`agent-mention-item${Q===o?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${_.id}`,onMouseDown:R=>R.preventDefault(),onClick:()=>u(_),role:"option","aria-selected":Q===o,children:[t.jsx(Nn,{agent:_,size:20}),t.jsx("span",{className:"agent-mention-name",children:_.name}),t.jsx("span",{className:"agent-mention-role",children:_.role})]},_.id)})]})]})}):null}function xi(s,r){return s+r}function ki({visible:s,position:r,tasks:o,files:f,selectedIndex:u,onSelectTask:m,onSelectFile:v,loading:h}){const{t:b}=rt("app");if(!s)return null;const i=o.length>0,F=f.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:r.top,left:r.left},"data-testid":"file-mention-popup",onMouseDown:I=>{I.preventDefault()},children:[h&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!h&&!i&&!F&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:b("fileMention.empty","No tasks or files found")}),!h&&(i||F)&&t.jsxs("div",{className:"file-mention-popup-groups",children:[i&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:b("fileMention.taskHeader","Tasks")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":b("fileMention.taskMatches","Task matches"),children:o.map((I,S)=>{const T=S;return t.jsxs("li",{className:`file-mention-popup-item${T===u?" file-mention-popup-item--selected":""}`,onClick:()=>m(I),role:"option","aria-selected":T===u,"data-testid":`task-mention-item-${T}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Ka,{})}),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)})})]}),F&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:b("fileMention.fileHeader","Files")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":b("fileMention.fileMatches","File matches"),children:f.map((I,S)=>{const T=xi(o.length,S),d=Fr(I.path);return t.jsxs("li",{className:`file-mention-popup-item${T===u?" file-mention-popup-item--selected":""}`,onClick:()=>v(I),role:"option","aria-selected":T===u,"data-testid":`file-mention-item-${T}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Pr,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:I.name}),d&&t.jsx("span",{className:"file-mention-popup-item-path",children:d})]})]},I.path)})})]})]})]})}function Si(s,r=[],o){const f=s.trim().replace(/^#/,""),u=(v,h)=>o?o(v,h):h;if(!f)return{ok:!1,error:u("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(f))return{ok:!1,error:u("createRoom.lowercase","Use lowercase letters only.")};const m=f.toLowerCase();return m.length>80?{ok:!1,error:u("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(m)?/^[-_]|[-_]$/.test(m)?{ok:!1,error:u("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:r.some(v=>v.toLowerCase()===m)?{ok:!1,error:u("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:m}:{ok:!1,error:u("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function Ci({isOpen:s,onClose:r,onCreate:o,projectId:f,existingRoomNames:u=[]}){const{t:m}=rt("app"),[v,h]=n.useState(""),[b,i]=n.useState([]),[F,I]=n.useState(""),[S,T]=n.useState([]),[d,_]=n.useState(!1),[M,Q]=n.useState(null),[R,te]=n.useState(!1),V=n.useRef(null),be=n.useRef(null);n.useEffect(()=>{s&&(be.current=document.activeElement instanceof HTMLElement?document.activeElement:null,_(!0),Q(null),_r(void 0,f).then(D=>i(D)).catch(()=>{i([]),Q(m("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>_(!1)))},[s,f]),n.useEffect(()=>{if(!s){h(""),I(""),T([]),Q(null),te(!1);return}const D=window.requestAnimationFrame(()=>V.current?.focus());return()=>window.cancelAnimationFrame(D)},[s]),n.useEffect(()=>{if(!s)return;const D=q=>{q.key==="Escape"&&r()};return document.addEventListener("keydown",D),()=>document.removeEventListener("keydown",D)},[s,r]),n.useEffect(()=>{s||be.current?.focus()},[s]);const A=n.useMemo(()=>Si(v,u,m),[v,u,m]),ie=n.useMemo(()=>{const D=F.trim().toLowerCase();return D?b.filter(q=>q.name.toLowerCase().includes(D)):b},[b,F]),G=n.useMemo(()=>b.filter(D=>S.includes(D.id)),[b,S]),ae=A.ok&&S.length>0&&!R&&!d;if(!s)return null;const H=D=>{R||T(q=>q.includes(D)?q.filter(Se=>Se!==D):[...q,D])},Z=async()=>{if(!A.ok){Q(A.error);return}if(S.length===0){Q(m("createRoom.selectMember","Select at least one member."));return}Q(null),te(!0);try{await o({name:A.name,displayName:`#${A.name}`,memberAgentIds:S}),r()}catch(D){Q(D instanceof Error?D.message:m("createRoom.failedCreate","Failed to create room."))}finally{te(!1)}};return gr.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:D=>D.target===D.currentTarget&&r(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":m("createRoom.title","Create room"),onClick:D=>D.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:r,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:V,id:"create-room-name",className:"input",value:v,disabled:R,onChange:D=>{const q=D.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();h(q)}})]}),!A.ok&&t.jsx("div",{className:"form-error",children:A.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:F,disabled:R,onChange:D=>I(D.target.value)})]}),G.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:G.map(D=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>H(D.id),disabled:R,children:[D.name," ×"]},D.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:d?t.jsx("div",{className:"create-room-modal-empty",children:t.jsx($r,{label:m("createRoom.loadingAgents","Loading agents...")})}):ie.length===0?t.jsx("div",{className:"create-room-modal-empty",children:b.length===0?m("createRoom.noAgents","No agents in this project yet."):m("createRoom.noMatch","No agents match your search.")}):ie.map(D=>{const q=S.includes(D.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${q?" create-room-modal-member-row--selected":""}`,onClick:()=>H(D.id),disabled:R,children:[t.jsx(Nn,{agent:D,size:20}),t.jsx("span",{children:D.name}),t.jsx("span",{className:"create-room-modal-member-role",children:D.role})]},D.id)})}),M&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:M})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:R,children:m("actions.cancel","Cancel")}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void Z(),disabled:!ae,children:R?m("createRoom.creating","Creating..."):m("createRoom.create","Create room")})]})]})}),document.body)}function Mi({cliSessionId:s,tier:r,projectId:o,renderTranscript:f,renderComposer:u,queuedCount:m=0,terminalProps:v}){const{t:h}=rt("app"),b=r==="generic",[i,F]=n.useState(b?"terminal":"transcript");if(b)return t.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:t.jsx(Sa,{sessionId:s,projectId:o,...v})});const I=i==="terminal";return t.jsxs("div",{className:"cli-chat-surface","data-tier":r,"data-view":i,children:[t.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":h("cliChat.viewToggleLabel","Chat view"),children:[t.jsxs("button",{type:"button",role:"tab","aria-selected":!I,className:`cli-chat-surface__tab${I?"":" is-active"}`,onClick:()=>F("transcript"),children:[t.jsx(Cn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:h("cliChat.transcriptTab","Transcript")})]}),t.jsxs("button",{type:"button",role:"tab","aria-selected":I,className:`cli-chat-surface__tab${I?" is-active":""}`,onClick:()=>F("terminal"),children:[t.jsx(Or,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:h("cliChat.terminalTab","Terminal")})]})]}),t.jsx("div",{className:"cli-chat-surface__body",children:I?t.jsx(Sa,{sessionId:s,projectId:o,...v}):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:h("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:m})}),u()]})]})}const Ri=200,Ai=8,Ni=8;function ja(){return new DOMException("The operation was aborted.","AbortError")}function Da(s,r){return r.aborted?Promise.reject(ja()):new Promise((o,f)=>{const u=()=>f(ja());r.addEventListener("abort",u,{once:!0}),s.then(m=>{r.removeEventListener("abort",u),o(m)},m=>{r.removeEventListener("abort",u),f(m)})})}function La(s,r,o){const f=s.slice(0,r),u=s.slice(r+1),m=u.match(/[\s]|$/),v=m?m.index??u.length:u.length,h=u.slice(v);return`${f}${o}${h}`}function Ti(s={}){const{projectId:r,workspace:o="project"}=s,[f,u]=n.useState(!1),[m,v]=n.useState(""),[h,b]=n.useState(-1),[i,F]=n.useState([]),[I,S]=n.useState([]),[T,d]=n.useState(!1),[_,M]=n.useState(0),Q=n.useRef(null),R=n.useRef(null),te=[...i.map(H=>({kind:"task",task:H})),...I.map(H=>({kind:"file",file:H}))];n.useEffect(()=>()=>{Q.current&&clearTimeout(Q.current),R.current?.abort()},[]);const V=n.useCallback((H,Z)=>{if(Z<0||Z>H.length){u(!1);return}const D=q=>/[a-zA-Z0-9/_.-]/.test(q);for(let q=Z-1;q>=0;q--){if(H[q]==="#"){if(q===0){const N=H.slice(q+1,Z);b(q),v(N),M(0),u(!0);return}const Se=H[q-1];if(/[\s,.;:!?'"()[\]{}]/.test(Se)){const N=H.slice(q+1,Z);b(q),v(N),M(0),u(!0);return}u(!1);return}if(!D(H[q])){u(!1);return}}u(!1)},[]),be=n.useCallback(()=>{R.current?.abort(),u(!1),v(""),b(-1),F([]),S([]),M(0),d(!1)},[]),A=n.useCallback(async H=>{if(!H.trim()){F([]),S([]),d(!1);return}R.current?.abort();const Z=new AbortController;R.current=Z;try{d(!0);const[D,q]=await Promise.allSettled([Da(Br(20,0,r,H),Z.signal),Da(zr(H,o,r),Z.signal)]);if(Z.signal.aborted)return;const Se=D.status==="fulfilled"?D.value.slice(0,Ai).map(me=>({id:me.id,title:me.title??"",column:me.column})):[],N=q.status==="fulfilled"?q.value.files.slice(0,Ni):[];F(Se),S(N),M(0)}catch(D){D.name!=="AbortError"&&(F([]),S([]))}finally{Z.signal.aborted||d(!1)}},[o,r]);n.useEffect(()=>{if(f)return Q.current&&clearTimeout(Q.current),Q.current=setTimeout(()=>{A(m)},Ri),()=>{Q.current&&clearTimeout(Q.current)}},[m,f,A]);const ie=n.useCallback((H,Z)=>!f||h<0?Z:La(Z,h,`#${H.id}`),[f,h]),G=n.useCallback((H,Z)=>!f||h<0?Z:La(Z,h,`#${H.path}`),[f,h]),ae=n.useCallback((H,Z)=>{if(!f||te.length===0)return!1;switch(H.key){case"ArrowDown":return H.preventDefault(),M(D=>Math.min(D+1,te.length-1)),!0;case"ArrowUp":return H.preventDefault(),M(D=>Math.max(D-1,0)),!0;case"Enter":case"Tab":return te[_]?(H.preventDefault(),!0):!1;case"Escape":return H.preventDefault(),be(),!0;default:return!1}},[f,te,_,be]);return{mentionActive:f,tasks:i,files:I,combinedItems:te,loading:T,mentionQuery:m,selectedIndex:_,setSelectedIndex:M,detectMention:V,selectTask:ie,selectFile:G,dismissMention:be,handleKeyDown:ae}}const ps=new Map,Mn=new Map;function Ns(s){return s??"global"}function Ms(s){return`${mt.DISCOVERED_SKILLS_PREFIX}${Ns(s)}`}function Et(s){return at(Ms(s),{maxAgeMs:ws})}function Ei(s,r){for(const o of Mn.get(s)??[])o(r)}async function ji(s){const r=Ns(s),o=ps.get(r);if(o)return o;const f=Hr(s).finally(()=>{ps.delete(r)});return ps.set(r,f),f}function Di(s){const[r,o]=n.useState(()=>Et(s)??[]),[f,u]=n.useState(()=>Et(s)===null),m=n.useRef(Et(s)!==null),v=Ns(s);n.useEffect(()=>{const i=Et(s)??[];o(i),u(Et(s)===null),m.current=Et(s)!==null},[s]),n.useEffect(()=>{const i=Mn.get(v)??new Set;return i.add(o),Mn.set(v,i),()=>{i.delete(o),i.size===0&&Mn.delete(v)}},[v]);const h=n.useCallback(async()=>{try{const i=await ji(s);m.current=!0,ue(Ms(s),i,{maxBytes:5e5}),Ei(v,i)}catch{m.current||Ut(Ms(s))}finally{u(!1)}},[s,v]);n.useEffect(()=>{h()},[h]);const b=n.useCallback(async()=>{u(!0),await h()},[h]);return{skills:r,loading:f,refresh:b}}function Li(s,r){const o=s.reduce((f,u)=>f+(u.content?.length??0),0)+(r?.length??0);return Math.ceil(o/4)}function Ia(s){if(!Number.isFinite(s)||s<=0)return"0";if(s<1e3)return String(Math.round(s));const r=s/1e3;return r<10?`~${Number(r.toFixed(1))}k`:`${Math.round(r)}k`}const Ts=640,Ii=200,Fa="__SKIP__";let vs=!1;function Fi(s,r=Ts){return s>r?"auto":"hidden"}function Pi(s,r=Ts){return Math.max(40,Math.min(s,r))}function _i(s,r){const o=new Date(s),u=new Date().getTime()-o.getTime(),m=Math.floor(u/1e3),v=Math.floor(m/60),h=Math.floor(v/60),b=Math.floor(h/24);return m<60?r("chat.relativeTimeJustNow","just now"):v<60?r("chat.relativeTimeMinutes","{{count}}m ago",{count:v}):h<24?r("chat.relativeTimeHours","{{count}}h ago",{count:h}):b<7?r("chat.relativeTimeDays","{{count}}d ago",{count:b}):o.toLocaleDateString()}const $i=280,kn=180,Sn=500,Pa="fusion:chat-sidebar-width",bs="fusion:chat-scope",Oi="fusion:chat-draft:";function _a(s,r){return s.slice(r+1).find(o=>o.role==="user")?.content}function $a(s,r){return r?`${Oi}${s}:${r}`:null}function Oa(s){if(!s)return"";try{return localStorage.getItem(s)??""}catch{return""}}const Bi=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"],ys=ai;function zi(s,r){const o=s.slice(0,r),f=/(^|[\s\n])@([\w-]*)$/.exec(o);if(!f)return null;const u=f[2]??"",m=o.length-u.length-1;return{filter:u,start:m,end:r}}function Hi(s){const r=s?.runtimeConfig;if(!r||typeof r!="object")return null;const o=Reflect.get(r,"modelProvider"),f=Reflect.get(r,"modelId");return typeof o!="string"||o.trim().length===0||typeof f!="string"||f.trim().length===0?null:{provider:o,modelId:f}}function Ba(s,r,o){if(s?.modelProvider&&s?.modelId)return{provider:s.modelProvider,modelId:s.modelId};const f=Hi(r??void 0);return f||(o.provider&&o.modelId?{provider:o.provider,modelId:o.modelId}:null)}function Ui({projectId:s,defaultModel:r,defaultKind:o,defaultAgentId:f,defaultThinkingLevel:u,defaultSelectedThinkingLevel:m,onClose:v,onCreate:h}){const{t:b}=rt("app"),[i,F]=n.useState(o??"agent"),{agents:I,loading:S}=Rs(s),[T,d]=n.useState(f??""),{models:_,favoriteProviders:M,favoriteModels:Q,loading:R,refresh:te}=Ua(),V=r.provider&&r.modelId?`${r.provider}/${r.modelId}`:"",[be,A]=n.useState(V),[ie,G]=n.useState(m??""),[ae,H]=n.useState(M),[Z,D]=n.useState(Q);n.useEffect(()=>{H(M)},[M]),n.useEffect(()=>{D(Q)},[Q]),n.useEffect(()=>{o&&F(o)},[o]),n.useEffect(()=>{f&&d(k=>k||f)},[f]),n.useEffect(()=>{V&&A(k=>k||V)},[V]),n.useEffect(()=>{m&&G(k=>k||m)},[m]);const q=n.useCallback(async k=>{const E=ae,B=E.includes(k)?E.filter(z=>z!==k):[k,...E];H(B);try{await ka({favoriteProviders:B,favoriteModels:Z}),await te()}catch{H(E)}},[ae,Z,te]),Se=n.useCallback(async k=>{const E=Z,B=E.includes(k)?E.filter(z=>z!==k):[k,...E];D(B);try{await ka({favoriteProviders:ae,favoriteModels:B}),await te()}catch{D(E)}},[Z,ae,te]),N=be||V,me=k=>{if(k.preventDefault(),i==="agent"){if(!T)return;h({agentId:T});return}if(!N)return;const E=N.indexOf("/");if(E<=0)return;const p=N.slice(0,E),B=N.slice(E+1);h({agentId:Be,modelProvider:p,modelId:B,thinkingLevel:ie||void 0})},g=i==="agent"?!T:!N;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:v,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:k=>k.stopPropagation(),children:[t.jsx("h3",{children:b("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${i==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{F("agent")},children:b("chat.newChatModeAgent","Agent")}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${i==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{F("model"),d(""),A(k=>k||V)},children:b("chat.newChatModeModel","Model")})]}),t.jsxs("form",{onSubmit:me,children:[i==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:[b("chat.newChatModeAgent","Agent"),S?t.jsx("div",{className:"chat-new-dialog-loading",children:b("chat.loadingAgents","Loading agents...")}):I.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:b("chat.noAgentsAvailable","No agents available")}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:I.map(k=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${T===k.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>d(k.id),"data-testid":`agent-option-${k.id}`,children:[t.jsx(An,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:k.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:k.role})]},k.id))})]}),i==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:R?t.jsx("div",{className:"chat-new-dialog-loading",children:b("chat.loadingModels","Loading models...")}):t.jsx(Ha,{models:_,value:be,onChange:A,label:b("chat.newChatModeModel","Model"),placeholder:b("chat.selectModel","Select a model"),favoriteProviders:ae,onToggleFavorite:q,favoriteModels:Z,onToggleModelFavorite:Se,showThinkingLevel:!0,thinkingLevel:ie,onThinkingLevelChange:G,defaultThinkingLevel:u??"off"})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:v,children:b("chat.cancel","Cancel")}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:g,children:b("chat.create","Create")})]})]})]})})}function Ji({projectId:s,addToast:r,floating:o=!1,compactLayout:f=!1,onPopOut:u,onMaximize:m,onMinimize:v,onClose:h,chatCommandContext:b}){const{t:i}=rt("app");n.useEffect(()=>(Kt({view:"ChatView",trigger:vs?"route-active":"remount",projectId:s,replayAttempted:!1}),vs=!1,()=>{vs=!0,Kt({view:"ChatView",trigger:"route-inactive",projectId:s,replayAttempted:!1})}),[s]);const[F,I]=n.useState(null);n.useEffect(()=>{let e=!1;return I(null),Ur(s).then(a=>{e||I(a)}).catch(()=>{e||I(null)}),()=>{e=!0}},[s]);const S=F?.defaultThinkingLevel??"off",T=n.useMemo(()=>F?.chatDefaultKind==="agent"&&F.chatDefaultAgentId?{kind:"agent",agentId:F.chatDefaultAgentId}:F?.chatDefaultKind==="model"&&F.chatDefaultModelProvider&&F.chatDefaultModelId?{kind:"model",modelProvider:F.chatDefaultModelProvider,modelId:F.chatDefaultModelId,thinkingLevel:F.chatDefaultThinkingLevel}:null,[F]),{activeSession:d,sessionsLoading:_,messages:M,messagesLoading:Q,isStreaming:R,streamingText:te,streamingThinking:V,streamingToolCalls:be,selectSession:A,createSession:ie,archiveSession:G,renameSession:ae,setSessionModel:H,setSessionThinkingLevel:Z,deleteSession:D,sendMessage:q,editMessageAndResend:Se,stopStreaming:N,pendingMessages:me,clearPendingMessage:g,loadMoreMessages:k,hasMoreMessages:E,searchQuery:p,setSearchQuery:B,filteredSessions:z,agentsMap:ce}=fi(s,r),[ne,fe]=n.useState(!1),Y=!0,[U,ge]=n.useState(()=>{try{if(localStorage.getItem(bs)==="rooms"&&Y)return"rooms"}catch{}return"direct"}),C=vi(s,r),{isUnread:ye,markRead:Re}=bi(s),[le,Ee]=n.useState(()=>{const e=$a(U,U==="rooms"?C.activeRoom?.id:d?.id);return Oa(e)}),[je,ve]=n.useState(null),[ze,ht]=n.useState(null),[we,ft]=n.useState(""),[xe,_e]=n.useState(null),[Vt,gt]=n.useState(null),[it,He]=n.useState(!0),[Je,Lt]=n.useState($i),[Tn,pt]=n.useState(!1),{agentsMap:It}=Rs(s),De=n.useMemo(()=>ce.size>0?ce:It,[It,ce]),{models:vt,favoriteProviders:bt,favoriteModels:En,defaultProvider:Ze,defaultModelId:Gt}=Ua(),l=n.useMemo(()=>({provider:Ze,modelId:Gt}),[Gt,Ze]),y=n.useMemo(()=>T?.kind==="model"?{provider:T.modelProvider,modelId:T.modelId}:l,[T,l]),{skills:x,loading:j}=Di(s),[K,L]=n.useState(!1),[O,P]=n.useState(""),[X,ee]=n.useState(0),[W,J]=n.useState(""),[se,de]=n.useState(!1),[Pe,Ue]=n.useState(0),[yt,Ie]=n.useState(-1),[Fe,jn]=n.useState([]),[Es,wt]=n.useState(!1),[js,Wt]=n.useState(!1),[xt,Ds]=n.useState({}),[qt,et]=n.useState(!1),[Xt,Ft]=n.useState(!1),{pushNav:Ls}=Kr(),[,Qt]=n.useState(!1),[qa,Xa]=n.useState({top:0,left:0}),he=Ti({projectId:s}),Dn=n.useCallback(e=>{if(!e||!he.mentionActive)return;const a=e.getBoundingClientRect();Xa({top:a.top-260,left:a.left+8})},[he.mentionActive]),Is=n.useRef(null),Fs=n.useRef(null),Ps=n.useRef(null),_s=n.useRef(null),Ne=n.useRef(!1),Yt=n.useRef(null),$s=n.useRef(null),tt=n.useRef(null),Jt=n.useRef(0),Ln=n.useRef(null),Pt=n.useRef(null),Ke=n.useRef(null),Ae=n.useRef(null),In=n.useRef(null),kt=n.useRef(null),[Fn,Qa]=n.useState(()=>new Set),Zt=n.useRef(!1),Ve=n.useRef(null),Ge=n.useRef(null),Ce=n.useRef(null),en=n.useRef(null),Os=n.useRef([]),St=n.useRef(0),_t=n.useRef(new Map),Pn=n.useRef(!1),tn=Vr(),ot=tn==="mobile",_n=tn==="tablet",Bs=n.useRef(null),[Ya,zs]=n.useState(!1);n.useLayoutEffect(()=>{if(!o){zs(!1);return}const e=Bs.current;if(!e||typeof ResizeObserver>"u")return;const a=()=>{zs(e.getBoundingClientRect().width<=768)};a();const c=new ResizeObserver(a);return c.observe(e),()=>c.disconnect()},[o]);const oe=ot||Ya||f;n.useEffect(()=>{d?.id&&Re("direct",d.id,d.lastMessageAt??d.updatedAt)},[d?.id,d?.lastMessageAt,d?.updatedAt,Re]),n.useEffect(()=>{C.activeRoom?.id&&Re("room",C.activeRoom.id,C.activeRoom.updatedAt)},[C.activeRoom?.id,C.activeRoom?.updatedAt,Re]),n.useEffect(()=>{if(!d?.id||M.length===0)return;const e=M[M.length-1];Re("direct",d.id,e?.createdAt??d.lastMessageAt??d.updatedAt)},[d?.id,d?.lastMessageAt,d?.updatedAt,Re,M]),n.useEffect(()=>{if(!C.activeRoom?.id||C.messages.length===0)return;const e=C.messages[C.messages.length-1];Re("room",C.activeRoom.id,e?.createdAt??C.activeRoom.updatedAt)},[Re,C.activeRoom?.id,C.activeRoom?.updatedAt,C.messages]),n.useEffect(()=>{try{const e=localStorage.getItem(Pa);if(!e)return;const a=Number.parseInt(e,10);if(Number.isNaN(a))return;const c=Math.max(kn,Math.min(Sn,a));Lt(c)}catch{}},[]),n.useEffect(()=>{try{const e=localStorage.getItem(bs);if(e==="direct"){ge("direct");return}e==="rooms"&&Y&&ge("rooms")}catch{}},[Y]),n.useEffect(()=>{try{localStorage.setItem(bs,U)}catch{}},[Y,U]);const Le=$a(U,U==="rooms"?C.activeRoom?.id:d?.id),$n=n.useRef(Le);n.useEffect(()=>{Le!==$n.current&&($n.current=Le,Ee(Oa(Le)))},[Le]),n.useEffect(()=>{if(!(!Le||$n.current!==Le))try{if(le){localStorage.setItem(Le,le);return}localStorage.removeItem(Le)}catch{}},[Le,le]);const ke=U==="rooms"&&!!C.activeRoom,{keyboardOverlap:Hs,keyboardOpen:nn}=Gr({enabled:(oe||_n)&&(!!d||ke),allowNonMobileViewport:_n}),$t=_n&&nn,sn=n.useMemo(()=>{const e=O.trim().toLowerCase();return(e?x.filter(c=>c.name.toLowerCase().includes(e)):x).slice(0,10)},[x,O]),On=n.useMemo(()=>b?Wr(O,xa):[],[b,O]),$e=n.useMemo(()=>{const e=On.map(c=>({kind:"command",command:c,disabled:!b?.agentRunning})),a=sn.map(c=>({kind:"skill",skill:c}));return[...e,...a]},[On,sn,b]),Ct=n.useMemo(()=>Array.from(De.values()),[De]),We=n.useMemo(()=>U!=="rooms"||!C.activeRoom?null:{roomId:C.activeRoom.id,roomName:C.activeRoom.name,memberIds:new Set(C.activeRoomMembers.map(e=>e.agentId))},[Y,U,C.activeRoom,C.activeRoomMembers]),ct=n.useMemo(()=>{const e=Ct.filter(w=>Wa(w.name,W));if(!We)return e;const a=e.filter(w=>We.memberIds.has(w.id));if(W.trim().length===0)return a;const c=e.filter(w=>!We.memberIds.has(w.id));return[...a,...c]},[Ct,W,We]),Bn=n.useMemo(()=>{const e=new Map;for(const a of Ct)e.set(a.name.toLowerCase(),a);return e},[Ct]),Ja=n.useMemo(()=>sn.map(e=>e.id).join("\0"),[sn]);n.useEffect(()=>{ee(0)},[Ja]),n.useEffect(()=>{Ue(0)},[W,se]),n.useEffect(()=>()=>{Ke.current!==null&&window.clearTimeout(Ke.current)},[]),n.useEffect(()=>{const e=Fs.current;if(!e||!E||Q)return;const a=new IntersectionObserver(c=>{c[0].isIntersecting&&k()},{threshold:.1});return a.observe(e),()=>a.disconnect()},[E,Q,k]);const Mt=n.useCallback(()=>ke?C.activeRoom?.id??null:d?.id??null,[ke,C.activeRoom?.id,d?.id]),Us=n.useCallback((e,a)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(a)}"]`):e.querySelector(`.chat-message[data-message-id="${a.replace(/"/g,'\\"')}"]`),[]),Ks=n.useCallback(()=>{const e=Ae.current;if(!e)return;const a=e.getBoundingClientRect().top,c=new Set;e.querySelectorAll(".chat-message--assistant:not(.chat-message--failure)[data-message-id]").forEach(w=>{const $=w.getAttribute("data-message-id");$&&w.getBoundingClientRect().top<a&&c.add($)}),Qa(w=>w.size===c.size&&Array.from(w).every($=>c.has($))?w:c)},[]),an=n.useCallback(()=>{!Ae.current||kt.current!==null||(kt.current=window.requestAnimationFrame(()=>{kt.current=null,Ks()}))},[Ks]),rn=n.useCallback(()=>{const e=Ae.current,a=Mt();if(!e||!a)return;const c=e.scrollTop,w=e.querySelectorAll(".chat-message[data-message-id]"),$=Array.from(w).find(Me=>Me.offsetTop+Me.offsetHeight>=c)??w[0]??null,re=$?.getAttribute("data-message-id")??null,pe=$?$.offsetTop-c:0;Pt.current={threadId:a,scrollTop:c,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:re,anchorOffset:pe,wasPinnedBefore:!Ne.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[Mt]),Vs=n.useCallback(()=>{const e=Ae.current;if(!e)return;const c=e.scrollTop+e.clientHeight>=e.scrollHeight-50;Wt(!c),Ne.current=!c,rn(),an()},[rn,an]),qe=n.useCallback((e,a)=>{if(!e.isConnected||!a?.force&&Ne.current)return;let c=0,w=0,$=-1;const re=6,pe=()=>{if(e.isConnected&&!(!a?.force&&Ne.current)){if(e.scrollTop=e.scrollHeight,e.scrollHeight===$?w+=1:(w=0,$=e.scrollHeight),c+=1,c>=re||w>=2){Wt(!1),Ne.current=!1;return}window.requestAnimationFrame(pe)}};pe()},[]),Rt=ke?C.messages:M;n.useLayoutEffect(()=>(an(),()=>{kt.current!==null&&(window.cancelAnimationFrame(kt.current),kt.current=null)}),[Rt,an]),n.useLayoutEffect(()=>{const e=Ae.current,a=Mt(),c=Pt.current;if(!e||!a||!c||c.threadId!==a||c.wasPinnedBefore)return;const w=(typeof performance<"u"?performance.now():Date.now())-c.capturedAtMs,$=e.scrollHeight>e.clientHeight,re=w>3e3,pe=c.scrollTop<=0&&c.anchorOffset<=0&&$;if(!Ne.current||re||pe){Pt.current=null;return}let Me=c.scrollTop;if(c.anchorMessageId){const Qe=Us(e,c.anchorMessageId);Qe?Me=Qe.offsetTop-c.anchorOffset:Me=c.scrollTop+(e.scrollHeight-c.scrollHeight)}else Me=c.scrollTop+(e.scrollHeight-c.scrollHeight);e.scrollTop=Math.max(0,Me),Ne.current=!0,Wt(!0),Pt.current=null},[Rt,Mt,Us]);const zn=n.useCallback(e=>{},[Rt.length,ke]),Oe=n.useCallback(e=>{zn(e);const a=Ae.current;a&&(Pt.current=null,Ne.current=!1,qe(a))},[qe,zn]);n.useLayoutEffect(()=>{tt.current!==null&&(window.clearTimeout(tt.current),tt.current=null);const e=ke?C.activeRoom?.id??null:d?.id??null;if(!e){Yt.current=null;return}const a={threadId:e,loaded:ke?!C.messagesLoading:!Q,hasMessages:ke?C.messages.length>0:M.length>0},c=Yt.current,w=c?.threadId!==e,$=c?.threadId===e&&!c.loaded&&a.loaded,re=c?.threadId===e&&!c.hasMessages&&a.hasMessages;if(!(c===null||w||$||re))return;const Me=Ae.current;if(Me)return zn(w?"thread-change":$?"finished-loading":re?"first-messages":"mount"),qe(Me,{force:!0}),ke||(tt.current=window.setTimeout(()=>{if(tt.current=null,Ne.current)return;const Qe=Ae.current;Qe&&qe(Qe)},250)),Yt.current=a,()=>{tt.current!==null&&(window.clearTimeout(tt.current),tt.current=null)}},[ke,C.activeRoom?.id,C.messages.length,C.messagesLoading,d?.id,M.length,Q,qe]),n.useEffect(()=>{!R||Ne.current||Oe("streaming")},[R,te,V,Oe]),n.useEffect(()=>{const e=Mt();if(!e){Jt.current=0,Ln.current=null;return}if(Ln.current!==e){Ln.current=e,Jt.current=Rt.length;return}const a=Jt.current,c=Rt.length,w=c>a,$=!Ne.current;Jt.current=c,w&&$&&Oe("new-message")},[Rt,Mt,Oe]),n.useEffect(()=>{Hs<=0||!Ae.current||Oe("keyboard")},[Hs,Oe]),qr(ot&&nn),n.useLayoutEffect(()=>{if(!ot||!d&&!ke||typeof window>"u")return;const e=In.current,a=window.visualViewport;if(!e||!a)return;const c=$=>{if(!($ instanceof HTMLElement))return!1;if($.tagName==="TEXTAREA")return!0;if($.tagName!=="INPUT")return!1;const re=$.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(re)},w=()=>{if(Zt.current){e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange="";return}const $=Math.max(0,window.innerHeight-a.offsetTop-a.height),re=a.offsetTop||0;e.style.setProperty("--vv-height",`${a.height}px`),e.style.setProperty("--vv-offset-top",`${re}px`),e.style.setProperty("--keyboard-overlap",`${$}px`);const pe=($>0||re>0)&&c(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",pe),e.style.setProperty("--chat-keyboard-accessory-clearance",pe&&us()?"calc(var(--space-2xl) + var(--space-md))":"0px"),pe&&re>0?(e.style.transform=`translateY(${re}px)`,e.style.willChange="transform"):(e.style.transform="",e.style.willChange="")};return w(),a.addEventListener("resize",w),a.addEventListener("scroll",w),document.addEventListener("focusin",w),document.addEventListener("focusout",w),window.addEventListener("pageshow",w),document.addEventListener("visibilitychange",w),()=>{a.removeEventListener("resize",w),a.removeEventListener("scroll",w),document.removeEventListener("focusin",w),document.removeEventListener("focusout",w),window.removeEventListener("pageshow",w),document.removeEventListener("visibilitychange",w),e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange=""}},[d,ot,ke]),n.useEffect(()=>{const e=()=>ve(null);if(je)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[je]),n.useEffect(()=>{if(!ot||!nn)return;const e=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[ot,nn]),n.useEffect(()=>{const e=$s.current;if($s.current=U,U==="rooms"&&!C.activeRoom){Yt.current=null;return}if(!(U==="direct"&&(e===null||e==="rooms"))&&!(U==="rooms"&&(e===null||e==="direct")))return;const w=Ae.current;w&&(qe(w,{force:!0}),Ne.current=!1,Wt(!1))},[U,C.activeRoom,qe]),n.useEffect(()=>{if(!d&&!ke||ke&&!oe)return;const e=()=>{const c=!Ne.current;rn(),c&&oe&&Ae.current&&Oe("visibility-restore")},a=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",a),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pageshow",e)}},[oe,ot,d,ke,rn,Oe]),n.useEffect(()=>{if(ke||typeof ResizeObserver>"u")return;const e=Ae.current;if(!e)return;const a=new ResizeObserver(()=>{Ne.current||qe(e)});return a.observe(e),()=>{a.disconnect()}},[ke,qe,d?.id,U]),n.useEffect(()=>{Os.current=Fe},[Fe]),n.useEffect(()=>()=>{for(const e of Os.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of _t.current.values())window.clearTimeout(e);_t.current.clear()},[]);const At=n.useCallback(e=>{if(!e||e.length===0)return;const a=[];for(const c of Array.from(e)){if(!Bi.includes(c.type))continue;const w=c.type.startsWith("image/");a.push({file:c,previewUrl:w?URL.createObjectURL(c):""})}a.length>0&&jn(c=>[...c,...a])},[]),Gs=n.useCallback(e=>{jn(a=>{const c=a[e];return c?.previewUrl&&URL.revokeObjectURL(c.previewUrl),a.filter((w,$)=>$!==e)})},[]),Ws=n.useCallback(e=>{const a=e.clipboardData?.files;if(!a||a.length===0)return;const c=Array.from(a).filter(w=>w.type.startsWith("image/"));c.length!==0&&At(c)},[At]),on=n.useCallback(async e=>{try{await ie(e),fe(!1),oe&&He(!1)}catch{r(i("chat.failedToCreateSession","Failed to create chat session"),"error")}},[ie,r,oe,i]),cn=n.useCallback(()=>{if(F?.chatNewSessionMode==="always-default"&&T){if(T.kind==="agent"){on({agentId:T.agentId});return}on({agentId:Be,modelProvider:T.modelProvider,modelId:T.modelId,thinkingLevel:T.thinkingLevel});return}fe(!0)},[T,F?.chatNewSessionMode,on]),Te=n.useCallback(e=>{const a=e??Ce.current;if(!a)return;const c=tn==="tablet"?Ii:Ts;a.style.height="auto",a.style.height=`${Pi(a.scrollHeight,c)}px`,a.style.overflowY=Fi(a.scrollHeight,c)},[tn]),qs=n.useCallback(e=>{Ce.current=e,e&&Te(e)},[Te]);n.useLayoutEffect(()=>{Te()},[U,le,d?.id,C.activeRoom?.id,Te]);const lt=n.useCallback(()=>{if(Ee(""),Le)try{localStorage.removeItem(Le)}catch{}L(!1),P(""),de(!1),J(""),Ie(-1),jn(e=>{for(const a of e)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[Le]),Hn=n.useCallback(()=>{const e=le.trim(),a=Fe.map(c=>c.file);if(!(!e&&a.length===0||!d)){if(b){const c=Xr(e,xa);if(c){if(!b.agentRunning){r(i("chat.commandNoRunningAgent","No running agent to steer"),"warning");return}if(a.length>0){r(i("chat.commandNoAttachments","Attachments aren't supported with commands — remove them before sending"),"warning");return}lt(),c.command.run({taskId:b.taskId,projectId:b.projectId,remainder:c.remainder}).then(()=>{r(i("chat.commandSteerSuccess","Sent to the running agent"),"success")}).catch(w=>{const $=w instanceof Error&&w.message.trim()?w.message:i("chat.commandSteerFailed","Failed to send to the running agent");r($,"error")});return}}if(e==="/clear"||e==="/new"){lt(),g(),N(),ie({agentId:d.agentId,modelProvider:d.modelProvider??void 0,modelId:d.modelId??void 0,thinkingLevel:d.thinkingLevel??void 0}).catch(()=>{r(i("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}lt(),q(e,a)}},[le,Fe,d,lt,N,g,ie,r,q,b,i]),Un=n.useCallback(async()=>{const e=le.trim(),a=Fe.map(c=>c.file);if(!(!e&&a.length===0)){if(U==="rooms"){if(!C.activeRoom)return;if(e==="/clear"||e==="/new"){lt();try{await C.clearRoom(C.activeRoom.id)}catch{r(i("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(Pn.current)return;Pn.current=!0;const c=le;lt();try{await C.sendRoomMessage(e,{files:a})}catch(w){if(w instanceof Va){const re=w.message.trim()?w.message:i("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");r(i("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:re}),"error");return}Ee(c);const $=w instanceof Error&&w.message.trim()?w.message:i("chat.failedToSendRoomMessage","Failed to send room message");r($,"error")}finally{Pn.current=!1}return}Hn()}},[le,Fe,Y,U,C,C.clearRoom,lt,r,Hn]),ln=n.useCallback(async e=>{if(U==="rooms"){if(!C.activeRoom)return;try{await C.sendRoomMessage(e)}catch(a){const c=a instanceof Error&&a.message.trim()?a.message:i("chat.failedToSendRoomMessage","Failed to send room message");r(c,"error")}return}d&&q(e)},[d,r,Y,U,C,q,i]),Kn=n.useCallback(e=>{Ee(a=>{const c=ys(a);if(!c)return a;const w=`/skill:${e.name} `,$=a.slice(0,c.start)+w+a.slice(c.end);return window.requestAnimationFrame(()=>{Ce.current&&(Te(Ce.current),Ce.current.focus())}),$}),L(!1),P(""),ee(0)},[Te]),Vn=n.useCallback((e,a)=>{if(a){r(i("chat.commandNoRunningAgent","No running agent to steer"),"warning");return}Ee(c=>{const w=ys(c);if(!w)return c;const $=`${e.trigger} `,re=c.slice(0,w.start)+$+c.slice(w.end);return window.requestAnimationFrame(()=>{Ce.current&&(Te(Ce.current),Ce.current.focus())}),re}),L(!1),P(""),ee(0)},[Te,r,i]),dn=n.useCallback(e=>{const a=Ce.current;if(!a||yt<0)return;const c=a.selectionStart??St.current,w=a.selectionEnd??c,$=Math.max(c,w),re=Math.min(yt,$),Me=`${`@${e.name.replace(/\s+/g,"_")}`} `,Qe=le.slice(0,re)+Me+le.slice($),Nt=re+Me.length;Ee(Qe),de(!1),J(""),Ue(0),Ie(-1),window.requestAnimationFrame(()=>{Ce.current&&(Te(Ce.current),Ce.current.focus(),Ce.current.setSelectionRange(Nt,Nt))})},[yt,le,Te]),Ot=n.useCallback((e,a)=>{const w=Ce.current?.selectionStart??St.current,$=le.lastIndexOf("#",w),re=$>=0?$+a.length:e.length;Ee(e),he.dismissMention(),Qt(!1),window.requestAnimationFrame(()=>{Ce.current&&(Te(Ce.current),Ce.current.focus(),Ce.current.setSelectionRange(re,re))})},[he,le,Te]),Xs=n.useCallback(e=>{if(St.current=e.currentTarget.selectionStart??St.current,he.mentionActive&&he.combinedItems.length>0){if(he.handleKeyDown(e,le),e.key==="Enter"||e.key==="Tab"){const a=he.combinedItems[he.selectedIndex];a?.kind==="task"?Ot(he.selectTask(a.task,le),`#${a.task.id}`):a?.kind==="file"&&Ot(he.selectFile(a.file,le),`#${a.file.path}`)}return}if(se&&e.key==="ArrowDown"){e.preventDefault(),ct.length>0&&Ue(a=>(a+1)%ct.length);return}if(se&&e.key==="ArrowUp"){e.preventDefault(),ct.length>0&&Ue(a=>a===0?ct.length-1:a-1);return}if(se&&e.key==="Enter"){e.preventDefault();const a=ct[Pe]??ct[0];a&&dn(a);return}if(se&&e.key==="Escape"){e.preventDefault(),de(!1),J(""),Ie(-1);return}if(K&&e.key==="ArrowDown"){e.preventDefault(),$e.length>0&&ee(a=>(a+1)%$e.length);return}if(K&&e.key==="ArrowUp"){e.preventDefault(),$e.length>0&&ee(a=>a===0?$e.length-1:a-1);return}if(K&&(e.key==="Enter"||e.key==="Tab")&&$e.length>0){e.preventDefault();const a=$e[X]??$e[0];a?.kind==="skill"?Kn(a.skill):a?.kind==="command"&&Vn(a.command,a.disabled);return}if(K&&e.key==="Escape"){e.preventDefault(),L(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Un())},[se,ct,Pe,dn,K,$e,X,Kn,Vn,Un,he,Ot,le]),un=n.useCallback((e,a)=>{const c=zi(e,a);if(c){de(!0),J(c.filter),Ie(c.start);return}de(!1),J(""),Ie(-1)},[]),Qs=n.useCallback(e=>{const a=e.target,c=a.value,w=a.selectionStart??c.length;Te(a),St.current=w,Ee(c);const $=ys(c);$?(L(!0),P($.filter)):(L(!1),P("")),un(c,w),he.detectMention(c,w),Qt(he.mentionActive),he.mentionActive&&Dn(a)},[un,Te]),mn=n.useCallback(e=>{const a=e.currentTarget,c=a.selectionStart??a.value.length;St.current=c,un(a.value,c),he.detectMention(a.value,c),Qt(he.mentionActive),he.mentionActive&&Dn(a)},[un,he,Dn]),Ys=n.useCallback(e=>{e.key!=="Escape"&&mn(e)},[mn]),Js=n.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(Zt.current=!0,Ve.current!==null&&window.clearTimeout(Ve.current),Ve.current=window.setTimeout(()=>{Zt.current=!1,Ve.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),Ge.current!==null&&window.clearTimeout(Ge.current),Ge.current=window.setTimeout(()=>{Ge.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Ke.current!==null&&window.clearTimeout(Ke.current),Ke.current=window.setTimeout(()=>{L(!1),de(!1),J(""),Ie(-1),Qt(!1),he.dismissMention(),Ke.current=null},120)},[he]),Zs=n.useCallback(()=>{Zt.current=!1,Ve.current!==null&&(window.clearTimeout(Ve.current),Ve.current=null),Ke.current!==null&&(window.clearTimeout(Ke.current),Ke.current=null),Ge.current!==null&&(window.clearTimeout(Ge.current),Ge.current=null)},[]);n.useEffect(()=>()=>{Ve.current!==null&&window.clearTimeout(Ve.current),Ge.current!==null&&window.clearTimeout(Ge.current)},[]);const Za=n.useCallback(async e=>{ve(null);try{await G(e),r(i("chat.conversationArchived","Conversation archived"),"success")}catch{r(i("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[G,r]),Gn=n.useCallback(e=>{const a=z.find(c=>c.id===e)??(d?.id===e?d:null);ve(null),et(!1),ft(a?.title??""),ht({sessionId:e,title:a?.title??""})},[d,z]),ea=n.useCallback(async()=>{if(ze)try{await ae(ze.sessionId,we),ht(null),ft(""),r(i("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[r,ze,ae,we,i]),er=n.useCallback(async e=>{_e(null),ve(null);try{await D(e),r(i("chat.conversationDeleted","Conversation deleted"),"success")}catch{r(i("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[D,r]),Bt=n.useCallback(e=>{try{localStorage.setItem(Pa,String(e))}catch{}},[]),tr=n.useCallback(e=>{if(oe||$t)return;e.preventDefault(),e.stopPropagation();const a=e.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(e.pointerId);const c=e.clientX,w=Je;let $=w;document.body.style.userSelect="none";const re=Me=>{const Qe=Me.clientX-c,Nt=Math.max(kn,Math.min(Sn,w+Qe));$=Nt,Lt(Nt),Bt(Nt)},pe=Me=>{typeof a.releasePointerCapture=="function"&&a.releasePointerCapture(Me.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",re),document.removeEventListener("pointerup",pe),Bt($)};document.addEventListener("pointermove",re),document.addEventListener("pointerup",pe)},[oe,Bt,Je,$t]),nr=n.useCallback(e=>{if(oe||$t||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const a=e.shiftKey?50:10,c=e.key==="ArrowLeft"?-a:a,w=Math.max(kn,Math.min(Sn,Je+c));Lt(w),Bt(w)},[oe,Bt,Je,$t]),ta=n.useCallback(e=>{const a=z.find(c=>c.id===e);Re("direct",e,a?.lastMessageAt??a?.updatedAt),A(e),et(!1),oe&&He(!1)},[z,oe,Re,A]),Wn=n.useCallback(()=>{A(""),He(!0),et(!1)},[A]),qn=n.useCallback(()=>{C.selectRoom(null),He(!0),et(!1)},[C]),sr=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(Cn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:i("chat.startNewConversation","Start a new conversation")}),t.jsxs("button",{className:"btn btn-primary",onClick:cn,children:[t.jsx(Tt,{size:16}),i("chat.newChat","New Chat")]})]}),Xe=Ba(d,d?.agentId?De.get(d.agentId)??null:null,l),Xn=n.useMemo(()=>{if(!Xe?.provider||!Xe.modelId)return null;const e=vt.find(a=>a.provider===Xe.provider&&a.id===Xe.modelId);return e?.contextWindow?e.contextWindow:null},[Xe?.modelId,Xe?.provider,vt]),ar=n.useMemo(()=>Li(M,R?te:void 0),[R,M,te]),nt=pa(Xe?.provider,Xe?.modelId),dt=Xe?.provider??null,Qn=!!(d||R||M.length>0),hn=oe&&!it&&(U==="rooms"?ke:Qn),fn=oe?hn:U==="rooms"?ke:!!d,na=n.useRef(fn);n.useEffect(()=>{const e=na.current;na.current=fn,oe&&(e||!fn||Ls({type:"view",revert:U==="rooms"?qn:Wn}))},[U,Wn,qn,fn,oe,Ls]);const sa=d?.agentId===Be?nt??"Fusion":d?.title||De.get(d?.agentId??"")?.name||d?.agentId||"Chat",rr=d?.title||i("chat.untitledSession","Untitled"),ir=!!(nt&&nt!==sa),or=!oe&&Qn&&Xn!==null,aa=Ia(ar),gn=Xn!==null?Ia(Xn):null,Yn=gn?i("chat.contextWindowAria","Estimated {{used}} of {{total}} context tokens",{used:aa,total:gn}):null,cr=hn&&U==="direct"&&!!d,ra=hn&&U==="direct",ia=hn&&U==="rooms",Jn=De.get(d?.agentId??"")?.name||(d?.agentId===Be?nt??"Fusion":d?.agentId?.slice(0,30)??"Fusion"),Zn=!1,es=d?.agentId===Be,lr=e=>e.length>50?`${e.slice(0,50)}…`:e;n.useEffect(()=>{if(!qt)return;const e=a=>{Ps.current?.contains(a.target)||et(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[qt]),n.useEffect(()=>{if(!Xt)return;const e=c=>{_s.current?.contains(c.target)||Ft(!1)},a=c=>{c.key==="Escape"&&Ft(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",a),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",a)}},[Xt]),n.useEffect(()=>{(!oe||U!=="direct"||it)&&et(!1)},[oe,U,it]),n.useEffect(()=>{Ft(!1)},[C.activeRoom?.id]);const oa=n.useCallback((e,a)=>{const c=_t.current.get(e);c&&window.clearTimeout(c),Ds($=>({...$,[e]:a}));const w=window.setTimeout(()=>{Ds($=>{const{[e]:re,...pe}=$;return pe}),_t.current.delete(e)},2e3);_t.current.set(e,w)},[]),ca=n.useCallback(async(e,a)=>{const c=await Qr(a);oa(e,c?"success":"error")},[oa]),ts=d?.agentId===Be,ns=n.useCallback((e,a,c)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${xt[e]==="success"?" chat-message-copy-action--success":""}${xt[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":c??`chat-copy-response-${e}`,"aria-label":xt[e]==="success"?i("chat.responseCopied","Response copied"):xt[e]==="error"?i("chat.copyFailed","Copy failed"):i("chat.copyResponse","Copy response"),onClick:()=>{ca(e,a)},children:xt[e]==="success"?t.jsx(Yr,{size:14}):t.jsx(Jr,{size:14})}),[xt,ca]),ss=n.useCallback(e=>{const a=Ae.current;if(!a)return;const c=`[data-testid="chat-message-${e}"]`,w=a.querySelector(c);if(!w)return;const $=w.getBoundingClientRect().top-a.getBoundingClientRect().top+a.scrollTop,re=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;a.scrollTo({top:$,behavior:re?"auto":"smooth"})},[]),la=d?.cliExecutorAdapterId??null,as=!!la,dr=la==="generic"?"generic":"hybrid",ur=d?.cliSessionFile||d?.id||"",da=!as&&!R,ua=()=>t.jsxs("div",{className:"chat-messages",ref:Ae,onScroll:Vs,children:[t.jsx("div",{ref:Fs,className:"chat-load-more-sentinel",children:E&&Q&&t.jsx("div",{className:"chat-loading-older",children:i("chat.loadingOlderMessages","Loading older messages…")})}),R?t.jsxs(t.Fragment,{children:[M.map((e,a)=>t.jsx(ds,{message:e,forcePlain:!1,agentName:Jn,hideAssistantIdentity:es,showAssistantModelTag:Zn,activeModelTag:nt,activeModelProvider:dt,activeSessionId:d?.id??null,mentionAgentsByName:Bn,roomContext:null,copyAction:ts&&e.role==="assistant"?ns(e.id,e.content):void 0,onScrollToTop:ss,isTopClipped:Fn.has(e.id),isAwaitingQuestionAnswer:e.role==="assistant"&&a===M.length-1&&!R,submittedQuestionAnswer:_a(M,a),onQuestionSubmit:ln,canEdit:da,onEditMessage:Se},e.id)),t.jsx(ri,{streamingText:te,streamingThinking:V,streamingToolCalls:be,forcePlain:!1,agentName:Jn,hideAssistantIdentity:es,showAssistantModelTag:Zn,activeModelTag:nt,activeModelProvider:dt,copyAction:ts&&te?ns("__streaming__",te,"chat-copy-response-streaming"):void 0,onQuestionSubmit:ln})]}):Q?t.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):M.length===0&&!d?sr():M.length===0&&d?t.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):t.jsx(t.Fragment,{children:M.map((e,a)=>t.jsx(ds,{message:e,forcePlain:!1,agentName:Jn,hideAssistantIdentity:es,showAssistantModelTag:Zn,activeModelTag:nt,activeModelProvider:dt,activeSessionId:d?.id??null,mentionAgentsByName:Bn,roomContext:null,copyAction:ts&&e.role==="assistant"?ns(e.id,e.content):void 0,onScrollToTop:ss,isTopClipped:Fn.has(e.id),isAwaitingQuestionAnswer:e.role==="assistant"&&a===M.length-1&&!R,submittedQuestionAnswer:_a(M,a),onQuestionSubmit:ln,canEdit:da,onEditMessage:Se},e.id))}),t.jsx("div",{ref:Is})]}),ma=()=>t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:en,type:"file","data-testid":"chat-file-input",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{At(e.target.files),e.target.value=""}}),K&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":i("chat.skillSuggestions","Skill suggestions"),children:j&&On.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:i("chat.loadingSkills","Loading skills…")}):$e.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:O?i("chat.noSkillsFound","No skills found"):i("chat.noSkillsAvailable","No skills available")}):$e.map((e,a)=>e.kind==="command"?t.jsxs("button",{type:"button",role:"option","aria-selected":a===X,"aria-disabled":e.disabled,className:`chat-skill-menu-item chat-command-menu-item${a===X?" chat-skill-menu-item--highlighted":""}${e.disabled?" chat-command-menu-item--disabled":""}`,onMouseDown:c=>c.preventDefault(),onMouseEnter:()=>ee(a),onClick:()=>Vn(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":a===X,className:`chat-skill-menu-item${a===X?" chat-skill-menu-item--highlighted":""}`,onMouseDown:c=>c.preventDefault(),onMouseEnter:()=>ee(a),onClick:()=>Kn(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))}),Fe.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Fe.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>Gs(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),me.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-pending-stack","data-testid":"chat-pending-stack",children:me.map((e,a)=>t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:i("chat.queuedMessage","Queued: {{preview}}",{preview:lr(e)})}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":i("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":`chat-pending-dismiss-${a}`,onClick:()=>g(a),children:"×"})]},`${a}-${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:()=>en.current?.click(),children:t.jsx(ya,{size:16})}),!as&&t.jsx(wi,{level:d?.thinkingLevel,defaultThinkingLevel:S,models:vt,favoriteProviders:bt,favoriteModels:En,agents:Array.from(De.values()),agentId:d?.agentId,modelProvider:d?.modelProvider,modelId:d?.modelId,onChange:e=>{d&&Z(d.id,e)},onChangeModel:e=>{d&&H(d.id,e)},disabled:!d}),t.jsxs("div",{className:`chat-input-wrapper${Es?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),wt(!0)},onDragLeave:()=>wt(!1),onDrop:e=>{e.preventDefault(),wt(!1),At(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:qs,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:le,onChange:Qs,onKeyDown:Xs,onKeyUp:Ys,onClick:mn,onBlur:Js,onFocus:Zs,onPaste:Ws,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||us()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(Ea,{agents:Ct,filter:W,highlightedIndex:Pe,visible:se,onSelect:dn,position:"below",roomMemberIds:We?.memberIds,roomName:We?.roomName}),t.jsx(ki,{visible:he.mentionActive&&!se,position:qa,tasks:he.tasks,files:he.files,selectedIndex:he.selectedIndex,onSelectTask:e=>{Ot(he.selectTask(e,le),`#${e.id}`)},onSelectFile:e=>{Ot(he.selectFile(e,le),`#${e.path}`)},loading:he.loading})]}),t.jsx(wa,{isStreaming:R,canSend:!!(le.trim()||Fe.length>0),onSend:Hn,onStop:N})]})]}),mr=oe?void 0:{width:`${Je}px`},hr=cr?t.jsxs("div",{className:"chat-mobile-session-menu",ref:Ps,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":qt,onClick:()=>et(e=>!e),children:[dt?t.jsx(os,{provider:dt,size:"md"}):t.jsx(An,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:rr}),t.jsx(vn,{size:16,"aria-hidden":"true"})]}),qt&&t.jsxs("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:[z.map(e=>t.jsxs("div",{className:`chat-mobile-session-option-row${d?.id===e.id?" chat-mobile-session-option-row--active":""}`,role:"none",children:[t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${d?.id===e.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${e.id}`,onClick:()=>ta(e.id),children:t.jsx("span",{className:"chat-mobile-session-option-title",children:e.title||i("chat.untitledSession","Untitled")})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-rename","data-testid":`chat-mobile-session-rename-${e.id}`,"aria-label":i("chat.renameConversationAria","Rename conversation {{title}}",{title:e.title||i("chat.untitledSession","Untitled")}),onClick:()=>Gn(e.id),children:t.jsx(cs,{size:14})})]},e.id)),t.jsxs("button",{type:"button",role:"menuitem",className:"chat-mobile-session-new","data-testid":"chat-mobile-session-new",onClick:()=>{et(!1),cn()},children:[t.jsx(Tt,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.newChat","New Chat")})]})]})]}):null,fr=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${U==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":U==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>ge("direct"),children:[t.jsx(Cn,{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${U==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":U==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>ge("rooms"),children:[t.jsx(Ka,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.scopeRooms","Rooms")})]})]});return t.jsxs("div",{ref:Bs,className:`chat-view${o?" chat-view--floating":""}${oe?" chat-view--narrow":""}${ra?" chat-view--mobile-direct-thread":""}`,children:[t.jsx(Zr,{icon:Cn,title:i("chat.title","Chat"),actions:t.jsxs(t.Fragment,{children:[ra?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn-icon chat-back-btn",onClick:Wn,"data-testid":"chat-back-btn","aria-label":i("chat.backToConversations","Back to conversations"),children:t.jsx(va,{size:16})}),hr]}):fr,oe?null:t.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:cn,"data-testid":"chat-new-btn",children:[t.jsx(Tt,{size:14}),i("chat.newChat","New Chat")]}),!o&&u?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:u,"aria-label":i("chat.popOut","Pop out chat"),title:i("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:t.jsx(ba,{size:16})}):null,o&&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(ba,{size:16})}):null,o&&v?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:v,"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(ei,{size:16})}):null,o&&h?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:h,"aria-label":i("chat.closeChat","Close chat"),title:i("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:t.jsx(ti,{size:16})}):null]})}),t.jsxs("div",{className:"chat-view__body",children:[t.jsxs("div",{className:`chat-sidebar${it?"":" chat-sidebar--hidden"}`,style:mr,children:[U==="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(ni,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:i("chat.searchConversations","Search conversations..."),value:p,onChange:e=>B(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:_?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.loadingConversations","Loading...")}):z.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.noConversationsYet","No conversations yet")}):z.map(e=>{const a=d?.id===e.id,c=!a&&ye("direct",e.id,e.lastMessageAt??e.updatedAt),w=Ba(e,De.get(e.agentId)??null,l),$=pa(w?.provider,w?.modelId)??"Fusion",re=e.title||i("chat.untitledSession","Untitled");return t.jsxs("div",{className:`chat-session-item${a?" chat-session-item--active":""}`,onClick:()=>ta(e.id),onContextMenu:pe=>{pe.preventDefault(),ve({sessionId:e.id,x:pe.clientX,y:pe.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsxs("div",{className:"chat-session-actions",children:[t.jsx("button",{type:"button",className:"btn-icon chat-session-action-btn chat-session-rename-btn",onClick:pe=>{pe.stopPropagation(),Gn(e.id)},"data-testid":"chat-session-rename-btn","aria-label":i("chat.renameConversationAria","Rename conversation {{title}}",{title:re}),children:t.jsx(cs,{size:14})}),t.jsx("button",{type:"button",className:"btn-icon chat-session-action-btn chat-session-delete-btn",onClick:pe=>{pe.stopPropagation(),_e(e.id)},"data-testid":"chat-session-delete-btn","aria-label":i("chat.deleteConversation","Delete conversation"),children:t.jsx(ls,{size:14})})]}),t.jsxs("div",{className:"chat-session-title",children:[re,c?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||i("chat.noMessages","No messages")}),e.matchedMessagePreview?t.jsx("div",{className:"chat-session-preview chat-session-preview--matched","data-testid":`chat-session-matched-preview-${e.id}`,children:i("chat.matchedInMessage",'Matched: "{{preview}}"',{preview:e.matchedMessagePreview})}):null,t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[w?.provider?t.jsx(os,{provider:w.provider,size:"sm"}):null,t.jsx("span",{children:De.get(e.agentId)?.name||(e.agentId===Be?$:e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?_i(e.updatedAt,i):""})]})]},e.id)})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!oe&&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:()=>pt(!0),children:[t.jsx(Tt,{size:14}),i("chat.createRoom","Create room")]})}),C.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:C.rooms.map(e=>{const a=C.activeRoom?.id===e.id,c=!a&&ye("room",e.id,e.updatedAt);return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${a?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{Re("room",e.id,e.updatedAt),C.selectRoom(e.id),oe&&He(!1)},onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),Re("room",e.id,e.updatedAt),C.selectRoom(e.id),oe&&He(!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]}),c?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),a?t.jsx("span",{className:"chat-room-item-meta",children:i("chat.roomMemberCount","{{count}} member",{count:C.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:w=>{w.stopPropagation(),gt(e.id)},children:t.jsx(ls,{size:14})})]},e.id)})})]}),U==="rooms"?oe?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:()=>pt(!0),children:[t.jsx(Tt,{size:14}),i("chat.createRoom","Create room")]})}):null:oe?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:cn,"data-testid":"chat-new-btn",children:[t.jsx(Tt,{size:14}),i("chat.newChat","New Chat")]})}):null]}),!oe&&it&&!$t&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":kn,"aria-valuemax":Sn,"aria-valuenow":Je,"aria-label":i("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:tr,onKeyDown:nr}),je&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:je.y,left:je.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Gn(je.sessionId),"data-testid":"chat-context-rename",children:[t.jsx(cs,{size:14}),i("chat.rename","Rename")]}),t.jsxs("button",{onClick:()=>Za(je.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(si,{size:14}),i("chat.archive","Archive")]}),t.jsxs("button",{onClick:()=>{ve(null),_e(je.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(ls,{size:14}),i("chat.delete","Delete")]})]}),ze&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>ht(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:we,placeholder:i("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:e=>ft(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),ea())},autoFocus:!0}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>ht(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void ea(),"data-testid":"chat-rename-save",children:i("chat.save","Save")})]})]})}),xe&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>_e(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:()=>_e(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void er(xe),children:i("chat.delete","Delete")})]})]})}),Vt&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>gt(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:()=>gt(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await C.deleteRoom(Vt),gt(null)}catch{r(i("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:i("chat.delete","Delete")})]})]})}),U==="rooms"?t.jsxs("div",{ref:In,className:"chat-thread",children:[C.activeRoom?t.jsxs(t.Fragment,{children:[(!oe||ia)&&t.jsxs("div",{className:"chat-room-thread-header",children:[ia&&t.jsx("button",{className:"btn-icon",onClick:qn,"data-testid":"chat-back-btn",children:t.jsx(va,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:_s,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":Xt,onClick:()=>Ft(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",C.activeRoom.name]}),t.jsx(vn,{size:16,"aria-hidden":"true"})]}),Xt&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:C.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===C.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{Re("room",e.id,e.updatedAt),C.selectRoom(e.id),Ft(!1)},children:["#",e.name]},e.id))})]}),t.jsxs("div",{className:"chat-room-thinking-level-field",children:[t.jsx("label",{className:"sr-only",htmlFor:"chat-room-thinking-level",children:i("chat.roomThinkingLevel","Room thinking effort")}),t.jsxs("select",{id:"chat-room-thinking-level",className:"input chat-room-thinking-level-select","data-testid":"chat-room-thinking-level","aria-label":i("chat.roomThinkingLevel","Room thinking effort"),value:C.activeRoom.thinkingLevel??"",onChange:e=>{const a=e.target.value,c=xs.includes(a)?a:null;C.updateRoomSettings(C.activeRoom.id,{thinkingLevel:c}).catch(()=>{r(i("chat.failedToUpdateRoomThinkingLevel","Failed to update room thinking effort"),"error")})},children:[t.jsx("option",{value:"",children:i("models.useDefault","Use default")}),xs.map(e=>t.jsx("option",{value:e,children:i(`models.options.${e}`,e==="xhigh"?"Very High":e.charAt(0).toUpperCase()+e.slice(1))},e))]})]}),t.jsx("div",{className:"chat-room-thread-members",children:C.activeRoomMembers.map(e=>t.jsx(Nn,{agent:De.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:Ae,onScroll:Vs,children:[C.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):C.messages.filter(e=>e.content.trim()!==Fa).length===0?t.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):C.messages.filter(e=>e.content.trim()!==Fa).map(e=>{const a=e.senderAgentId?De.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):i("chat.you","You"),c={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(ds,{message:c,forcePlain:!1,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:C.activeRoom?.id??null,mentionAgentsByName:Bn,roomContext:We,onScrollToTop:ss,isTopClipped:Fn.has(e.id),isAwaitingQuestionAnswer:!1,onQuestionSubmit:ln},e.id)}),t.jsx("div",{ref:Is})]}),C.activeRoom&&js&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Oe("fab-click"),children:[t.jsx(vn,{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")}),C.activeRoom&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:en,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{At(e.target.files),e.target.value=""}}),Fe.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Fe.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>Gs(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>en.current?.click(),children:t.jsx(ya,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${Es?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),wt(!0)},onDragLeave:()=>wt(!1),onDrop:e=>{e.preventDefault(),wt(!1),At(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:qs,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:le,onChange:Qs,onKeyDown:Xs,onKeyUp:Ys,onClick:mn,onBlur:Js,onFocus:Zs,onPaste:Ws,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||us()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(Ea,{agents:Ct,filter:W,highlightedIndex:Pe,visible:se,onSelect:dn,position:"below",roomMemberIds:We?.memberIds,roomName:We?.roomName})]}),t.jsx(wa,{isStreaming:!1,canSend:!!(le.trim()||Fe.length>0),onSend:Un})]})]})]}):t.jsxs("div",{ref:In,className:"chat-thread",children:[!oe&&(Qn||!oe)&&t.jsx("div",{className:"chat-thread-header",children:t.jsxs("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:[dt?t.jsx(os,{provider:dt,size:"md"}):t.jsx(An,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:sa}),ir&&t.jsx("span",{className:"chat-model-tag",children:nt}),or&&gn&&Yn?t.jsxs("span",{className:"chat-thread-header-context","data-testid":"chat-thread-context-window",title:Yn,"aria-label":Yn,children:[aa," / ",gn]}):null]})}),as?t.jsx(Mi,{cliSessionId:ur,tier:dr,projectId:s,renderTranscript:ua,renderComposer:()=>d?ma():null}):t.jsxs(t.Fragment,{children:[ua(),js&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Oe("fab-click"),children:[t.jsx(vn,{size:14}),i("chat.latest","Latest")]}),d&&ma()]})]}),t.jsx(Ci,{isOpen:Tn,onClose:()=>pt(!1),projectId:s,existingRoomNames:C.rooms.map(e=>e.name),onCreate:async e=>{await C.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),U!=="rooms"&&ge("rooms"),pt(!1),oe&&He(!1)}})]}),ne&&t.jsx(Ui,{projectId:s,defaultModel:y,defaultKind:T?.kind,defaultAgentId:T?.kind==="agent"?T.agentId:void 0,defaultThinkingLevel:S,defaultSelectedThinkingLevel:T?.kind==="model"?T.thinkingLevel:void 0,onClose:()=>fe(!1),onCreate:on})]})}export{Ji as ChatView,Pi as clampChatInputHeight,Fi as resolveChatInputOverflowY,Ba as resolveSessionProvider};
|