@runfusion/fusion 0.56.1 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +5998 -4649
- package/dist/client/.vite/manifest.json +241 -241
- package/dist/client/assets/AgentDetailView-DexqYfz4.js +18 -0
- package/dist/client/assets/{AgentPermissionPolicyEditor-DQDzCWq_.js → AgentPermissionPolicyEditor-B65iWSFw.js} +1 -1
- package/dist/client/assets/AgentsView-DWBHXG4w.js +24 -0
- package/dist/client/assets/ChatView-BaGockES.js +6 -0
- package/dist/client/assets/{CommandCenter-CZ856YOj.js → CommandCenter-DNSpf5Nq.js} +2 -2
- package/dist/client/assets/{DevServerView-BqsnMChS.js → DevServerView-T7YAMRMr.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-cW1rnVoG.js → DirectoryPicker-p_bMALI6.js} +1 -1
- package/dist/client/assets/{DocumentsView-C6a5tuBQ.js → DocumentsView-CSZ1_bEk.js} +1 -1
- package/dist/client/assets/{EvalsView-DZd_TM3I.js → EvalsView-C03NFn9p.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-cA-aWWsB.js → ExperimentalAgentOnboardingModal-DaYU4VlV.js} +1 -1
- package/dist/client/assets/{GoalsView-Bzvw1aDV.js → GoalsView-CwXL_l6r.js} +1 -1
- package/dist/client/assets/{InsightsView-B3WQIXKs.js → InsightsView-D-pumdKK.js} +1 -1
- package/dist/client/assets/{MemoryView-BZ2KwFO5.js → MemoryView--frKZACq.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-D5x6GZOP.js → PiExtensionsManager-HTYWFcsw.js} +1 -1
- package/dist/client/assets/PluginManager-47FXVbWv.js +1 -0
- package/dist/client/assets/{PluginManager-DSiHizRD.css → PluginManager-Bm9FXhxQ.css} +1 -1
- package/dist/client/assets/{PullRequestView-DX3J4hgm.js → PullRequestView-jqo0u_qP.js} +1 -1
- package/dist/client/assets/{ResearchView-MZV2S2kT.js → ResearchView-lUFw0eBY.js} +1 -1
- package/dist/client/assets/{SecretsView--R3u3G4b.js → SecretsView-DZ1NCe-c.js} +1 -1
- package/dist/client/assets/{SessionTerminal-BQWc1_Ty.js → SessionTerminal-B10eN86g.js} +1 -1
- package/dist/client/assets/SettingsModal-BIIWHPyY.js +21 -0
- package/dist/client/assets/SettingsModal-BqIOpGm9.css +1 -0
- package/dist/client/assets/{SettingsModal-Coqvlmud.js → SettingsModal-C3PIQwOw.js} +1 -1
- package/dist/client/assets/SettingsModal-D-z02qbd.css +1 -0
- package/dist/client/assets/{SetupWizardModal-CoReXugb.js → SetupWizardModal-BtCAK9gq.js} +2 -2
- package/dist/client/assets/{ShadcnColorPicker-D-u_ECbM.js → ShadcnColorPicker-CgbOh2Vh.js} +1 -1
- package/dist/client/assets/{SkillsView-D21ils_G.js → SkillsView-xknpWJDp.js} +1 -1
- package/dist/client/assets/{TodoView-BFZQSkv4.js → TodoView-BOIUCi-b.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-E-7d5R9z.js → WorkflowNodeEditor-BoGuTbgL.js} +1 -1
- package/dist/client/assets/{agentSkills-CM_yYVTx.js → agentSkills-HBp0qQK2.js} +1 -1
- package/dist/client/assets/app-CC21pBBX.js +13 -0
- package/dist/client/assets/app-D5aQhT6F.js +13 -0
- package/dist/client/assets/app-DRTCMx1I.js +13 -0
- package/dist/client/assets/{app-CEtD1B9K.js → app-gWIFDNxJ.js} +2 -2
- package/dist/client/assets/app-pKygaS_p.js +13 -0
- package/dist/client/assets/app-usRdP6KP.js +13 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-DhgVYwmg.js → architectureDiagram-3BPJPVTR-DFSc_ojZ.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-AlG0kVWu.js → blockDiagram-GPEHLZMM-BeWCvgkB.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-BOzpW3F7.js → c4Diagram-AAUBKEIU-53kLf9YA.js} +1 -1
- package/dist/client/assets/channel-DqmRVQcu.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BAmZfsv0.js → chunk-2J33WTMH-oiPMiLQk.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-Cs587QhG.js → chunk-4BX2VUAB-DtEYW63S.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-qpIQSO06.js → chunk-55IACEB6-CRyY-eBJ.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-DF3vZtMc.js → chunk-727SXJPM-DpPz5T23.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-BuETIys5.js → chunk-AQP2D5EJ-DsvlwOK0.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-B8D1TSR9.js → chunk-FMBD7UC4-B4PI9bUA.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-BJv9aIQn.js → chunk-ND2GUHAM-CNvgVhAJ.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BJbK2pNR.js → chunk-QZHKN3VN-PzmFXGK3.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BkGcNuxB.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BkGcNuxB.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-BWRikddb.js → cose-bilkent-S5V4N54A-B2hi4baG.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-DpAxJj7T.js → dagre-BM42HDAG-CtfJbsAQ.js} +1 -1
- package/dist/client/assets/{dashboard-view-qq3ayA0B.js → dashboard-view-DmxFuwxK.js} +1 -1
- package/dist/client/assets/{dashboard-view-Dw8L8k-2.js → dashboard-view-Y7yFASOR.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-DRRIILsg.js → diagram-2AECGRRQ-CCNdu-lI.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-DSOu28ss.js → diagram-5GNKFQAL-CRFRDKo6.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-CWzbnTBM.js → diagram-KO2AKTUF-qzA8EYKe.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-CGqf3bt6.js → diagram-LMA3HP47-BcVh_7JQ.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-C1axXteT.js → diagram-OG6HWLK6-ti62bhwU.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-bBdlc4OY.js → erDiagram-TEJ5UH35-R-0m-loG.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-BTCJ2J3b.js → flowDiagram-I6XJVG4X-DmchEhZJ.js} +1 -1
- package/dist/client/assets/{folder-open-BN3_NdbL.js → folder-open-BnJacMSp.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CiFY9oBj.js → ganttDiagram-6RSMTGT7-CRZY8cRF.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CxubcP4l.js → gitGraphDiagram-PVQCEYII-DJ6KnPoF.js} +1 -1
- package/dist/client/assets/index-BxaBW271.css +1 -0
- package/dist/client/assets/index-C-IxdGPX.js +2526 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-ToDlIyOV.js → infoDiagram-5YYISTIA-BEXH-GHB.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BgO681xo.js → ishikawaDiagram-YF4QCWOH-CVuF17Yd.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-OJZ3op9w.js → journeyDiagram-JHISSGLW-CCcBBtY4.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-q2OOqX8K.js → kanban-definition-UN3LZRKU-B5bqvapW.js} +1 -1
- package/dist/client/assets/{mermaid.core-BmDOYmFS.js → mermaid.core-DfKOBw3p.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-Dw8JehwG.js → mindmap-definition-RKZ34NQL-D6YDtYgW.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-D5Li6GnX.js → pieDiagram-4H26LBE5-BokP1BTt.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-B4s-2jdZ.js → quadrantDiagram-W4KKPZXB-B9NJMDnf.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-Drc3rc_E.js → requirementDiagram-4Y6WPE33-CkVaSHtt.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C_R01GQC.js → sankeyDiagram-5OEKKPKP-BoU2JDPH.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-gyl7Yhgc.js → sequenceDiagram-3UESZ5HK-Damqlxg5.js} +1 -1
- package/dist/client/assets/{shield-alert-DjhYmFaV.js → shield-alert-BTMxVnOy.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-BY53czZh.js → stateDiagram-AJRCARHV-BC72nvu_.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-C53cIaWg.js → stateDiagram-v2-BHNVJYJU-BSoMYClQ.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-BYwv2FZJ.js → timeline-definition-PNZ67QCA-DxHz0a6F.js} +1 -1
- package/dist/client/assets/{upload-BKpOp-Bn.js → upload-1isayrJo.js} +1 -1
- package/dist/client/assets/{users-BUMHTZuX.js → users-C3jhPg5Q.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-Dt94bP0k.js → vennDiagram-CIIHVFJN-B3nVtXfZ.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-536kdB5p.js → wardley-L42UT6IY-D-hb-Ks4.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-D8iNQ_MW.js → wardleyDiagram-YWT4CUSO-DVqAvZPQ.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-CXqp8mzh.js → xychartDiagram-2RQKCTM6-0RALveCq.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 +2784 -1191
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +35 -0
- 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/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +21 -8
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/references/extension-tools.md +4 -2
- package/skill/fusion/references/fusion-capabilities.md +2 -2
- package/dist/client/assets/AgentDetailView-BICsleMh.js +0 -18
- package/dist/client/assets/AgentsView-DRpFG7gE.js +0 -24
- package/dist/client/assets/ChatView-5vVkIiNh.js +0 -6
- package/dist/client/assets/PluginManager-YfHRH24B.js +0 -1
- package/dist/client/assets/SettingsModal-CNYosRF3.js +0 -21
- package/dist/client/assets/SettingsModal-CaE4JYxi.css +0 -1
- package/dist/client/assets/SettingsModal-D8AyVDar.css +0 -1
- package/dist/client/assets/app-0jcSCRQr.js +0 -13
- package/dist/client/assets/app-BPzPEE6G.js +0 -13
- package/dist/client/assets/app-BSZU5Uns.js +0 -13
- package/dist/client/assets/app-CVyRSEUX.js +0 -13
- package/dist/client/assets/app-DoLz_4Dg.js +0 -13
- package/dist/client/assets/channel-DHSVrpL1.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CTu3cN1i.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CTu3cN1i.js +0 -1
- package/dist/client/assets/index-CbmH1ED8.css +0 -1
- package/dist/client/assets/index-rfsTNfpA.js +0 -2511
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{r as s,j as t,b as Ga}from"./vendor-react-SZ_qB27O.js";import{c as Va,aC as nt,aA as Ye,dR as Hs,dS as rs,bX as Pt,dT as Bn,aF as re,dU as It,dD as Mt,dV as Us,dW as Dt,dX as Wa,dE as fn,dQ as Ct,dY as Xa,dZ as Ks,d_ as qa,d$ as Qa,e0 as Ya,e1 as Ja,e2 as Za,ak as va,e3 as er,aB as Zn,bE as Gs,e4 as tr,e5 as nr,e6 as zn,e7 as sr,e8 as ar,e9 as rr,ea as or,eb as ir,ec as cr,f as gn,ed as lr,ee as dr,br as ur,an as mr,be as mn,a3 as hr,c3 as fr,ef as gr,i as pr,eg as ya,eh as br,dB as vr,W as yr,ei as wr,ej as Vs,G as xr,H as Cr,dy as Hn,bx as es,o as an,I as Un,P as yt,V as Sr,bv as Ws,dm as Xs,dl as Mr,X as kr,aM as Rr,J as Kn,bR as Ar,ek as Gn,el as qs,em as Vn,en as Qs,eo as Nr,bP as Ys,bS as Er}from"./index-C-IxdGPX.js";import{u as st}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as Js}from"./SessionTerminal-B10eN86g.js";import"./vendor-reactflow-CnI7NMXG.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";import"./shield-alert-BTMxVnOy.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 Tr=[["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"}]],wa=Va("hash",Tr);function Zs(n){const{sessionId:r,tempUserMessageId:i,initialText:m,initialThinking:c,initialToolCalls:l,setStreamingText:v,setStreamingThinking:f,setStreamingToolCalls:o,cancelStreamingFlushesRef:h,addToast:z,onDone:S,onError:k,onFallbackSession:D}=n;let P=m??"",F=c??"",j=l?[...l]:[],Q,A=null,se=null;const W=()=>{A=null,v(P)},he=()=>{se=null,f(F)},N=()=>{A!==null&&(cancelAnimationFrame(A),A=null),se!==null&&(cancelAnimationFrame(se),se=null)};return h.current=N,{handlers:{onThinking:H=>{F+=H,se===null&&(se=requestAnimationFrame(he))},onText:H=>{P+=H,A===null&&(A=requestAnimationFrame(W))},onToolStart:H=>{j=[...j,{toolName:H.toolName,args:H.args,isError:!1,status:"running"}],o(j)},onToolEnd:H=>{const Z=[...j];for(let $=Z.length-1;$>=0;$--){const Y=Z[$];if(Y?.toolName===H.toolName&&Y.status==="running"){Z[$]={...Y,status:"completed",isError:H.isError,result:H.result},j=Z,o(Z);return}}j=[...Z,{toolName:H.toolName,isError:H.isError,result:H.result,status:"completed"}],o(j)},onFallback:H=>{Q=H,D?.(H,r),z?.(`Primary model unavailable. Switched to fallback ${H.fallbackModel}.`,"warning")},onDone:H=>{N(),S({messageId:H.messageId,message:H.message,accumulated:{text:P,thinking:F,toolCalls:j,fallbackInfo:Q}})},onError:(H,Z)=>{N(),k(H,i,Z)}},cancelFlushes:N}}const jr="fusion:chat-pending:";function os(n){return n?`${jr}${n}`:null}function Dr(n){const r=os(n);if(!r||typeof window>"u")return[];try{const i=localStorage.getItem(r);if(!i)return[];try{const c=JSON.parse(i);if(Array.isArray(c))return c.filter(l=>typeof l=="string"&&l.trim().length>0)}catch{}const m=i.trim();return m?[m]:[]}catch{return[]}}function Wn(n,r){const i=os(n);if(!(!i||typeof window>"u"))try{const m=r.filter(c=>c.trim().length>0);if(m.length===0){localStorage.removeItem(i);return}localStorage.setItem(i,JSON.stringify(m))}catch{}}function rn(n){const r=os(n);if(!(!r||typeof window>"u"))try{localStorage.removeItem(r)}catch{}}const Xn="kb-chat-active-session",Fr="task-planner:";function ts(n){return n.agentId.startsWith(Fr)}function Ir(n){return ts(n)&&!n.lastMessageAt&&!n.lastMessagePreview}function ea(n){const r=typeof n=="string"?n.trim():"",i=r.indexOf("/");return!r||i<=0||i>=r.length-1?{}:{modelProvider:r.slice(0,i),modelId:r.slice(i+1)}}function Pr(n){const r=n?.toolCalls;if(!Array.isArray(r))return;const i=r.map(m=>{if(!m||typeof m!="object")return null;const c=m,l=typeof c.toolName=="string"?c.toolName:"";if(!l)return null;const v=c.args;return{toolName:l,...v&&typeof v=="object"?{args:v}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(m=>m!==null);return i.length>0?i:void 0}function Lr(n){const r=n?.fallback;if(!r||typeof r!="object")return;const i=r,m=typeof i.primaryModel=="string"?i.primaryModel:"",c=typeof i.fallbackModel=="string"?i.fallbackModel:"",l=i.triggerPoint;if(!(!m||!c||l!=="session-creation"&&l!=="prompt-time"))return{primaryModel:m,fallbackModel:c,triggerPoint:l}}function _r(n){const r=n?.failureInfo;if(!r||typeof r!="object")return;const i=r,m=typeof i.summary=="string"?i.summary.trim():"";if(!m)return;const c=(()=>{const l=i.reference;if(!l||typeof l!="object")return;const v=l,f=typeof v.kind=="string"?v.kind.trim():"",o=typeof v.id=="string"?v.id.trim():"";if(!(!f||!o))return{kind:f,id:o,...typeof v.label=="string"&&v.label.trim()?{label:v.label.trim()}:{}}})();return{summary:m,...typeof i.errorClass=="string"&&i.errorClass.trim()?{errorClass:i.errorClass.trim()}:{},...typeof i.code=="string"&&i.code.trim()?{code:i.code.trim()}:{},...typeof i.detail=="string"&&i.detail.trim()?{detail:i.detail.trim()}:{},...c?{reference:c}:{}}}function ta(n,r){const i="Failed to get response";return typeof n=="string"?{summary:n.trim()||i}:{summary:typeof n.summary=="string"&&n.summary.trim()?n.summary.trim():i,...typeof n.errorClass=="string"&&n.errorClass.trim()?{errorClass:n.errorClass.trim()}:{},...typeof n.code=="string"&&n.code.trim()?{code:n.code.trim()}:{},...typeof n.detail=="string"&&n.detail.trim()?{detail:n.detail.trim()}:{},...n.reference?{reference:n.reference}:{}}}function on(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:Pr(n.metadata),fallbackInfo:Lr(n.metadata),failureInfo:_r(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function na(n,r){if(n.some(c=>c.id===r.id))return n;const i=n.findIndex(c=>c.role==="user"&&c.id.startsWith("temp-")&&c.sessionId===r.sessionId&&c.content.trim()===r.content.trim());if(i<0)return[...n,r];const m=[...n];return m[i]=r,m}function $r(n,r){const i=s.useCallback(d=>d?`${nt.CHAT_SESSIONS_PREFIX}${d}`:null,[]),m=s.useCallback((d,p)=>d&&p?`${nt.CHAT_MESSAGES_PREFIX}${d}:${p}`:null,[]),c=s.useCallback(d=>{const p=i(d);return p?(Ye(p,{maxAgeMs:Hs})??[]).filter(E=>!ts(E)):[]},[i]),[l,v]=s.useState(()=>c(n)),[f,o]=s.useState(null),[h,z]=s.useState(()=>c(n).length===0),[S,k]=s.useState([]),[D,P]=s.useState(!1),[F,j]=s.useState(!1),[Q,A]=s.useState(""),[se,W]=s.useState(""),[he,N]=s.useState([]),[ce,H]=s.useState([]),[Z,$]=s.useState(""),[Y,x]=s.useState(new Map),L=s.useRef(0),[ye,ie]=s.useState(!1),{agentsMap:R}=rs(n),M=s.useRef(null),T=s.useRef(null),b=s.useRef(!1),w=s.useRef([]),K=s.useRef(()=>!1),g=s.useRef(null),xe=s.useRef(l),I=s.useRef(f),G=s.useRef(S),X=s.useRef(F);xe.current=l,I.current=f,G.current=S,X.current=F,s.useEffect(()=>{w.current=ce},[ce]);const le=s.useRef(new Set),fe=s.useRef(0),Se=s.useRef(n);Se.current!==n&&(Pt({view:"useChat",trigger:"project-context-change",projectId:n,replayAttempted:!1,detail:{previousProjectId:Se.current??null}}),Se.current=n,fe.current++);const Ce=s.useCallback(async()=>{xe.current.length===0&&z(!0);try{const p=[...(await Bn(n)).sessions].sort((E,O)=>new Date(O.updatedAt).getTime()-new Date(E.updatedAt).getTime());v(p);const y=i(n);y&&re(y,p,{maxBytes:5e5})}catch{const d=c(n);if(xe.current.length===0&&d.length===0){const p=i(n);p&&It(p)}}finally{z(!1)}},[i,n]);s.useEffect(()=>{const d=c(n);v(d),z(d.length===0)},[n,c]),s.useEffect(()=>{Ce()},[Ce,n]);const at=s.useRef(()=>{}),Ie=s.useRef(!1);s.useEffect(()=>{Ie.current=!1,T.current=null},[n]),s.useEffect(()=>{if(h||Ie.current||I.current)return;const d=Mt(Xn,n);if(!d){Ie.current=!0;return}const p=l.find(y=>y.id===d);if(p){Ie.current=!0,at.current(d,p);return}Ie.current=!0},[h,l,n]);const Je=s.useCallback((d,p)=>{const y=m(d,p);return y?Ye(y,{maxAgeMs:Hs})??[]:[]},[m]),De=s.useCallback((d,p)=>{const y=Je(n,d);return y.length>0?(k(y),P(!1),!0):(p?.clearOnMiss!==!1&&k([]),!1)},[n,Je]),be=s.useCallback(async(d,p)=>{const y=typeof p?.offset=="number"&&p.offset>0||typeof p?.before=="string",E=m(n,d),O=y?[]:Je(n,d),_=O.length>0;!y&&_?(k(O),P(!1)):P(!0);try{const q=await Us(d,{limit:50,order:"desc",...p},n),V=q.messages.slice().reverse().map(on),ee=I.current?.id===d||p?.commitForStreamingAttach===!0&&T.current?.sessionId===d;y?ee&&(k(ae=>[...V,...ae]),ie(q.messages.length>=50)):ee&&(k(V),ie(q.messages.length>=50),E&&re(E,V,{maxBytes:5e5}))}catch{!y&&G.current.length===0&&_&&(k(O),P(!1))}finally{P(!1)}},[m,n,Je]),Pe=s.useCallback(()=>{g.current?.(),g.current=null,w.current=[],H([]),A(""),W(""),N([]),j(!1)},[]),rt=s.useCallback(d=>{const p=I.current?.id;if(typeof d=="number"){const y=w.current.filter((E,O)=>O!==d);w.current=y,H(y),Wn(p,y);return}rn(p),w.current=[],H([])},[]),de=s.useCallback(()=>{const[d,...p]=w.current,y=d?.trim();if(!y)return;const E=I.current?.id;w.current=p,H(p),Wn(E,p),ct.current(y)},[]),Le=s.useCallback(async(d,p)=>{try{const{session:y}=await Dt(d,n);if(I.current?.id!==d||w.current.length===0)return;if(y.isGenerating||y.inFlightGeneration){K.current(d,y.inFlightGeneration,{silent:p?.silent,priorThreadLoadAlreadyStarted:!0});return}de()}catch{}},[de,n]),ge=s.useCallback((d,p,y)=>{if(M.current||!d)return!0;b.current=!1;const E=G.current,O=E.length===0||E[0]?.sessionId!==d;T.current={sessionId:d,replayFromEventId:typeof p?.replayFromEventId=="number"?p.replayFromEventId:null},O&&!y?.priorThreadLoadAlreadyStarted&&(De(d,{clearOnMiss:!1}),be(d,{commitForStreamingAttach:!0})),p&&(A(p.streamingText),W(p.streamingThinking),N(p.toolCalls)),j(!0);const{handlers:_}=Zs({sessionId:d,tempUserMessageId:"",initialText:p?.streamingText,initialThinking:p?.streamingThinking,initialToolCalls:p?.toolCalls,setStreamingText:A,setStreamingThinking:W,setStreamingToolCalls:N,cancelStreamingFlushesRef:g,addToast:y?.silent?void 0:r,onFallbackSession:(V,ee)=>{const ae=ea(V.fallbackModel);v(U=>U.map(J=>J.id===ee?{...J,...ae}:J)),o(U=>U&&U.id===ee?{...U,...ae}:U)},onDone:()=>{A(""),W(""),N([]),j(!1),X.current=!1,M.current=null,T.current=null,be(d),de()},onError:V=>{A(""),W(""),N([]),j(!1),X.current=!1,M.current=null,T.current=null;const ee=ta(V);y?.silent||r?.(ee.summary,"error"),be(d),Le(d,{silent:y?.silent})}});Pt({view:"useChat",trigger:"sse-open",projectId:n,replayAttempted:typeof p?.replayFromEventId=="number",replayFromEventId:p?.replayFromEventId??null,lastEventId:p?.replayFromEventId??null});const q=Wa(d,_,n,{...typeof p?.replayFromEventId=="number"?{lastEventId:p.replayFromEventId}:{}});return M.current=q,!0},[r,de,Le,De,be,n]);K.current=ge;const ot=s.useCallback((d,p)=>{const y=I.current?.id??null;if(d&&y===d&&!p)return;M.current&&(M.current.close(),M.current=null),T.current=null;const E=p??l.find(O=>O.id===d);o(E||null),I.current=E||null,d&&Dt(d,n).then(({session:O})=>{O.isGenerating&&I.current?.id===d&&(o(_=>!_||_.id!==d?_:{..._,...O}),M.current||ge(d,O.inFlightGeneration,{silent:!0}))}).catch(()=>{}),Pe(),ie(!1),d?(De(d),be(d)):k([]),E?.isGenerating&&ge(E.id,E.inFlightGeneration,{priorThreadLoadAlreadyStarted:!0}),d?fn(Xn,d,n):Ct(Xn,n)},[ge,De,l,be,n,Pe]);at.current=ot,s.useEffect(()=>{const d=f?.id;if(!d)return;const p=Dr(d);if(p.length===0)return;w.current=p,H(p);let y=!1;return Dt(d,n).then(({session:E})=>{if(!(y||I.current?.id!==d||w.current.length===0)){if(E.isGenerating){M.current||ge(d,E.inFlightGeneration);return}!X.current&&!M.current&&de()}}).catch(()=>{}),()=>{y=!0}},[f?.id,ge,de,n]);const it=s.useCallback(async d=>{const p=I.current?.id,y=await Xa(d,n);M.current&&(M.current.close(),M.current=null),T.current=null;const E={id:y.session.id,title:y.session.title,agentId:y.session.agentId,status:y.session.status,modelProvider:y.session.modelProvider,modelId:y.session.modelId,createdAt:y.session.createdAt,updatedAt:y.session.updatedAt};return v(O=>O.some(_=>_.id===E.id)?O:[E,...O]),rn(p),Pe(),ot(E.id,E),E},[n,Pe,ot]),Lt=s.useCallback(async d=>{rn(d),await Ks(d,{status:"archived"},n),v(p=>p.filter(y=>y.id!==d)),f?.id===d&&(T.current=null,o(null),k([]))},[f,n]),Te=s.useCallback(async(d,p)=>{const y=p.trim()||null,E=l,O=f;v(_=>_.map(q=>q.id===d?{...q,title:y}:q)),o(_=>_?.id===d?{..._,title:y}:_);try{const q=(await Ks(d,{title:y},n)).session;v(V=>V.map(ee=>ee.id===d?{...ee,title:q.title,updatedAt:q.updatedAt}:ee)),o(V=>V?.id===d?{...V,title:q.title,updatedAt:q.updatedAt}:V)}catch(_){throw v(E),o(O),r?.("Failed to rename conversation","error"),_}},[f,r,n,l]),_t=s.useCallback(async d=>{rn(d),f?.id===d&&M.current&&(M.current.close(),M.current=null),f?.id===d&&(T.current=null),await qa(d,n);const p=m(n,d);p&&It(p),v(y=>y.filter(E=>E.id!==d)),f?.id===d&&(o(null),k([]))},[f,m,n]),$t=s.useCallback(async()=>{if(!f||!ye)return;const d=G.current[0]?.createdAt;d&&await be(f.id,{before:d})},[f,ye,be]),Ot=s.useCallback(()=>{f&&(b.current=!0,g.current?.(),g.current=null,M.current?.close(),M.current=null,T.current=null,Qa(f.id,n).catch(()=>{}),j(!1),X.current=!1,A(""),W(""),N([]),de())},[f,n,de]),ct=s.useRef(()=>{}),lt=Ya(),Bt=s.useCallback(async d=>{try{await Ce();const p=await Dt(d,n);I.current?.id===d&&o(y=>!y||y.id!==d?y:{...y,...p.session}),p.session.isGenerating?(A(""),W(""),N([]),j(!0),X.current=!0,ge(d,p.session.inFlightGeneration,{silent:!0})):(A(""),W(""),N([]),j(!1),X.current=!1,await be(d))}catch{}},[ge,be,n,Ce]),je=s.useCallback((d,p)=>{if(!f)return;if(X.current){const _=d.trim();if(!_)return;const q=[...w.current,_];w.current=q,H(q),Wn(f.id,q);return}b.current=!1,M.current&&(M.current.close(),M.current=null),T.current=null;const y=`temp-${Date.now()}`,E={id:y,sessionId:f.id,role:"user",content:d,createdAt:new Date().toISOString()};k(_=>[..._,E]),A(""),W(""),N([]),j(!0),X.current=!0;const{handlers:O}=Zs({sessionId:f.id,tempUserMessageId:y,setStreamingText:A,setStreamingThinking:W,setStreamingToolCalls:N,cancelStreamingFlushesRef:g,addToast:r,onFallbackSession:(_,q)=>{const V=ea(_.fallbackModel);v(ee=>ee.map(ae=>ae.id===q?{...ae,...V}:ae)),o(ee=>ee&&ee.id===q?{...ee,...V}:ee)},onDone:({messageId:_,message:q,accumulated:V})=>{const ee=q?{...on(q),...V.text.length>0?{content:V.text}:{}}:{id:_||`msg-${Date.now()}`,sessionId:f.id,role:"assistant",content:V.text,thinkingOutput:V.thinking,toolCalls:V.toolCalls.length>0?V.toolCalls:void 0,fallbackInfo:V.fallbackInfo,createdAt:new Date().toISOString()};le.current.add(ee.id),k(ae=>[...ae,ee]),A(""),W(""),N([]),j(!1),X.current=!1,M.current=null,T.current=null,setTimeout(()=>{le.current.delete(ee.id)},1e3),Ce(),de()},onError:(_,q,V)=>{const ee=ta(_),ae=typeof _=="string"?_:ee.summary,U=er(ae),J=V?.requestAccepted===!0;k(ue=>{const pe=J?ue:ue.filter(ut=>ut.id!==q);return U?pe:[...pe,{id:`error-${Date.now()}`,sessionId:f.id,role:"assistant",content:ee.summary,failureInfo:ee,createdAt:new Date().toISOString()}]}),A(""),W(""),N([]),j(!1),X.current=!1,M.current=null,T.current=null,console.error("[useChat] Stream error:",_),U?(console.info("[useChat] Suppressed tab-suspension stream error:",_),f?.id&&(A(""),W(""),N([]),j(!0),X.current=!0,Bt(f.id))):(r?.(ee.summary,"error"),J&&Us(f.id,{limit:50,order:"desc"},n).then(ue=>{if(I.current?.id!==f.id)return;const pe=ue.messages.slice().reverse().map(on);k(ut=>pe.reduce(na,ut))}).catch(()=>{}),Ce()),b.current||de()}});M.current=Ja(f.id,d,O,p,n)},[f,n,Ce,r,ge,Bt,de]);ct.current=je;const Ve=s.useCallback(async(d,p)=>{if(X.current||!f)return;const y=p.trim();if(!y)return;const E=f.id,O=G.current,_=O.findIndex(V=>V.id===d);if(_===-1)return;k(O.slice(0,_));try{await Za(E,d,y,n)}catch(V){console.error("[useChat] Failed to edit message:",V),r?.("Failed to edit message","error"),await be(E);return}const q=m(n,E);q&&It(q),je(y)},[f,n,r,be,m,je]),_e=Z.trim();s.useEffect(()=>{if(!_e){L.current++,x(new Map);return}const d=++L.current,p=setTimeout(()=>{(async()=>{try{const y=await Bn(n,void 0,{q:_e,titleOnly:!1});if(L.current!==d)return;const E=new Map;for(const O of y.sessions)O.matchedMessagePreview&&E.set(O.id,O.matchedMessagePreview);x(E)}catch{L.current===d&&x(new Map)}})()},300);return()=>clearTimeout(p)},[_e,n]);const dt=(()=>{if(!_e)return l;const d=_e.toLowerCase(),p=l.filter(E=>E.title?.toLowerCase().includes(d)||E.agentId.toLowerCase().includes(d));if(Y.size===0)return p;const y=new Map;for(const E of p)y.set(E.id,E);for(const E of l){const O=Y.get(E.id);if(O===void 0)continue;const _=y.get(E.id);y.set(E.id,{..._??E,matchedMessagePreview:O})}return Array.from(y.values()).sort((E,O)=>new Date(O.updatedAt).getTime()-new Date(E.updatedAt).getTime())})();return s.useEffect(()=>{if(!f?.id||f.isGenerating!==!0||M.current)return;const d=typeof f.inFlightGeneration?.replayFromEventId=="number"?f.inFlightGeneration.replayFromEventId:null,p=T.current;p?.sessionId===f.id&&p.replayFromEventId===d||ge(f.id,f.inFlightGeneration,{silent:!0})},[f?.id,f?.isGenerating,f?.inFlightGeneration,ge]),s.useEffect(()=>{if(!I.current?.isGenerating||(M.current||ge(I.current.id,I.current.inFlightGeneration),!X.current||M.current||!I.current))return;const d=setInterval(async()=>{if(!X.current||M.current||!I.current){clearInterval(d);return}try{(await Bn(n)).sessions.find(E=>E.id===I.current?.id)?.isGenerating||(clearInterval(d),await be(I.current.id),A(""),W(""),N([]),j(!1),X.current=!1,de())}catch{}},3e3);return()=>clearInterval(d)},[ge,be,n,f,de]),s.useEffect(()=>lt.onBecameVisible(()=>{const p=I.current;if(!p||M.current)return;const y=fe.current;Dt(p.id,n).then(E=>{if(!(fe.current!==y||M.current)){if(E.session.isGenerating){A(""),W(""),N([]),j(!0),X.current=!0,ge(p.id,E.session.inFlightGeneration,{silent:!0});return}X.current&&(A(""),W(""),N([]),j(!1),X.current=!1,de(),be(p.id))}}).catch(()=>{})}),[ge,be,n,lt,de]),s.useEffect(()=>{const d=fe.current,p=n?`?projectId=${encodeURIComponent(n)}`:"",y=()=>fe.current!==d,E=ae=>{if(y())return;const U=JSON.parse(ae.data);if(ts(U)){Ir(U)||Ce();return}v(J=>J.some(ue=>ue.id===U.id)?J:[U,...J])},O=ae=>{if(y())return;const U=JSON.parse(ae.data);v(J=>[...J.map(pe=>pe.id===U.id?U:pe)]),I.current?.id===U.id&&(o(U),U.isGenerating&&!M.current&&ge(U.id,U.inFlightGeneration))},_=ae=>{if(y())return;const{id:U}=JSON.parse(ae.data);v(ue=>ue.filter(pe=>pe.id!==U));const J=m(n,U);J&&It(J),I.current?.id===U&&(o(null),k([]))},q=ae=>{if(y())return;const U=JSON.parse(ae.data),J=on(U);if(xe.current.some(ue=>ue.id===J.sessionId)||Ce(),!le.current.has(J.id)){if(I.current?.id===J.sessionId&&X.current&&!M.current&&J.role==="assistant"){k(ue=>ue.some(pe=>pe.id===J.id)?ue:[...ue,J]),A(""),W(""),N([]),j(!1),X.current=!1,de();return}I.current?.id===J.sessionId&&!X.current&&k(ue=>ue.some(pe=>pe.id===J.id)?ue:J.role==="user"?na(ue,J):[...ue,J])}},V=ae=>{if(y())return;const{id:U}=JSON.parse(ae.data);k(J=>J.filter(ue=>ue.id!==U))};return va(`/api/events${p}`,{events:{"chat:session:created":E,"chat:session:updated":O,"chat:session:deleted":_,"chat:message:added":q,"chat:message:deleted":V}})},[ge,m,n,de,Ce]),s.useEffect(()=>()=>{M.current&&(M.current.close(),M.current=null),T.current=null},[]),{sessions:l,activeSession:f,sessionsLoading:h,messages:S,messagesLoading:D,isStreaming:F,streamingText:Q,streamingThinking:se,streamingToolCalls:he,pendingMessages:ce,selectSession:ot,createSession:it,archiveSession:Lt,renameSession:Te,deleteSession:_t,sendMessage:je,editMessageAndResend:Ve,stopStreaming:Ot,clearPendingMessage:rt,loadMoreMessages:$t,hasMoreMessages:ye,searchQuery:Z,setSearchQuery:$,filteredSessions:dt,refreshSessions:Ce,agentsMap:R}}function cn(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function Or(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function qn(n,r){const i=Or(),m=r?.warm===!0,c=cn(),l=new Map;let v=!1,f=!1;return{mark(h){v||f||!i||l.has(h)||l.set(h,cn())},complete:h=>{if(!i||v||f){v=!0;return}v=!0,l.set("complete",cn());const z=Array.from(l.entries()).sort((P,F)=>P[1]-F[1]);let S=c;const k={};for(const[P,F]of z)k[P]=Math.max(0,F-S),S=F;const D=Math.max(0,cn()-c);try{console.debug("[room-open]",{roomId:n,warm:m,totalMs:D,phases:k,...h??{}})}catch{}},cancel(){f=!0,v=!0}}}const Qe="fusion:chat-active-room";class xa extends Error{roomId;constructor(r,i){super(r),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=i}}function ns(n){return[...n].sort((r,i)=>new Date(i.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function wt(n,r){const i=n.findIndex(c=>c.id===r.id);if(i===-1)return ns([r,...n]);const m=[...n];return m[i]=r,ns(m)}function Ge(n){try{return JSON.parse(n.data)}catch{return null}}function Br(n,r,i){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:n,role:"user",content:r,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...i?.length?{attachments:i}:{},createdAt:new Date().toISOString()}}function sa(n,r,i){if(n.some(c=>c.id===r.id))return n;const m=i?n.findIndex(c=>c.id===i):-1;if(m>=0){const c=[...n];return c[m]=r,c}if(r.role==="user"){const c=n.findIndex(l=>l.role==="user"&&l.id.startsWith("temp-")&&l.content.trim()===r.content.trim());if(c>=0){const l=[...n];return l[c]=r,l}}return[...n,r]}function zr(n,r){const{t:i}=st("app"),m=`${nt.CHAT_ROOMS}:${n??"global"}`,c=`${nt.ACTIVE_CHAT_ROOM_ID}:${n??"global"}`,l=s.useCallback(R=>`${nt.CHAT_ROOM_MESSAGES_PREFIX}${n??"global"}:${R}`,[n]),v=s.useCallback(R=>`${nt.CHAT_ROOM_MEMBERS_PREFIX}${n??"global"}:${R}`,[n]),[f,o]=s.useState(()=>{const R=Ye(m,{maxAgeMs:Zn});return Array.isArray(R)?R:[]}),[h,z]=s.useState(()=>f.length===0),[S,k]=s.useState(null),[D,P]=s.useState(()=>{const R=Ye(c,{maxAgeMs:Gs});return R?f.find(M=>M.id===R)??null:null}),[F,j]=s.useState([]),[Q,A]=s.useState([]),[se,W]=s.useState(!1),he=s.useRef(f),N=s.useRef(D),ce=s.useRef(0),H=s.useRef(n);he.current=f,N.current=D,H.current!==n&&(H.current=n,ce.current+=1);const Z=s.useCallback(async R=>{if(!R){j([]),A([]),W(!1);return}const M=qn(R.id,{warm:!1});M.mark("select");const T=Ye(l(R.id),{maxAgeMs:tr}),b=Ye(v(R.id),{maxAgeMs:Zn}),w=Array.isArray(T)&&T.length>0,K=Array.isArray(b)&&b.length>0;w||K?(M.mark("cache-hit"),w&&(A(T),M.mark("hydrate")),K&&j(b),W(!1)):(A([]),W(!0));try{const[g,xe]=await Promise.all([nr(R.id,n),zn(R.id,{limit:100,order:"desc"},n)]);M.mark("members-fetch"),M.mark("messages-fetch"),re(v(R.id),g.members,{maxBytes:5e5}),re(l(R.id),xe.messages,{maxBytes:5e5}),N.current?.id===R.id&&(j(g.members),A(xe.messages),M.mark("hydrate"))}catch{!w&&!K&&(j([]),A([]))}finally{W(!1),M.complete({warm:w,membersCached:K})}},[v,l,n]),$=s.useCallback(async()=>{he.current.length===0&&z(!0);try{const R=await sr({},n),M=ns(R.rooms);o(M),re(m,M,{maxBytes:5e5}),k(null);const T=Ye(c,{maxAgeMs:Gs})??Mt(Qe,n);if(T){const b=M.find(w=>w.id===T)??null;b?(P(b),Z(b)):(Ct(Qe,n),re(c,"",{maxBytes:5e5}))}}catch(R){const M=R instanceof Error?R.message:i("chatRooms.error.failedToLoad","Failed to load chat rooms");k(M),r?.(M,"error")}finally{z(!1)}},[c,r,Z,n,m]),Y=s.useCallback(R=>{if(!R){N.current=null,P(null),Ct(Qe,n),re(c,"",{maxBytes:5e5}),Z(null);return}const M=he.current.find(T=>T.id===R)??null;N.current=M,P(M),M&&(fn(Qe,M.id,n),re(c,M.id,{maxBytes:5e5}),Z(M))},[c,Z,n]),x=s.useCallback(async R=>{const T=(await ar({name:R.name,memberAgentIds:R.memberAgentIds},n)).room;return o(b=>wt(b,T)),N.current=T,P(T),fn(Qe,T.id,n),re(c,T.id,{maxBytes:5e5}),await Z(T),T},[c,Z,n]),L=s.useCallback(async R=>{await rr(R,n),o(M=>M.filter(T=>T.id!==R)),re(l(R),[],{maxBytes:5e5}),re(v(R),[],{maxBytes:5e5}),N.current?.id===R&&(N.current=null,P(null),j([]),A([]),Ct(Qe,n),re(c,"",{maxBytes:5e5}))},[c,v,l,n]),ye=s.useCallback(async(R,M)=>{const T=N.current,b=T?.id;if(!b)throw new Error(i("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const w=qn(b,{warm:!1}),K=M?.files?.map(I=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:I.name,originalName:I.name,mimeType:I.type||"application/octet-stream",size:I.size,createdAt:new Date().toISOString()})),g=Br(b,R,K?.length?K:M?.attachments);N.current?.id===b&&A(I=>{const G=[...I,g];return re(l(b),G,{maxBytes:5e5}),G});let xe=!1;try{const I=[];if(M?.files?.length)for(const fe of M.files)try{const Se=await or(b,fe,n);I.push(Se.attachment)}catch{throw new Error(i("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:fe.name}))}const G=[...M?.attachments??[],...I],X=await ir(b,{content:R,...G.length?{attachments:G}:{}},n);xe=!0,X.message?.createdAt&&T&&o(fe=>wt(fe,{...T,updatedAt:X.message.createdAt})),N.current?.id===b&&A(fe=>{const Se=sa(fe,X.message,g.id);return re(l(b),Se,{maxBytes:5e5}),Se});const le=await zn(b,{limit:100,order:"desc"},n);if(re(l(b),le.messages,{maxBytes:5e5}),N.current?.id!==b)return;A(le.messages),w.mark("hydrate")}catch(I){let G=null;try{const le=await zn(b,{limit:100,order:"desc"},n);G=le.messages,re(l(b),le.messages,{maxBytes:5e5}),N.current?.id===b&&(A(le.messages),w.mark("hydrate"))}catch{!xe&&N.current?.id===b&&A(le=>{const fe=le.filter(Se=>Se.id!==g.id);return re(l(b),fe,{maxBytes:5e5}),fe})}const X=G?.some(le=>le.role==="user"&&le.content.trim()===g.content.trim());if(xe||X){const le=I instanceof Error&&I.message.trim()?I.message:i("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new xa(le,b)}throw I}finally{w.complete({source:"send-room-message"})}},[l,n]),ie=s.useCallback(async R=>{!R||!he.current.some(M=>M.id===R)||(await cr(R,n),re(l(R),[],{maxBytes:5e5}),N.current?.id===R&&A([]))},[l,n]);return s.useEffect(()=>{$()},[$]),s.useEffect(()=>{const R=ce.current,M=n?`/api/events?projectId=${encodeURIComponent(n)}`:"/api/events";return va(M,{onReconnect:()=>{Pt({view:"useChatRooms",trigger:"sse-reconnect",projectId:n,replayAttempted:!1});const T=N.current?.id;if(T){const b=qn(T,{warm:!0});b.mark("sse-reconnect-refresh"),$().finally(()=>b.complete({source:"sse-reconnect"}));return}$()},events:{"chat:room:created":T=>{if(ce.current!==R)return;const b=Ge(T);b&&o(w=>wt(w,b))},"chat:room:updated":T=>{if(ce.current!==R)return;const b=Ge(T);b&&(o(w=>wt(w,b)),N.current?.id===b.id&&P(b))},"chat:room:deleted":T=>{if(ce.current!==R)return;const b=Ge(T);b?.id&&(o(w=>w.filter(K=>K.id!==b.id)),re(l(b.id),[],{maxBytes:5e5}),re(v(b.id),[],{maxBytes:5e5}),N.current?.id===b.id&&(N.current=null,P(null),j([]),A([]),Ct(Qe,n),re(c,"",{maxBytes:5e5})))},"chat:room:member:added":T=>{if(ce.current!==R)return;const b=Ge(T);!b||N.current?.id!==b.roomId||j(w=>{if(w.some(g=>g.agentId===b.agentId))return w;const K=[...w,b];return re(v(b.roomId),K,{maxBytes:5e5}),K})},"chat:room:member:removed":T=>{if(ce.current!==R)return;const b=Ge(T);!b||N.current?.id!==b.roomId||j(w=>{const K=w.filter(g=>g.agentId!==b.agentId);return re(v(b.roomId),K,{maxBytes:5e5}),K})},"chat:room:message:added":T=>{if(ce.current!==R)return;const b=Ge(T);b&&(o(w=>{const K=w.find(g=>g.id===b.roomId);return K?wt(w,{...K,updatedAt:b.createdAt}):w}),N.current?.id===b.roomId&&A(w=>{const K=sa(w,b);return K===w?w:(re(l(b.roomId),K,{maxBytes:5e5}),K)}))},"chat:room:message:updated":T=>{if(ce.current!==R)return;const b=Ge(T);!b||N.current?.id!==b.roomId||A(w=>{const K=w.map(g=>g.id===b.id?b:g);return re(l(b.roomId),K,{maxBytes:5e5}),K})},"chat:room:message:deleted":T=>{if(ce.current!==R)return;const b=Ge(T);b?.id&&A(w=>{const K=w.filter(xe=>xe.id!==b.id),g=N.current?.id;return g&&re(l(g),K,{maxBytes:5e5}),K})},"chat:room:messages:cleared":T=>{if(ce.current!==R)return;const b=Ge(T);b?.roomId&&(re(l(b.roomId),[],{maxBytes:5e5}),N.current?.id===b.roomId&&A([]),o(w=>{const K=w.find(g=>g.id===b.roomId);return K?wt(w,{...K,updatedAt:new Date().toISOString()}):w}))}}})},[c,v,l,n,$]),s.useEffect(()=>{D&&(f.some(R=>R.id===D.id)||(N.current=null,P(null),j([]),A([]),Ct(Qe,n),re(c,"",{maxBytes:5e5})))},[D,c,n,f]),{rooms:f,roomsLoading:h,roomsError:S,activeRoom:D,activeRoomMembers:F,messages:Q,messagesLoading:se,selectRoom:Y,createRoom:x,deleteRoom:L,sendRoomMessage:ye,clearRoom:ie,refreshRooms:$}}const Ft={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},aa=200;function ss(n){if(!n)return null;const r=new Date(n).getTime();return Number.isFinite(r)?r:null}function Ca(n){const r=Object.entries(n);if(r.length<=aa)return n;const i=r.map(([m,c])=>({id:m,timestamp:c,value:ss(c)??0})).sort((m,c)=>c.value-m.value).slice(0,aa);return Object.fromEntries(i.map(({id:m,timestamp:c})=>[m,c]))}function ln(n){if(!n)return{};try{const r=JSON.parse(n);if(!r||typeof r!="object")return{};const i={};for(const[m,c]of Object.entries(r))typeof m=="string"&&typeof c=="string"&&(i[m]=c);return Ca(i)}catch{return{}}}function Hr(n){const[r,i]=s.useState(()=>{try{return ln(Mt(Ft.direct,n))}catch{return{}}}),[m,c]=s.useState(()=>{try{return ln(Mt(Ft.room,n))}catch{return{}}});s.useEffect(()=>{try{i(ln(Mt(Ft.direct,n)))}catch{i({})}try{c(ln(Mt(Ft.room,n)))}catch{c({})}},[n]);const l=s.useMemo(()=>({direct:r,room:m}),[r,m]),v=s.useCallback((S,k)=>{const D=Ca(k);try{fn(Ft[S],JSON.stringify(D),n)}catch{}return D},[n]),f=s.useCallback((S,k)=>{if(S==="direct"){i(D=>v(S,k(D)));return}c(D=>v(S,k(D)))},[v]),o=s.useCallback((S,k,D)=>{const P=ss(D);if(P===null)return!1;const F=l[S][k],j=ss(F);return j===null?!0:P>j},[l]),h=s.useCallback((S,k,D)=>{if(!k)return;const P=D??new Date().toISOString();f(S,F=>({...F,[k]:P}))},[f]),z=s.useCallback((S,k)=>{k.length!==0&&f(S,D=>{const P={...D};for(const F of k)F.id&&(P[F.id]=F.lastActivityAt??new Date().toISOString());return P})},[f]);return{isUnread:o,markRead:h,markAllRead:z}}function ra(n){return n.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function Sa(n,r){const i=r.trim();if(!i)return!0;const m=ra(i);return ra(n).includes(m)||n.toLowerCase().includes(i.toLowerCase())}function oa({agents:n,filter:r,highlightedIndex:i,visible:m,onSelect:c,position:l="below",roomMemberIds:v,roomName:f}){const{t:o}=st("app"),h=s.useMemo(()=>n.filter(F=>Sa(F.name,r)),[n,r]),z=!!v,S=z&&r.trim().length>0,k=s.useMemo(()=>z?h.filter(F=>v?.has(F.id)):h,[h,v,z]),D=s.useMemo(()=>z?h.filter(F=>!v?.has(F.id)):[],[h,v,z]),P=S?[...k,...D]:k;return m?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${l}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":o("agentMention.suggestionsLabel","Agent mention suggestions"),children:P.length===0?t.jsx("div",{className:"agent-mention-empty",children:o("agentMention.noAgentsFound","No agents found")}):t.jsxs(t.Fragment,{children:[z&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:f?o("agentMention.membersOf","Members of #{{roomName}}",{roomName:f}):o("agentMention.roomMembers","Room members")}),k.map((F,j)=>t.jsxs("button",{type:"button",className:`agent-mention-item${j===i?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${F.id}`,onMouseDown:Q=>Q.preventDefault(),onClick:()=>c(F),role:"option","aria-selected":j===i,children:[t.jsx(gn,{agent:F,size:20}),z&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":o("agentMention.roomMemberBadge","Room member")}),t.jsx("span",{className:"agent-mention-name",children:F.name}),t.jsx("span",{className:"agent-mention-role",children:F.role})]},F.id)),z&&!S&&D.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:o("agentMention.typeToSearch","Type to search other agents")}),z&&S&&D.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:o("agentMention.otherAgents","Other agents")}),D.map((F,j)=>{const Q=k.length+j;return t.jsxs("button",{type:"button",className:`agent-mention-item${Q===i?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${F.id}`,onMouseDown:A=>A.preventDefault(),onClick:()=>c(F),role:"option","aria-selected":Q===i,children:[t.jsx(gn,{agent:F,size:20}),t.jsx("span",{className:"agent-mention-name",children:F.name}),t.jsx("span",{className:"agent-mention-role",children:F.role})]},F.id)})]})]})}):null}function Ur(n,r){return n+r}function Kr({visible:n,position:r,tasks:i,files:m,selectedIndex:c,onSelectTask:l,onSelectFile:v,loading:f}){const{t:o}=st("app");if(!n)return null;const h=i.length>0,z=m.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:r.top,left:r.left},"data-testid":"file-mention-popup",onMouseDown:S=>{S.preventDefault()},children:[f&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!f&&!h&&!z&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:o("fileMention.empty","No tasks or files found")}),!f&&(h||z)&&t.jsxs("div",{className:"file-mention-popup-groups",children:[h&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:o("fileMention.taskHeader","Tasks")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":o("fileMention.taskMatches","Task matches"),children:i.map((S,k)=>{const D=k;return t.jsxs("li",{className:`file-mention-popup-item${D===c?" file-mention-popup-item--selected":""}`,onClick:()=>l(S),role:"option","aria-selected":D===c,"data-testid":`task-mention-item-${D}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(wa,{})}),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:S.id}),t.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${S.column}`,children:S.column})]}),t.jsx("span",{className:"file-mention-popup-item-path",children:S.title})]})]},S.id)})})]}),z&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:o("fileMention.fileHeader","Files")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":o("fileMention.fileMatches","File matches"),children:m.map((S,k)=>{const D=Ur(i.length,k),P=lr(S.path);return t.jsxs("li",{className:`file-mention-popup-item${D===c?" file-mention-popup-item--selected":""}`,onClick:()=>v(S),role:"option","aria-selected":D===c,"data-testid":`file-mention-item-${D}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(dr,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:S.name}),P&&t.jsx("span",{className:"file-mention-popup-item-path",children:P})]})]},S.path)})})]})]})]})}function Gr(n,r=[],i){const m=n.trim().replace(/^#/,""),c=(v,f)=>i?i(v,f):f;if(!m)return{ok:!1,error:c("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(m))return{ok:!1,error:c("createRoom.lowercase","Use lowercase letters only.")};const l=m.toLowerCase();return l.length>80?{ok:!1,error:c("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(l)?/^[-_]|[-_]$/.test(l)?{ok:!1,error:c("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:r.some(v=>v.toLowerCase()===l)?{ok:!1,error:c("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:l}:{ok:!1,error:c("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function Vr({isOpen:n,onClose:r,onCreate:i,projectId:m,existingRoomNames:c=[]}){const{t:l}=st("app"),[v,f]=s.useState(""),[o,h]=s.useState([]),[z,S]=s.useState(""),[k,D]=s.useState([]),[P,F]=s.useState(!1),[j,Q]=s.useState(null),[A,se]=s.useState(!1),W=s.useRef(null),he=s.useRef(null);s.useEffect(()=>{n&&(he.current=document.activeElement instanceof HTMLElement?document.activeElement:null,F(!0),Q(null),ur(void 0,m).then(x=>h(x)).catch(()=>{h([]),Q(l("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>F(!1)))},[n,m]),s.useEffect(()=>{if(!n){f(""),S(""),D([]),Q(null),se(!1);return}const x=window.requestAnimationFrame(()=>W.current?.focus());return()=>window.cancelAnimationFrame(x)},[n]),s.useEffect(()=>{if(!n)return;const x=L=>{L.key==="Escape"&&r()};return document.addEventListener("keydown",x),()=>document.removeEventListener("keydown",x)},[n,r]),s.useEffect(()=>{n||he.current?.focus()},[n]);const N=s.useMemo(()=>Gr(v,c,l),[v,c,l]),ce=s.useMemo(()=>{const x=z.trim().toLowerCase();return x?o.filter(L=>L.name.toLowerCase().includes(x)):o},[o,z]),H=s.useMemo(()=>o.filter(x=>k.includes(x.id)),[o,k]),Z=N.ok&&k.length>0&&!A&&!P;if(!n)return null;const $=x=>{A||D(L=>L.includes(x)?L.filter(ye=>ye!==x):[...L,x])},Y=async()=>{if(!N.ok){Q(N.error);return}if(k.length===0){Q(l("createRoom.selectMember","Select at least one member."));return}Q(null),se(!0);try{await i({name:N.name,displayName:`#${N.name}`,memberAgentIds:k}),r()}catch(x){Q(x instanceof Error?x.message:l("createRoom.failedCreate","Failed to create room."))}finally{se(!1)}};return Ga.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:x=>x.target===x.currentTarget&&r(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":l("createRoom.title","Create room"),onClick:x=>x.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:l("createRoom.title","Create room")}),t.jsx("button",{type:"button",className:"modal-close","aria-label":l("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:l("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:W,id:"create-room-name",className:"input",value:v,disabled:A,onChange:x=>{const L=x.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();f(L)}})]}),!N.ok&&t.jsx("div",{className:"form-error",children:N.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:l("createRoom.members","Members")}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:l("createRoom.searchAgents","Search agents"),value:z,disabled:A,onChange:x=>S(x.target.value)})]}),H.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:H.map(x=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>$(x.id),disabled:A,children:[x.name," ×"]},x.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:P?t.jsx("div",{className:"create-room-modal-empty",children:t.jsx(mr,{label:l("createRoom.loadingAgents","Loading agents...")})}):ce.length===0?t.jsx("div",{className:"create-room-modal-empty",children:o.length===0?l("createRoom.noAgents","No agents in this project yet."):l("createRoom.noMatch","No agents match your search.")}):ce.map(x=>{const L=k.includes(x.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${L?" create-room-modal-member-row--selected":""}`,onClick:()=>$(x.id),disabled:A,children:[t.jsx(gn,{agent:x,size:20}),t.jsx("span",{children:x.name}),t.jsx("span",{className:"create-room-modal-member-role",children:x.role})]},x.id)})}),j&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:j})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:A,children:l("actions.cancel","Cancel")}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void Y(),disabled:!Z,children:A?l("createRoom.creating","Creating..."):l("createRoom.create","Create room")})]})]})}),document.body)}function Wr({cliSessionId:n,tier:r,projectId:i,renderTranscript:m,renderComposer:c,queuedCount:l=0,terminalProps:v}){const{t:f}=st("app"),o=r==="generic",[h,z]=s.useState(o?"terminal":"transcript");if(o)return t.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:t.jsx(Js,{sessionId:n,projectId:i,...v})});const S=h==="terminal";return t.jsxs("div",{className:"cli-chat-surface","data-tier":r,"data-view":h,children:[t.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":f("cliChat.viewToggleLabel","Chat view"),children:[t.jsxs("button",{type:"button",role:"tab","aria-selected":!S,className:`cli-chat-surface__tab${S?"":" is-active"}`,onClick:()=>z("transcript"),children:[t.jsx(mn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:f("cliChat.transcriptTab","Transcript")})]}),t.jsxs("button",{type:"button",role:"tab","aria-selected":S,className:`cli-chat-surface__tab${S?" is-active":""}`,onClick:()=>z("terminal"),children:[t.jsx(hr,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:f("cliChat.terminalTab","Terminal")})]})]}),t.jsx("div",{className:"cli-chat-surface__body",children:S?t.jsx(Js,{sessionId:n,projectId:i,...v}):m()}),!S&&t.jsxs("div",{className:"cli-chat-surface__composer",children:[l>0&&t.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:f("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:l})}),c()]})]})}const Xr=200,qr=8,Qr=8;function ia(){return new DOMException("The operation was aborted.","AbortError")}function ca(n,r){return r.aborted?Promise.reject(ia()):new Promise((i,m)=>{const c=()=>m(ia());r.addEventListener("abort",c,{once:!0}),n.then(l=>{r.removeEventListener("abort",c),i(l)},l=>{r.removeEventListener("abort",c),m(l)})})}function la(n,r,i){const m=n.slice(0,r),c=n.slice(r+1),l=c.match(/[\s]|$/),v=l?l.index??c.length:c.length,f=c.slice(v);return`${m}${i}${f}`}function Yr(n={}){const{projectId:r,workspace:i="project"}=n,[m,c]=s.useState(!1),[l,v]=s.useState(""),[f,o]=s.useState(-1),[h,z]=s.useState([]),[S,k]=s.useState([]),[D,P]=s.useState(!1),[F,j]=s.useState(0),Q=s.useRef(null),A=s.useRef(null),se=[...h.map($=>({kind:"task",task:$})),...S.map($=>({kind:"file",file:$}))];s.useEffect(()=>()=>{Q.current&&clearTimeout(Q.current),A.current?.abort()},[]);const W=s.useCallback(($,Y)=>{if(Y<0||Y>$.length){c(!1);return}const x=L=>/[a-zA-Z0-9/_.-]/.test(L);for(let L=Y-1;L>=0;L--){if($[L]==="#"){if(L===0){const ie=$.slice(L+1,Y);o(L),v(ie),j(0),c(!0);return}const ye=$[L-1];if(/[\s,.;:!?'"()[\]{}]/.test(ye)){const ie=$.slice(L+1,Y);o(L),v(ie),j(0),c(!0);return}c(!1);return}if(!x($[L])){c(!1);return}}c(!1)},[]),he=s.useCallback(()=>{A.current?.abort(),c(!1),v(""),o(-1),z([]),k([]),j(0),P(!1)},[]),N=s.useCallback(async $=>{if(!$.trim()){z([]),k([]),P(!1);return}A.current?.abort();const Y=new AbortController;A.current=Y;try{P(!0);const[x,L]=await Promise.allSettled([ca(fr(20,0,r,$),Y.signal),ca(gr($,i,r),Y.signal)]);if(Y.signal.aborted)return;const ye=x.status==="fulfilled"?x.value.slice(0,qr).map(R=>({id:R.id,title:R.title??"",column:R.column})):[],ie=L.status==="fulfilled"?L.value.files.slice(0,Qr):[];z(ye),k(ie),j(0)}catch(x){x.name!=="AbortError"&&(z([]),k([]))}finally{Y.signal.aborted||P(!1)}},[i,r]);s.useEffect(()=>{if(m)return Q.current&&clearTimeout(Q.current),Q.current=setTimeout(()=>{N(l)},Xr),()=>{Q.current&&clearTimeout(Q.current)}},[l,m,N]);const ce=s.useCallback(($,Y)=>!m||f<0?Y:la(Y,f,`#${$.id}`),[m,f]),H=s.useCallback(($,Y)=>!m||f<0?Y:la(Y,f,`#${$.path}`),[m,f]),Z=s.useCallback(($,Y)=>{if(!m||se.length===0)return!1;switch($.key){case"ArrowDown":return $.preventDefault(),j(x=>Math.min(x+1,se.length-1)),!0;case"ArrowUp":return $.preventDefault(),j(x=>Math.max(x-1,0)),!0;case"Enter":case"Tab":return se[F]?($.preventDefault(),!0):!1;case"Escape":return $.preventDefault(),he(),!0;default:return!1}},[m,se,F,he]);return{mentionActive:m,tasks:h,files:S,combinedItems:se,loading:D,mentionQuery:l,selectedIndex:F,setSelectedIndex:j,detectMention:W,selectTask:ce,selectFile:H,dismissMention:he,handleKeyDown:Z}}const Qn=new Map,hn=new Map;function is(n){return n??"global"}function as(n){return`${nt.DISCOVERED_SKILLS_PREFIX}${is(n)}`}function xt(n){return Ye(as(n),{maxAgeMs:Zn})}function Jr(n,r){for(const i of hn.get(n)??[])i(r)}async function Zr(n){const r=is(n),i=Qn.get(r);if(i)return i;const m=pr(n).finally(()=>{Qn.delete(r)});return Qn.set(r,m),m}function eo(n){const[r,i]=s.useState(()=>xt(n)??[]),[m,c]=s.useState(()=>xt(n)===null),l=s.useRef(xt(n)!==null),v=is(n);s.useEffect(()=>{const h=xt(n)??[];i(h),c(xt(n)===null),l.current=xt(n)!==null},[n]),s.useEffect(()=>{const h=hn.get(v)??new Set;return h.add(i),hn.set(v,h),()=>{h.delete(i),h.size===0&&hn.delete(v)}},[v]);const f=s.useCallback(async()=>{try{const h=await Zr(n);l.current=!0,re(as(n),h,{maxBytes:5e5}),Jr(v,h)}catch{l.current||It(as(n))}finally{c(!1)}},[n,v]);s.useEffect(()=>{f()},[f]);const o=s.useCallback(async()=>{c(!0),await f()},[f]);return{skills:r,loading:m,refresh:o}}function to(n,r){const i=n.reduce((m,c)=>m+(c.content?.length??0),0)+(r?.length??0);return Math.ceil(i/4)}function da(n){if(!Number.isFinite(n)||n<=0)return"0";if(n<1e3)return String(Math.round(n));const r=n/1e3;return r<10?`~${Number(r.toFixed(1))}k`:`${Math.round(r)}k`}const cs=640,no=200,ua="__SKIP__";let Yn=!1;function so(n,r=cs){return n>r?"auto":"hidden"}function ao(n,r=cs){return Math.max(40,Math.min(n,r))}function ro(n,r){const i=new Date(n),c=new Date().getTime()-i.getTime(),l=Math.floor(c/1e3),v=Math.floor(l/60),f=Math.floor(v/60),o=Math.floor(f/24);return l<60?r("chat.relativeTimeJustNow","just now"):v<60?r("chat.relativeTimeMinutes","{{count}}m ago",{count:v}):f<24?r("chat.relativeTimeHours","{{count}}h ago",{count:f}):o<7?r("chat.relativeTimeDays","{{count}}d ago",{count:o}):i.toLocaleDateString()}const St="__fn_agent__",oo=280,dn=180,un=500,ma="fusion:chat-sidebar-width",Jn="fusion:chat-scope",io="fusion:chat-draft:";function ha(n,r){return n.slice(r+1).find(i=>i.role==="user")?.content}function fa(n,r){return r?`${io}${n}:${r}`:null}function ga(n){if(!n)return"";try{return localStorage.getItem(n)??""}catch{return""}}const co=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function pa(n){const r=/(^|[\s])\/([^\s]*)$/.exec(n);if(!r)return null;const i=r[1]??"",m=r[2]??"",c=r.index+i.length;return{filter:m,start:c,end:n.length}}function lo(n,r){const i=n.slice(0,r),m=/(^|[\s\n])@([\w-]*)$/.exec(i);if(!m)return null;const c=m[2]??"",l=i.length-c.length-1;return{filter:c,start:l,end:r}}function uo(n){const r=n?.runtimeConfig;if(!r||typeof r!="object")return null;const i=Reflect.get(r,"modelProvider"),m=Reflect.get(r,"modelId");return typeof i!="string"||i.trim().length===0||typeof m!="string"||m.trim().length===0?null:{provider:i,modelId:m}}function ba(n,r,i){if(n?.modelProvider&&n?.modelId)return{provider:n.modelProvider,modelId:n.modelId};const m=uo(r??void 0);return m||(i.provider&&i.modelId?{provider:i.provider,modelId:i.modelId}:null)}function mo({projectId:n,defaultModel:r,onClose:i,onCreate:m}){const{t:c}=st("app"),[l,v]=s.useState("agent"),{agents:f,loading:o}=rs(n),[h,z]=s.useState(""),{models:S,favoriteProviders:k,favoriteModels:D,loading:P,refresh:F}=ya(),j=r.provider&&r.modelId?`${r.provider}/${r.modelId}`:"",[Q,A]=s.useState(j),[se,W]=s.useState(k),[he,N]=s.useState(D);s.useEffect(()=>{W(k)},[k]),s.useEffect(()=>{N(D)},[D]),s.useEffect(()=>{j&&A(x=>x||j)},[j]);const ce=s.useCallback(async x=>{const L=se,ie=L.includes(x)?L.filter(R=>R!==x):[x,...L];W(ie);try{await Ys({favoriteProviders:ie,favoriteModels:he}),await F()}catch{W(L)}},[se,he,F]),H=s.useCallback(async x=>{const L=he,ie=L.includes(x)?L.filter(R=>R!==x):[x,...L];N(ie);try{await Ys({favoriteProviders:se,favoriteModels:ie}),await F()}catch{N(L)}},[he,se,F]),Z=Q||j,$=x=>{if(x.preventDefault(),l==="agent"){if(!h)return;m({agentId:h});return}if(!Z)return;const L=Z.indexOf("/");if(L<=0)return;const ye=Z.slice(0,L),ie=Z.slice(L+1);m({agentId:St,modelProvider:ye,modelId:ie})},Y=l==="agent"?!h:!Z;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:i,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:x=>x.stopPropagation(),children:[t.jsx("h3",{children:c("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${l==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{v("agent")},children:c("chat.newChatModeAgent","Agent")}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{v("model"),z(""),A(x=>x||j)},children:c("chat.newChatModeModel","Model")})]}),t.jsxs("form",{onSubmit:$,children:[l==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:[c("chat.newChatModeAgent","Agent"),o?t.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingAgents","Loading agents...")}):f.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:c("chat.noAgentsAvailable","No agents available")}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:f.map(x=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${h===x.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>z(x.id),"data-testid":`agent-option-${x.id}`,children:[t.jsx(es,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:x.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:x.role})]},x.id))})]}),l==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:P?t.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingModels","Loading models...")}):t.jsx(Er,{models:S,value:Q,onChange:A,label:c("chat.newChatModeModel","Model"),placeholder:c("chat.selectModel","Select a model"),favoriteProviders:se,onToggleFavorite:ce,favoriteModels:he,onToggleModelFavorite:H})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:i,children:c("chat.cancel","Cancel")}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:Y,children:c("chat.create","Create")})]})]})]})})}function xo({projectId:n,addToast:r,floating:i=!1,compactLayout:m=!1,onPopOut:c,onMaximize:l,onMinimize:v,onClose:f}){const{t:o}=st("app");s.useEffect(()=>(Pt({view:"ChatView",trigger:Yn?"route-active":"remount",projectId:n,replayAttempted:!1}),Yn=!1,()=>{Yn=!0,Pt({view:"ChatView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{activeSession:h,sessionsLoading:z,messages:S,messagesLoading:k,isStreaming:D,streamingText:P,streamingThinking:F,streamingToolCalls:j,selectSession:Q,createSession:A,archiveSession:se,renameSession:W,deleteSession:he,sendMessage:N,editMessageAndResend:ce,stopStreaming:H,pendingMessages:Z,clearPendingMessage:$,loadMoreMessages:Y,hasMoreMessages:x,searchQuery:L,setSearchQuery:ye,filteredSessions:ie,agentsMap:R}=$r(n,r),[M,T]=s.useState(!1),b=!0,[w,K]=s.useState(()=>{try{if(localStorage.getItem(Jn)==="rooms"&&b)return"rooms"}catch{}return"direct"}),g=zr(n,r),{isUnread:xe,markRead:I}=Hr(n),[G,X]=s.useState(()=>{const e=fa(w,w==="rooms"?g.activeRoom?.id:h?.id);return ga(e)}),[le,fe]=s.useState(null),[Se,Ce]=s.useState(null),[at,Ie]=s.useState(""),[Je,De]=s.useState(null),[be,Pe]=s.useState(null),[rt,de]=s.useState(!0),[Le,ge]=s.useState(oo),[ot,it]=s.useState(!1),{agentsMap:Lt}=rs(n),Te=s.useMemo(()=>R.size>0?R:Lt,[Lt,R]),{models:_t,defaultProvider:$t,defaultModelId:Ot}=ya(),ct=s.useMemo(()=>({provider:$t,modelId:Ot}),[Ot,$t]),{skills:lt,loading:Bt}=eo(n),[je,Ve]=s.useState(!1),[_e,dt]=s.useState(""),[d,p]=s.useState(0),[y,E]=s.useState(""),[O,_]=s.useState(!1),[q,V]=s.useState(0),[ee,ae]=s.useState(-1),[U,J]=s.useState([]),[ue,pe]=s.useState(!1),[ut,zt]=s.useState(!1),[mt,ls]=s.useState({}),[Ht,We]=s.useState(!1),[Ut,kt]=s.useState(!1),{pushNav:ds}=br(),[,Kt]=s.useState(!1),[Ma,ka]=s.useState({top:0,left:0}),oe=Yr({projectId:n}),pn=s.useCallback(e=>{if(!e||!oe.mentionActive)return;const a=e.getBoundingClientRect();ka({top:a.top-260,left:a.left+8})},[oe.mentionActive]),us=s.useRef(null),ms=s.useRef(null),hs=s.useRef(null),fs=s.useRef(null),ke=s.useRef(!1),Gt=s.useRef(null),gs=s.useRef(null),Xe=s.useRef(null),Vt=s.useRef(0),bn=s.useRef(null),Rt=s.useRef(null),$e=s.useRef(null),Re=s.useRef(null),vn=s.useRef(null),Wt=s.useRef(!1),Oe=s.useRef(null),Be=s.useRef(null),Me=s.useRef(null),Xt=s.useRef(null),ps=s.useRef([]),ht=s.useRef(0),At=s.useRef(new Map),yn=s.useRef(!1),qt=vr(),Ze=qt==="mobile",wn=qt==="tablet",bs=s.useRef(null),[Ra,vs]=s.useState(!1);s.useLayoutEffect(()=>{if(!i){vs(!1);return}const e=bs.current;if(!e||typeof ResizeObserver>"u")return;const a=()=>{vs(e.getBoundingClientRect().width<=768)};a();const u=new ResizeObserver(a);return u.observe(e),()=>u.disconnect()},[i]);const te=Ze||Ra||m;s.useEffect(()=>{h?.id&&I("direct",h.id,h.lastMessageAt??h.updatedAt)},[h?.id,h?.lastMessageAt,h?.updatedAt,I]),s.useEffect(()=>{g.activeRoom?.id&&I("room",g.activeRoom.id,g.activeRoom.updatedAt)},[g.activeRoom?.id,g.activeRoom?.updatedAt,I]),s.useEffect(()=>{if(!h?.id||S.length===0)return;const e=S[S.length-1];I("direct",h.id,e?.createdAt??h.lastMessageAt??h.updatedAt)},[h?.id,h?.lastMessageAt,h?.updatedAt,I,S]),s.useEffect(()=>{if(!g.activeRoom?.id||g.messages.length===0)return;const e=g.messages[g.messages.length-1];I("room",g.activeRoom.id,e?.createdAt??g.activeRoom.updatedAt)},[I,g.activeRoom?.id,g.activeRoom?.updatedAt,g.messages]),s.useEffect(()=>{try{const e=localStorage.getItem(ma);if(!e)return;const a=Number.parseInt(e,10);if(Number.isNaN(a))return;const u=Math.max(dn,Math.min(un,a));ge(u)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(Jn);if(e==="direct"){K("direct");return}e==="rooms"&&b&&K("rooms")}catch{}},[b]),s.useEffect(()=>{try{localStorage.setItem(Jn,w)}catch{}},[b,w]);const Ae=fa(w,w==="rooms"?g.activeRoom?.id:h?.id),xn=s.useRef(Ae);s.useEffect(()=>{Ae!==xn.current&&(xn.current=Ae,X(ga(Ae)))},[Ae]),s.useEffect(()=>{if(!(!Ae||xn.current!==Ae))try{if(G){localStorage.setItem(Ae,G);return}localStorage.removeItem(Ae)}catch{}},[Ae,G]);const ve=w==="rooms"&&!!g.activeRoom,{keyboardOverlap:ys,keyboardOpen:Qt}=yr({enabled:(te||wn)&&(!!h||ve),allowNonMobileViewport:wn}),Nt=wn&&Qt,Ne=s.useMemo(()=>{const e=_e.trim().toLowerCase();return(e?lt.filter(u=>u.name.toLowerCase().includes(e)):lt).slice(0,10)},[lt,_e]),ft=s.useMemo(()=>Array.from(Te.values()),[Te]),ze=s.useMemo(()=>w!=="rooms"||!g.activeRoom?null:{roomId:g.activeRoom.id,roomName:g.activeRoom.name,memberIds:new Set(g.activeRoomMembers.map(e=>e.agentId))},[b,w,g.activeRoom,g.activeRoomMembers]),et=s.useMemo(()=>{const e=ft.filter(C=>Sa(C.name,y));if(!ze)return e;const a=e.filter(C=>ze.memberIds.has(C.id));if(y.trim().length===0)return a;const u=e.filter(C=>!ze.memberIds.has(C.id));return[...a,...u]},[ft,y,ze]),Cn=s.useMemo(()=>{const e=new Map;for(const a of ft)e.set(a.name.toLowerCase(),a);return e},[ft]),Aa=s.useMemo(()=>Ne.map(e=>e.id).join("\0"),[Ne]);s.useEffect(()=>{p(0)},[Aa]),s.useEffect(()=>{V(0)},[y,O]),s.useEffect(()=>()=>{$e.current!==null&&window.clearTimeout($e.current)},[]),s.useEffect(()=>{const e=ms.current;if(!e||!x||k)return;const a=new IntersectionObserver(u=>{u[0].isIntersecting&&Y()},{threshold:.1});return a.observe(e),()=>a.disconnect()},[x,k,Y]);const gt=s.useCallback(()=>ve?g.activeRoom?.id??null:h?.id??null,[ve,g.activeRoom?.id,h?.id]),ws=s.useCallback((e,a)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(a)}"]`):e.querySelector(`.chat-message[data-message-id="${a.replace(/"/g,'\\"')}"]`),[]),Yt=s.useCallback(()=>{const e=Re.current,a=gt();if(!e||!a)return;const u=e.scrollTop,C=e.querySelectorAll(".chat-message[data-message-id]"),B=Array.from(C).find(we=>we.offsetTop+we.offsetHeight>=u)??C[0]??null,ne=B?.getAttribute("data-message-id")??null,me=B?B.offsetTop-u:0;Rt.current={threadId:a,scrollTop:u,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:ne,anchorOffset:me,wasPinnedBefore:!ke.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[gt]),xs=s.useCallback(()=>{const e=Re.current;if(!e)return;const u=e.scrollTop+e.clientHeight>=e.scrollHeight-50;zt(!u),ke.current=!u,Yt()},[Yt]),He=s.useCallback((e,a)=>{if(!e.isConnected||!a?.force&&ke.current)return;let u=0,C=0,B=-1;const ne=6,me=()=>{if(e.isConnected&&!(!a?.force&&ke.current)){if(e.scrollTop=e.scrollHeight,e.scrollHeight===B?C+=1:(C=0,B=e.scrollHeight),u+=1,u>=ne||C>=2){zt(!1),ke.current=!1;return}window.requestAnimationFrame(me)}};me()},[]),Et=ve?g.messages:S;s.useLayoutEffect(()=>{const e=Re.current,a=gt(),u=Rt.current;if(!e||!a||!u||u.threadId!==a||u.wasPinnedBefore)return;const C=(typeof performance<"u"?performance.now():Date.now())-u.capturedAtMs,B=e.scrollHeight>e.clientHeight,ne=C>3e3,me=u.scrollTop<=0&&u.anchorOffset<=0&&B;if(!ke.current||ne||me){Rt.current=null;return}let we=u.scrollTop;if(u.anchorMessageId){const Ke=ws(e,u.anchorMessageId);Ke?we=Ke.offsetTop-u.anchorOffset:we=u.scrollTop+(e.scrollHeight-u.scrollHeight)}else we=u.scrollTop+(e.scrollHeight-u.scrollHeight);e.scrollTop=Math.max(0,we),ke.current=!0,zt(!0),Rt.current=null},[Et,gt,ws]);const Sn=s.useCallback(e=>{},[Et.length,ve]),Fe=s.useCallback(e=>{Sn(e);const a=Re.current;a&&(Rt.current=null,ke.current=!1,He(a))},[He,Sn]);s.useLayoutEffect(()=>{Xe.current!==null&&(window.clearTimeout(Xe.current),Xe.current=null);const e=ve?g.activeRoom?.id??null:h?.id??null;if(!e){Gt.current=null;return}const a={threadId:e,loaded:ve?!g.messagesLoading:!k,hasMessages:ve?g.messages.length>0:S.length>0},u=Gt.current,C=u?.threadId!==e,B=u?.threadId===e&&!u.loaded&&a.loaded,ne=u?.threadId===e&&!u.hasMessages&&a.hasMessages;if(!(u===null||C||B||ne))return;const we=Re.current;if(we)return Sn(C?"thread-change":B?"finished-loading":ne?"first-messages":"mount"),He(we,{force:!0}),ve||(Xe.current=window.setTimeout(()=>{if(Xe.current=null,ke.current)return;const Ke=Re.current;Ke&&He(Ke)},250)),Gt.current=a,()=>{Xe.current!==null&&(window.clearTimeout(Xe.current),Xe.current=null)}},[ve,g.activeRoom?.id,g.messages.length,g.messagesLoading,h?.id,S.length,k,He]),s.useEffect(()=>{!D||ke.current||Fe("streaming")},[D,P,F,Fe]),s.useEffect(()=>{const e=gt();if(!e){Vt.current=0,bn.current=null;return}if(bn.current!==e){bn.current=e,Vt.current=Et.length;return}const a=Vt.current,u=Et.length,C=u>a,B=!ke.current;Vt.current=u,C&&B&&Fe("new-message")},[Et,gt,Fe]),s.useEffect(()=>{ys<=0||!Re.current||Fe("keyboard")},[ys,Fe]),wr(Ze&&Qt),s.useLayoutEffect(()=>{if(!Ze||!h&&!ve||typeof window>"u")return;const e=vn.current,a=window.visualViewport;if(!e||!a)return;const u=B=>{if(!(B instanceof HTMLElement))return!1;if(B.tagName==="TEXTAREA")return!0;if(B.tagName!=="INPUT")return!1;const ne=B.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(ne)},C=()=>{if(Wt.current){e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange="";return}const B=Math.max(0,window.innerHeight-a.offsetTop-a.height),ne=a.offsetTop||0;e.style.setProperty("--vv-height",`${a.height}px`),e.style.setProperty("--vv-offset-top",`${ne}px`),e.style.setProperty("--keyboard-overlap",`${B}px`);const me=(B>0||ne>0)&&u(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",me),e.style.setProperty("--chat-keyboard-accessory-clearance",me&&Vn()?"calc(var(--space-2xl) + var(--space-md))":"0px"),me&&ne>0?(e.style.transform=`translateY(${ne}px)`,e.style.willChange="transform"):(e.style.transform="",e.style.willChange="")};return C(),a.addEventListener("resize",C),a.addEventListener("scroll",C),document.addEventListener("focusin",C),document.addEventListener("focusout",C),window.addEventListener("pageshow",C),document.addEventListener("visibilitychange",C),()=>{a.removeEventListener("resize",C),a.removeEventListener("scroll",C),document.removeEventListener("focusin",C),document.removeEventListener("focusout",C),window.removeEventListener("pageshow",C),document.removeEventListener("visibilitychange",C),e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange=""}},[h,Ze,ve]),s.useEffect(()=>{const e=()=>fe(null);if(le)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[le]),s.useEffect(()=>{if(!Ze||!Qt)return;const e=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[Ze,Qt]),s.useEffect(()=>{const e=gs.current;if(gs.current=w,w==="rooms"&&!g.activeRoom){Gt.current=null;return}if(!(w==="direct"&&(e===null||e==="rooms"))&&!(w==="rooms"&&(e===null||e==="direct")))return;const C=Re.current;C&&(He(C,{force:!0}),ke.current=!1,zt(!1))},[w,g.activeRoom,He]),s.useEffect(()=>{if(!h&&!ve||ve&&!te)return;const e=()=>{const u=!ke.current;Yt(),u&&te&&Re.current&&Fe("visibility-restore")},a=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",a),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pageshow",e)}},[te,Ze,h,ve,Yt,Fe]),s.useEffect(()=>{if(ve||typeof ResizeObserver>"u")return;const e=Re.current;if(!e)return;const a=new ResizeObserver(()=>{ke.current||He(e)});return a.observe(e),()=>{a.disconnect()}},[ve,He,h?.id,w]),s.useEffect(()=>{ps.current=U},[U]),s.useEffect(()=>()=>{for(const e of ps.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of At.current.values())window.clearTimeout(e);At.current.clear()},[]);const pt=s.useCallback(e=>{if(!e||e.length===0)return;const a=[];for(const u of Array.from(e)){if(!co.includes(u.type))continue;const C=u.type.startsWith("image/");a.push({file:u,previewUrl:C?URL.createObjectURL(u):""})}a.length>0&&J(u=>[...u,...a])},[]),Cs=s.useCallback(e=>{J(a=>{const u=a[e];return u?.previewUrl&&URL.revokeObjectURL(u.previewUrl),a.filter((C,B)=>B!==e)})},[]),Ss=s.useCallback(e=>{const a=e.clipboardData?.files;if(!a||a.length===0)return;const u=Array.from(a).filter(C=>C.type.startsWith("image/"));u.length!==0&&pt(u)},[pt]),Na=s.useCallback(async e=>{try{await A(e),T(!1),te&&de(!1)}catch{r(o("chat.failedToCreateSession","Failed to create chat session"),"error")}},[A,r,te]),Ee=s.useCallback(e=>{const a=e??Me.current;if(!a)return;const u=qt==="tablet"?no:cs;a.style.height="auto",a.style.height=`${ao(a.scrollHeight,u)}px`,a.style.overflowY=so(a.scrollHeight,u)},[qt]),Ms=s.useCallback(e=>{Me.current=e,e&&Ee(e)},[Ee]);s.useLayoutEffect(()=>{Ee()},[w,G,h?.id,g.activeRoom?.id,Ee]);const bt=s.useCallback(()=>{if(X(""),Ae)try{localStorage.removeItem(Ae)}catch{}Ve(!1),dt(""),_(!1),E(""),ae(-1),J(e=>{for(const a of e)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[Ae]),Mn=s.useCallback(()=>{const e=G.trim(),a=U.map(u=>u.file);if(!(!e&&a.length===0||!h)){if(e==="/clear"||e==="/new"){bt(),$(),H(),A({agentId:h.agentId,modelProvider:h.modelProvider??void 0,modelId:h.modelId??void 0}).catch(()=>{r(o("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}bt(),N(e,a)}},[G,U,h,bt,H,$,A,r,N]),kn=s.useCallback(async()=>{const e=G.trim(),a=U.map(u=>u.file);if(!(!e&&a.length===0)){if(w==="rooms"){if(!g.activeRoom)return;if(e==="/clear"||e==="/new"){bt();try{await g.clearRoom(g.activeRoom.id)}catch{r(o("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(yn.current)return;yn.current=!0;const u=G;bt();try{await g.sendRoomMessage(e,{files:a})}catch(C){if(C instanceof xa){const ne=C.message.trim()?C.message:o("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");r(o("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:ne}),"error");return}X(u);const B=C instanceof Error&&C.message.trim()?C.message:o("chat.failedToSendRoomMessage","Failed to send room message");r(B,"error")}finally{yn.current=!1}return}Mn()}},[G,U,b,w,g,g.clearRoom,bt,r,Mn]),Jt=s.useCallback(async e=>{if(w==="rooms"){if(!g.activeRoom)return;try{await g.sendRoomMessage(e)}catch(a){const u=a instanceof Error&&a.message.trim()?a.message:o("chat.failedToSendRoomMessage","Failed to send room message");r(u,"error")}return}h&&N(e)},[h,r,b,w,g,N,o]),Rn=s.useCallback(e=>{X(a=>{const u=pa(a);if(!u)return a;const C=`/skill:${e.name} `,B=a.slice(0,u.start)+C+a.slice(u.end);return window.requestAnimationFrame(()=>{Me.current&&(Ee(Me.current),Me.current.focus())}),B}),Ve(!1),dt(""),p(0)},[Ee]),Zt=s.useCallback(e=>{const a=Me.current;if(!a||ee<0)return;const u=a.selectionStart??ht.current,C=a.selectionEnd??u,B=Math.max(u,C),ne=Math.min(ee,B),we=`${`@${e.name.replace(/\s+/g,"_")}`} `,Ke=G.slice(0,ne)+we+G.slice(B),vt=ne+we.length;X(Ke),_(!1),E(""),V(0),ae(-1),window.requestAnimationFrame(()=>{Me.current&&(Ee(Me.current),Me.current.focus(),Me.current.setSelectionRange(vt,vt))})},[ee,G,Ee]),Tt=s.useCallback((e,a)=>{const C=Me.current?.selectionStart??ht.current,B=G.lastIndexOf("#",C),ne=B>=0?B+a.length:e.length;X(e),oe.dismissMention(),Kt(!1),window.requestAnimationFrame(()=>{Me.current&&(Ee(Me.current),Me.current.focus(),Me.current.setSelectionRange(ne,ne))})},[oe,G,Ee]),ks=s.useCallback(e=>{if(ht.current=e.currentTarget.selectionStart??ht.current,oe.mentionActive&&oe.combinedItems.length>0){if(oe.handleKeyDown(e,G),e.key==="Enter"||e.key==="Tab"){const a=oe.combinedItems[oe.selectedIndex];a?.kind==="task"?Tt(oe.selectTask(a.task,G),`#${a.task.id}`):a?.kind==="file"&&Tt(oe.selectFile(a.file,G),`#${a.file.path}`)}return}if(O&&e.key==="ArrowDown"){e.preventDefault(),et.length>0&&V(a=>(a+1)%et.length);return}if(O&&e.key==="ArrowUp"){e.preventDefault(),et.length>0&&V(a=>a===0?et.length-1:a-1);return}if(O&&e.key==="Enter"){e.preventDefault();const a=et[q]??et[0];a&&Zt(a);return}if(O&&e.key==="Escape"){e.preventDefault(),_(!1),E(""),ae(-1);return}if(je&&e.key==="ArrowDown"){e.preventDefault(),Ne.length>0&&p(a=>(a+1)%Ne.length);return}if(je&&e.key==="ArrowUp"){e.preventDefault(),Ne.length>0&&p(a=>a===0?Ne.length-1:a-1);return}if(je&&(e.key==="Enter"||e.key==="Tab")&&Ne.length>0){e.preventDefault();const a=Ne[d]??Ne[0];a&&Rn(a);return}if(je&&e.key==="Escape"){e.preventDefault(),Ve(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),kn())},[O,et,q,Zt,je,Ne,d,Rn,kn,oe,Tt,G]),en=s.useCallback((e,a)=>{const u=lo(e,a);if(u){_(!0),E(u.filter),ae(u.start);return}_(!1),E(""),ae(-1)},[]),Rs=s.useCallback(e=>{const a=e.target,u=a.value,C=a.selectionStart??u.length;Ee(a),ht.current=C,X(u);const B=pa(u);B?(Ve(!0),dt(B.filter)):(Ve(!1),dt("")),en(u,C),oe.detectMention(u,C),Kt(oe.mentionActive),oe.mentionActive&&pn(a)},[en,Ee]),tn=s.useCallback(e=>{const a=e.currentTarget,u=a.selectionStart??a.value.length;ht.current=u,en(a.value,u),oe.detectMention(a.value,u),Kt(oe.mentionActive),oe.mentionActive&&pn(a)},[en,oe,pn]),As=s.useCallback(e=>{e.key!=="Escape"&&tn(e)},[tn]),Ns=s.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(Wt.current=!0,Oe.current!==null&&window.clearTimeout(Oe.current),Oe.current=window.setTimeout(()=>{Wt.current=!1,Oe.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),Be.current!==null&&window.clearTimeout(Be.current),Be.current=window.setTimeout(()=>{Be.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),$e.current!==null&&window.clearTimeout($e.current),$e.current=window.setTimeout(()=>{Ve(!1),_(!1),E(""),ae(-1),Kt(!1),oe.dismissMention(),$e.current=null},120)},[oe]),Es=s.useCallback(()=>{Wt.current=!1,Oe.current!==null&&(window.clearTimeout(Oe.current),Oe.current=null),$e.current!==null&&(window.clearTimeout($e.current),$e.current=null),Be.current!==null&&(window.clearTimeout(Be.current),Be.current=null)},[]);s.useEffect(()=>()=>{Oe.current!==null&&window.clearTimeout(Oe.current),Be.current!==null&&window.clearTimeout(Be.current)},[]);const Ea=s.useCallback(async e=>{fe(null);try{await se(e),r(o("chat.conversationArchived","Conversation archived"),"success")}catch{r(o("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[se,r]),An=s.useCallback(e=>{const a=ie.find(u=>u.id===e)??(h?.id===e?h:null);fe(null),We(!1),Ie(a?.title??""),Ce({sessionId:e,title:a?.title??""})},[h,ie]),Ts=s.useCallback(async()=>{if(Se)try{await W(Se.sessionId,at),Ce(null),Ie(""),r(o("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[r,Se,W,at,o]),Ta=s.useCallback(async e=>{De(null),fe(null);try{await he(e),r(o("chat.conversationDeleted","Conversation deleted"),"success")}catch{r(o("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[he,r]),jt=s.useCallback(e=>{try{localStorage.setItem(ma,String(e))}catch{}},[]),ja=s.useCallback(e=>{if(te||Nt)return;e.preventDefault(),e.stopPropagation();const a=e.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(e.pointerId);const u=e.clientX,C=Le;let B=C;document.body.style.userSelect="none";const ne=we=>{const Ke=we.clientX-u,vt=Math.max(dn,Math.min(un,C+Ke));B=vt,ge(vt),jt(vt)},me=we=>{typeof a.releasePointerCapture=="function"&&a.releasePointerCapture(we.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",ne),document.removeEventListener("pointerup",me),jt(B)};document.addEventListener("pointermove",ne),document.addEventListener("pointerup",me)},[te,jt,Le,Nt]),Da=s.useCallback(e=>{if(te||Nt||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const a=e.shiftKey?50:10,u=e.key==="ArrowLeft"?-a:a,C=Math.max(dn,Math.min(un,Le+u));ge(C),jt(C)},[te,jt,Le,Nt]),js=s.useCallback(e=>{const a=ie.find(u=>u.id===e);I("direct",e,a?.lastMessageAt??a?.updatedAt),Q(e),We(!1),te&&de(!1)},[ie,te,I,Q]),Nn=s.useCallback(()=>{Q(""),de(!0),We(!1)},[Q]),En=s.useCallback(()=>{g.selectRoom(null),de(!0),We(!1)},[g]),Fa=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(mn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:o("chat.startNewConversation","Start a new conversation")}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>T(!0),children:[t.jsx(yt,{size:16}),o("chat.newChat","New Chat")]})]}),Ue=ba(h,h?.agentId?Te.get(h.agentId)??null:null,ct),Tn=s.useMemo(()=>{if(!Ue?.provider||!Ue.modelId)return null;const e=_t.find(a=>a.provider===Ue.provider&&a.id===Ue.modelId);return e?.contextWindow?e.contextWindow:null},[Ue?.modelId,Ue?.provider,_t]),Ia=s.useMemo(()=>to(S,D?P:void 0),[D,S,P]),qe=Vs(Ue?.provider,Ue?.modelId),tt=Ue?.provider??null,jn=!!(h||D||S.length>0),nn=w==="rooms"?ve:!!h,Ds=s.useRef(nn);s.useEffect(()=>{const e=Ds.current;Ds.current=nn,te&&(e||!nn||ds({type:"view",revert:w==="rooms"?En:Nn}))},[w,Nn,En,nn,te,ds]);const Fs=h?.agentId===St?qe??"Fusion":h?.title||Te.get(h?.agentId??"")?.name||h?.agentId||"Chat",Pa=h?.title||o("chat.untitledSession","Untitled"),La=!!(qe&&qe!==Fs),_a=!te&&jn&&Tn!==null,Is=da(Ia),sn=Tn!==null?da(Tn):null,Dn=sn?o("chat.contextWindowAria","Estimated {{used}} of {{total}} context tokens",{used:Is,total:sn}):null,$a=te&&w==="direct"&&!!h,Ps=te&&w==="direct"&&jn,Fn=Te.get(h?.agentId??"")?.name||(h?.agentId===St?qe??"Fusion":h?.agentId?.slice(0,30)??"Fusion"),In=!1,Pn=h?.agentId===St,Oa=e=>e.length>50?`${e.slice(0,50)}…`:e;s.useEffect(()=>{if(!Ht)return;const e=a=>{hs.current?.contains(a.target)||We(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[Ht]),s.useEffect(()=>{if(!Ut)return;const e=u=>{fs.current?.contains(u.target)||kt(!1)},a=u=>{u.key==="Escape"&&kt(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",a),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",a)}},[Ut]),s.useEffect(()=>{(!te||w!=="direct"||rt)&&We(!1)},[te,w,rt]),s.useEffect(()=>{kt(!1)},[g.activeRoom?.id]);const Ln=s.useCallback((e,a)=>{const u=At.current.get(e);u&&window.clearTimeout(u),ls(B=>({...B,[e]:a}));const C=window.setTimeout(()=>{ls(B=>{const{[e]:ne,...me}=B;return me}),At.current.delete(e)},2e3);At.current.set(e,C)},[]),Ls=s.useCallback(async(e,a)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(a),Ln(e,"success")}catch{Ln(e,"error")}},[Ln]),_n=h?.agentId===St,$n=s.useCallback((e,a,u)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${mt[e]==="success"?" chat-message-copy-action--success":""}${mt[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":u??`chat-copy-response-${e}`,"aria-label":mt[e]==="success"?o("chat.responseCopied","Response copied"):mt[e]==="error"?o("chat.copyFailed","Copy failed"):o("chat.copyResponse","Copy response"),onClick:()=>{Ls(e,a)},children:mt[e]==="success"?t.jsx(xr,{size:14}):t.jsx(Cr,{size:14})}),[mt,Ls]),On=s.useCallback(e=>{const a=Re.current;if(!a)return;const u=`[data-testid="chat-message-${e}"]`,C=a.querySelector(u);if(!C)return;const B=C.getBoundingClientRect().top-a.getBoundingClientRect().top+a.scrollTop,ne=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;a.scrollTo({top:B,behavior:ne?"auto":"smooth"})},[]),_s=h?.cliExecutorAdapterId??null,$s=!!_s,Ba=_s==="generic"?"generic":"hybrid",za=h?.cliSessionFile||h?.id||"",Os=!$s&&!D,Bs=()=>t.jsxs("div",{className:"chat-messages",ref:Re,onScroll:xs,children:[t.jsx("div",{ref:ms,className:"chat-load-more-sentinel",children:x&&k&&t.jsx("div",{className:"chat-loading-older",children:o("chat.loadingOlderMessages","Loading older messages…")})}),D?t.jsxs(t.Fragment,{children:[S.map((e,a)=>t.jsx(Gn,{message:e,forcePlain:!1,agentName:Fn,hideAssistantIdentity:Pn,showAssistantModelTag:In,activeModelTag:qe,activeModelProvider:tt,activeSessionId:h?.id??null,mentionAgentsByName:Cn,roomContext:null,copyAction:_n&&e.role==="assistant"?$n(e.id,e.content):void 0,onScrollToTop:On,isAwaitingQuestionAnswer:e.role==="assistant"&&a===S.length-1&&!D,submittedQuestionAnswer:ha(S,a),onQuestionSubmit:Jt,canEdit:Os,onEditMessage:ce},e.id)),t.jsx(Nr,{streamingText:P,streamingThinking:F,streamingToolCalls:j,forcePlain:!1,agentName:Fn,hideAssistantIdentity:Pn,showAssistantModelTag:In,activeModelTag:qe,activeModelProvider:tt,copyAction:_n&&P?$n("__streaming__",P,"chat-copy-response-streaming"):void 0,onQuestionSubmit:Jt})]}):k?t.jsx("div",{className:"chat-empty-state",children:o("chat.loadingMessages","Loading messages...")}):S.length===0&&!h?Fa():S.length===0&&h?t.jsx("div",{className:"chat-empty-state",children:o("chat.noMessagesYet","No messages yet. Start the conversation!")}):t.jsx(t.Fragment,{children:S.map((e,a)=>t.jsx(Gn,{message:e,forcePlain:!1,agentName:Fn,hideAssistantIdentity:Pn,showAssistantModelTag:In,activeModelTag:qe,activeModelProvider:tt,activeSessionId:h?.id??null,mentionAgentsByName:Cn,roomContext:null,copyAction:_n&&e.role==="assistant"?$n(e.id,e.content):void 0,onScrollToTop:On,isAwaitingQuestionAnswer:e.role==="assistant"&&a===S.length-1&&!D,submittedQuestionAnswer:ha(S,a),onQuestionSubmit:Jt,canEdit:Os,onEditMessage:ce},e.id))}),t.jsx("div",{ref:us})]}),zs=()=>t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Xt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{pt(e.target.files),e.target.value=""}}),je&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":o("chat.skillSuggestions","Skill suggestions"),children:Bt?t.jsx("div",{className:"chat-skill-menu-empty",children:o("chat.loadingSkills","Loading skills…")}):Ne.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:_e?o("chat.noSkillsFound","No skills found"):o("chat.noSkillsAvailable","No skills available")}):Ne.map((e,a)=>t.jsxs("button",{type:"button",role:"option","aria-selected":a===d,className:`chat-skill-menu-item${a===d?" chat-skill-menu-item--highlighted":""}`,onMouseDown:u=>u.preventDefault(),onMouseEnter:()=>p(a),onClick:()=>Rn(e),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.relativePath,children:e.relativePath})]},e.id))}),U.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:U.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:()=>Cs(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),Z.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-pending-stack","data-testid":"chat-pending-stack",children:Z.map((e,a)=>t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:o("chat.queuedMessage","Queued: {{preview}}",{preview:Oa(e)})}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":o("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":`chat-pending-dismiss-${a}`,onClick:()=>$(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":o("chat.attachFiles","Attach files"),onClick:()=>Xt.current?.click(),children:t.jsx(qs,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${ue?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),pe(!0)},onDragLeave:()=>pe(!1),onDrop:e=>{e.preventDefault(),pe(!1),pt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:Ms,className:"chat-input-textarea",placeholder:o("chat.typeMessage","Type a message..."),value:G,onChange:Rs,onKeyDown:ks,onKeyUp:As,onClick:tn,onBlur:Ns,onFocus:Es,onPaste:Ss,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Vn()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(oa,{agents:ft,filter:y,highlightedIndex:q,visible:O,onSelect:Zt,position:"below",roomMemberIds:ze?.memberIds,roomName:ze?.roomName}),t.jsx(Kr,{visible:oe.mentionActive&&!O,position:Ma,tasks:oe.tasks,files:oe.files,selectedIndex:oe.selectedIndex,onSelectTask:e=>{Tt(oe.selectTask(e,G),`#${e.id}`)},onSelectFile:e=>{Tt(oe.selectFile(e,G),`#${e.path}`)},loading:oe.loading})]}),t.jsx(Qs,{isStreaming:D,canSend:!!(G.trim()||U.length>0),onSend:Mn,onStop:H})]})]}),Ha=te?void 0:{width:`${Le}px`},Ua=$a?t.jsxs("div",{className:"chat-mobile-session-menu",ref:hs,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":Ht,onClick:()=>We(e=>!e),children:[tt?t.jsx(Hn,{provider:tt,size:"md"}):t.jsx(es,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Pa}),t.jsx(an,{size:16,"aria-hidden":"true"})]}),Ht&&t.jsxs("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:[ie.map(e=>t.jsxs("div",{className:`chat-mobile-session-option-row${h?.id===e.id?" chat-mobile-session-option-row--active":""}`,role:"none",children:[t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${h?.id===e.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${e.id}`,onClick:()=>js(e.id),children:t.jsx("span",{className:"chat-mobile-session-option-title",children:e.title||o("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":o("chat.renameConversationAria","Rename conversation {{title}}",{title:e.title||o("chat.untitledSession","Untitled")}),onClick:()=>An(e.id),children:t.jsx(Un,{size:14})})]},e.id)),t.jsxs("button",{type:"button",role:"menuitem",className:"chat-mobile-session-new","data-testid":"chat-mobile-session-new",onClick:()=>{We(!1),T(!0)},children:[t.jsx(yt,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:o("chat.newChat","New Chat")})]})]})]}):null,Ka=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${w==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":w==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>K("direct"),children:[t.jsx(mn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:o("chat.scopeDirect","Direct")})]}),t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${w==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":w==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>K("rooms"),children:[t.jsx(wa,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:o("chat.scopeRooms","Rooms")})]})]});return t.jsxs("div",{ref:bs,className:`chat-view${i?" chat-view--floating":""}${te?" chat-view--narrow":""}${Ps?" chat-view--mobile-direct-thread":""}`,children:[t.jsx(Sr,{icon:mn,title:o("chat.title","Chat"),actions:t.jsxs(t.Fragment,{children:[Ps?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn-icon chat-back-btn",onClick:Nn,"data-testid":"chat-back-btn","aria-label":o("chat.backToConversations","Back to conversations"),children:t.jsx(Ws,{size:16})}),Ua]}):Ka,te?null:t.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:()=>T(!0),"data-testid":"chat-new-btn",children:[t.jsx(yt,{size:14}),o("chat.newChat","New Chat")]}),!i&&c?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:c,"aria-label":o("chat.popOut","Pop out chat"),title:o("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:t.jsx(Xs,{size:16})}):null,i&&l?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:l,"aria-label":o("chat.maximizeToChatView","Open in Chat view"),title:o("chat.maximizeToChatView","Open in Chat view"),"data-testid":"chat-modal-maximize",children:t.jsx(Xs,{size:16})}):null,i&&v?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:v,"aria-label":o("chat.minimizeToQuickChat","Minimize to quick chat"),title:o("chat.minimizeToQuickChat","Minimize to quick chat"),"data-testid":"chat-modal-minimize",children:t.jsx(Mr,{size:16})}):null,i&&f?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:f,"aria-label":o("chat.closeChat","Close chat"),title:o("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:t.jsx(kr,{size:16})}):null]})}),t.jsxs("div",{className:"chat-view__body",children:[t.jsxs("div",{className:`chat-sidebar${rt?"":" chat-sidebar--hidden"}`,style:Ha,children:[w==="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(Rr,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:o("chat.searchConversations","Search conversations..."),value:L,onChange:e=>ye(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:z?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:o("chat.loadingConversations","Loading...")}):ie.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:o("chat.noConversationsYet","No conversations yet")}):ie.map(e=>{const a=h?.id===e.id,u=!a&&xe("direct",e.id,e.lastMessageAt??e.updatedAt),C=ba(e,Te.get(e.agentId)??null,ct),B=Vs(C?.provider,C?.modelId)??"Fusion",ne=e.title||o("chat.untitledSession","Untitled");return t.jsxs("div",{className:`chat-session-item${a?" chat-session-item--active":""}`,onClick:()=>js(e.id),onContextMenu:me=>{me.preventDefault(),fe({sessionId:e.id,x:me.clientX,y:me.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:me=>{me.stopPropagation(),An(e.id)},"data-testid":"chat-session-rename-btn","aria-label":o("chat.renameConversationAria","Rename conversation {{title}}",{title:ne}),children:t.jsx(Un,{size:14})}),t.jsx("button",{type:"button",className:"btn-icon chat-session-action-btn chat-session-delete-btn",onClick:me=>{me.stopPropagation(),De(e.id)},"data-testid":"chat-session-delete-btn","aria-label":o("chat.deleteConversation","Delete conversation"),children:t.jsx(Kn,{size:14})})]}),t.jsxs("div",{className:"chat-session-title",children:[ne,u?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":o("chat.unreadMessages","Unread messages")}):null]}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||o("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:o("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:[C?.provider?t.jsx(Hn,{provider:C.provider,size:"sm"}):null,t.jsx("span",{children:Te.get(e.agentId)?.name||(e.agentId===St?B:e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?ro(e.updatedAt,o):""})]})]},e.id)})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!te&&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:()=>it(!0),children:[t.jsx(yt,{size:14}),o("chat.createRoom","Create room")]})}),g.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:o("chat.noRoomsYet","No rooms yet.")}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:g.rooms.map(e=>{const a=g.activeRoom?.id===e.id,u=!a&&xe("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:()=>{I("room",e.id,e.updatedAt),g.selectRoom(e.id),te&&de(!1)},onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),I("room",e.id,e.updatedAt),g.selectRoom(e.id),te&&de(!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]}),u?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":o("chat.unreadMessages","Unread messages")}):null]}),a?t.jsx("span",{className:"chat-room-item-meta",children:o("chat.roomMemberCount","{{count}} member",{count:g.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":o("chat.deleteRoom","Delete room {{name}}",{name:e.name}),onClick:C=>{C.stopPropagation(),Pe(e.id)},children:t.jsx(Kn,{size:14})})]},e.id)})})]}),w==="rooms"?te?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:()=>it(!0),children:[t.jsx(yt,{size:14}),o("chat.createRoom","Create room")]})}):null:te?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>T(!0),"data-testid":"chat-new-btn",children:[t.jsx(yt,{size:14}),o("chat.newChat","New Chat")]})}):null]}),!te&&rt&&!Nt&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":dn,"aria-valuemax":un,"aria-valuenow":Le,"aria-label":o("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:ja,onKeyDown:Da}),le&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:le.y,left:le.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>An(le.sessionId),"data-testid":"chat-context-rename",children:[t.jsx(Un,{size:14}),o("chat.rename","Rename")]}),t.jsxs("button",{onClick:()=>Ea(le.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Ar,{size:14}),o("chat.archive","Archive")]}),t.jsxs("button",{onClick:()=>{fe(null),De(le.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(Kn,{size:14}),o("chat.delete","Delete")]})]}),Se&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Ce(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:o("chat.renameConversationTitle","Rename Conversation")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("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:o("chat.conversationName","Conversation name")}),t.jsx("input",{id:"chat-rename-input",className:"input chat-rename-input",type:"text",value:at,placeholder:o("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:e=>Ie(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),Ts())},autoFocus:!0}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Ce(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Ts(),"data-testid":"chat-rename-save",children:o("chat.save","Save")})]})]})}),Je&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>De(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:o("chat.deleteConversationTitle","Delete Conversation?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("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:()=>De(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Ta(Je),children:o("chat.delete","Delete")})]})]})}),be&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Pe(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:o("chat.deleteRoomTitle","Delete Room?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("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:()=>Pe(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await g.deleteRoom(be),Pe(null)}catch{r(o("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:o("chat.delete","Delete")})]})]})}),w==="rooms"?t.jsxs("div",{ref:vn,className:"chat-thread",children:[g.activeRoom?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-room-thread-header",children:[te&&t.jsx("button",{className:"btn-icon",onClick:En,"data-testid":"chat-back-btn",children:t.jsx(Ws,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:fs,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":Ut,onClick:()=>kt(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",g.activeRoom.name]}),t.jsx(an,{size:16,"aria-hidden":"true"})]}),Ut&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:g.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===g.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{I("room",e.id,e.updatedAt),g.selectRoom(e.id),kt(!1)},children:["#",e.name]},e.id))})]}),t.jsx("div",{className:"chat-room-thread-members",children:g.activeRoomMembers.map(e=>t.jsx(gn,{agent:Te.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:Re,onScroll:xs,children:[g.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:o("chat.loadingMessages","Loading messages...")}):g.messages.filter(e=>e.content.trim()!==ua).length===0?t.jsx("div",{className:"chat-empty-state",children:o("chat.noMessagesYet","No messages yet. Start the conversation!")}):g.messages.filter(e=>e.content.trim()!==ua).map(e=>{const a=e.senderAgentId?Te.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):o("chat.you","You"),u={id:e.id,sessionId:e.roomId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:e.attachments,createdAt:e.createdAt};return t.jsx(Gn,{message:u,forcePlain:!1,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:g.activeRoom?.id??null,mentionAgentsByName:Cn,roomContext:ze,onScrollToTop:On,isAwaitingQuestionAnswer:!1,onQuestionSubmit:Jt},e.id)}),t.jsx("div",{ref:us})]}),g.activeRoom&&ut&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Fe("fab-click"),children:[t.jsx(an,{size:14}),o("chat.latest","Latest")]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:o("chat.selectRoomOrCreate","Select a room or create one")}),g.activeRoom&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Xt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{pt(e.target.files),e.target.value=""}}),U.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:U.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:()=>Cs(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":o("chat.attachFiles","Attach files"),onClick:()=>Xt.current?.click(),children:t.jsx(qs,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${ue?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),pe(!0)},onDragLeave:()=>pe(!1),onDrop:e=>{e.preventDefault(),pe(!1),pt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:Ms,className:"chat-input-textarea",placeholder:o("chat.typeMessage","Type a message..."),value:G,onChange:Rs,onKeyDown:ks,onKeyUp:As,onClick:tn,onBlur:Ns,onFocus:Es,onPaste:Ss,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Vn()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(oa,{agents:ft,filter:y,highlightedIndex:q,visible:O,onSelect:Zt,position:"below",roomMemberIds:ze?.memberIds,roomName:ze?.roomName})]}),t.jsx(Qs,{isStreaming:!1,canSend:!!(G.trim()||U.length>0),onSend:kn})]})]})]}):t.jsxs("div",{ref:vn,className:"chat-thread",children:[!te&&(jn||!te)&&t.jsx("div",{className:"chat-thread-header",children:t.jsxs("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:[tt?t.jsx(Hn,{provider:tt,size:"md"}):t.jsx(es,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Fs}),La&&t.jsx("span",{className:"chat-model-tag",children:qe}),_a&&sn&&Dn?t.jsxs("span",{className:"chat-thread-header-context","data-testid":"chat-thread-context-window",title:Dn,"aria-label":Dn,children:[Is," / ",sn]}):null]})}),$s?t.jsx(Wr,{cliSessionId:za,tier:Ba,projectId:n,renderTranscript:Bs,renderComposer:()=>h?zs():null}):t.jsxs(t.Fragment,{children:[Bs(),ut&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Fe("fab-click"),children:[t.jsx(an,{size:14}),o("chat.latest","Latest")]}),h&&zs()]})]}),t.jsx(Vr,{isOpen:ot,onClose:()=>it(!1),projectId:n,existingRoomNames:g.rooms.map(e=>e.name),onCreate:async e=>{await g.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),w!=="rooms"&&K("rooms"),it(!1),te&&de(!1)}})]}),M&&t.jsx(mo,{projectId:n,defaultModel:ct,onClose:()=>T(!1),onCreate:Na})]})}export{xo as ChatView,ao as clampChatInputHeight,so as resolveChatInputOverflowY,ba as resolveSessionProvider};
|