@runfusion/fusion 0.50.0 → 0.52.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 +9801 -4827
- package/dist/client/.vite/manifest.json +328 -327
- package/dist/client/assets/{AgentDetailView-D2oYUApl.js → AgentDetailView-C-PM8cwG.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-DGgx46f3.js → AgentPermissionPolicyEditor-DrVW4VPc.js} +1 -1
- package/dist/client/assets/{AgentsView-Dhf5Vq_T.js → AgentsView-DJJO0laF.js} +6 -11
- package/dist/client/assets/ChatView-C7uTm5hO.js +16 -0
- package/dist/client/assets/ChatView-D_2wBIIx.css +1 -0
- package/dist/client/assets/CommandCenter-CKvo0MuO.js +71 -0
- package/dist/client/assets/{DevServerView-DjJYp6Jj.js → DevServerView-BHLG4Mxg.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-CYPYp9T4.js → DirectoryPicker-CRY-rpnj.js} +1 -1
- package/dist/client/assets/{DocumentsView-CeQVRVdp.js → DocumentsView-DhC4dnXD.js} +1 -1
- package/dist/client/assets/{EvalsView-D250mVR5.js → EvalsView-DsnLOVZB.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-B1EEY_bl.js → ExperimentalAgentOnboardingModal-B4iFX60E.js} +1 -1
- package/dist/client/assets/{GoalsView-CUh8JBnJ.css → GoalsView-4-eEOeqw.css} +1 -1
- package/dist/client/assets/GoalsView-D5bzq6W9.js +2 -0
- package/dist/client/assets/{InsightsView-CbWItYe8.js → InsightsView-Drpu72M4.js} +1 -1
- package/dist/client/assets/{MemoryView-Ct0nOTES.js → MemoryView-auLBP3UW.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-DSQwngX-.js → PiExtensionsManager-RlbkXf_t.js} +1 -1
- package/dist/client/assets/{PluginManager-DqLxCiNg.js → PluginManager-BJMUacpG.js} +1 -1
- package/dist/client/assets/PullRequestView-344B9WF-.js +6 -0
- package/dist/client/assets/PullRequestView-NkeImY1n.css +1 -0
- package/dist/client/assets/{ResearchView-CJQL9XKC.js → ResearchView-BNqt-f53.js} +1 -1
- package/dist/client/assets/{SecretsView-ChN9aTbi.js → SecretsView-Be8Tm8It.js} +1 -1
- package/dist/client/assets/SessionTerminal-CumHUelZ.js +2 -0
- package/dist/client/assets/SettingsModal-AJfer-ve.js +21 -0
- package/dist/client/assets/{SettingsModal-CIC5jhgo.js → SettingsModal-B28DuhaN.js} +1 -1
- package/dist/client/assets/SettingsModal-CaE4JYxi.css +1 -0
- package/dist/client/assets/{SetupWizardModal-C6EGjmbd.js → SetupWizardModal-y2j9aZoi.js} +2 -2
- package/dist/client/assets/ShadcnColorPicker-Cc72uPKJ.js +11 -0
- package/dist/client/assets/ShadcnColorPicker-CyeAnJUU.css +1 -0
- package/dist/client/assets/{SkillsView-Dz8dDwfP.js → SkillsView-HQp7UTdA.js} +1 -1
- package/dist/client/assets/{TodoView-DvJFzoOv.js → TodoView-DF7_qWGH.js} +1 -1
- package/dist/client/assets/WorkflowNodeEditor-BjpqTIYE.js +8 -0
- package/dist/client/assets/WorkflowNodeEditor-Df-_206_.css +1 -0
- package/dist/client/assets/{agentSkills-B2dD5Nm5.js → agentSkills-Cy_HrYHd.js} +1 -1
- package/dist/client/assets/{app-D27ewSC0.js → app-CGubyqAW.js} +3 -3
- package/dist/client/assets/{app-dATBczl3.js → app-CrQpHbIs.js} +2 -2
- package/dist/client/assets/{app-BYq4S7Cb.js → app-DboK-0Ty.js} +1 -1
- package/dist/client/assets/{app-OPrfgjjn.js → app-DjnYET2y.js} +3 -3
- package/dist/client/assets/{app-DFLDkeOE.js → app-MacS555z.js} +3 -3
- package/dist/client/assets/{app-k1K9zAjp.js → app-nvVayIeU.js} +3 -3
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-ClO0MnzR.js → architectureDiagram-3BPJPVTR-4ur4sxlr.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-C4cyy4WE.js → blockDiagram-GPEHLZMM-BgZeqq_q.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-NHPC9TJo.js → c4Diagram-AAUBKEIU-BQtdOIrm.js} +1 -1
- package/dist/client/assets/channel-Dn5XowfJ.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CGYIKTVR.js → chunk-2J33WTMH-C1k1PBy1.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-BkCCD0tE.js → chunk-4BX2VUAB-hNujwvSn.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-Be3yOIDe.js → chunk-55IACEB6-CnXV9LyI.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-DxjyMaQQ.js → chunk-727SXJPM-B-ocMdYN.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-BC0PjN0W.js → chunk-AQP2D5EJ-CWNRUL6C.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-DoWxmM8k.js → chunk-FMBD7UC4-DerrCiYe.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-EOpuc9pP.js → chunk-ND2GUHAM-BfcSPlX-.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-DiRyx9QZ.js → chunk-QZHKN3VN-BaWScAds.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-zSOW-KNk.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-zSOW-KNk.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-CfVoUUxT.js → cose-bilkent-S5V4N54A-n0Oeinz2.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BfILvxLb.js → dagre-BM42HDAG-CUtehSt2.js} +1 -1
- package/dist/client/assets/{dashboard-view-C9YIcx-O.js → dashboard-view-BW3GHqgb.js} +1633 -1633
- package/dist/client/assets/{dashboard-view-wFC1pe4d.js → dashboard-view-DWKCxtr5.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-6mdmbH-5.js → diagram-2AECGRRQ-Bz4aOzhR.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-CY7MMwO1.js → diagram-5GNKFQAL-UoxIMwPf.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-D05XnQqd.js → diagram-KO2AKTUF-BYR7hloS.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-B18FTOJG.js → diagram-LMA3HP47-BR9MaP8U.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-xmXlYf5m.js → diagram-OG6HWLK6-BOfldYHv.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-4XlgVLCs.js → erDiagram-TEJ5UH35-B8x9mfOs.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-BYl3ps7f.js → flowDiagram-I6XJVG4X-DBnTroCV.js} +1 -1
- package/dist/client/assets/{folder-open-BH6FwmO7.js → folder-open-CFze34Eq.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-4vxuH9Dx.js → ganttDiagram-6RSMTGT7-BfzFy7iz.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BESmFgXT.js → gitGraphDiagram-PVQCEYII-CNTFu6IY.js} +1 -1
- package/dist/client/assets/index-QnHUwSjw.css +1 -0
- package/dist/client/assets/index-Y-vyXPPN.js +1331 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-DvjdjtwB.js → infoDiagram-5YYISTIA-DJiBRaAl.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-Cis5IoEm.js → ishikawaDiagram-YF4QCWOH-CIY9t4cc.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-C20pB1W8.js → journeyDiagram-JHISSGLW-HLMZmcjY.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-CiVfCeU3.js → kanban-definition-UN3LZRKU-x9nKoxCI.js} +1 -1
- package/dist/client/assets/{linear-dXivciGL.js → linear-CwI45w2t.js} +1 -1
- package/dist/client/assets/{mermaid.core-CW0vCXA6.js → mermaid.core-pHkdB6fb.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-E5rPHUdw.js → mindmap-definition-RKZ34NQL-Bs_4Tofu.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-DVIFbPjH.js → pieDiagram-4H26LBE5-BGHz9JGZ.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-C8qPRe_x.js → quadrantDiagram-W4KKPZXB-xHSR7cAR.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DQ-pwXh3.js → requirementDiagram-4Y6WPE33-D7YMNM44.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BnghLuUc.js → sankeyDiagram-5OEKKPKP-OAXuab3Y.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-ChlGxGVk.js → sequenceDiagram-3UESZ5HK-BZCjKFVL.js} +1 -1
- package/dist/client/assets/{shield-alert-BfOnDO6O.js → shield-alert-BBK8Risa.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-ByUvNEch.js → stateDiagram-AJRCARHV-COnJQqA4.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Df38ITSP.js → stateDiagram-v2-BHNVJYJU-Diml4Nhm.js} +1 -1
- package/dist/client/assets/{time-DoDTxsna.js → time-Ckmi30gH.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-bsAGc83D.js → timeline-definition-PNZ67QCA-DHIKvV9L.js} +1 -1
- package/dist/client/assets/{upload-BK1crTqn.js → upload-CqUJUdZW.js} +1 -1
- package/dist/client/assets/{users-DW8jC2Z9.js → users-CAE-FEzI.js} +1 -1
- package/dist/client/assets/{vendor-reactflow-Bg-Qjzh8.js → vendor-reactflow-CnI7NMXG.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-BBIj6LFN.js → vennDiagram-CIIHVFJN-o9AxLDoL.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-De6JFroy.js → wardley-L42UT6IY-B7MIazje.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-P1LOLx0_.js → wardleyDiagram-YWT4CUSO-B6qUJx0N.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-v1G4ki6U.js → xychartDiagram-2RQKCTM6-13mSXuCA.js} +1 -1
- package/dist/client/index.html +8 -8
- package/dist/client/theme-data.css +140 -0
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +7658 -3691
- package/dist/pi-claude-cli/index.ts +13 -0
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +2 -2
- package/dist/pi-claude-cli/src/__tests__/provider.test.ts +27 -4
- package/dist/plugin-sdk/index.d.ts +38 -1
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/manifest.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/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/SKILL.md +1 -0
- package/skill/fusion/references/best-practices.md +3 -3
- package/skill/fusion/references/engine-tools.md +3 -3
- package/skill/fusion/references/extension-tools.md +82 -5
- package/skill/fusion/references/fusion-capabilities.md +9 -1
- package/skill/fusion/workflows/task-management.md +1 -1
- package/dist/client/assets/ChatView-DpgpxHva.js +0 -19
- package/dist/client/assets/ChatView-DwIIrJxb.css +0 -1
- package/dist/client/assets/CommandCenter-DzQhGq_J.js +0 -71
- package/dist/client/assets/GoalsView-MftVwE9g.js +0 -2
- package/dist/client/assets/PullRequestView-CpdE3Yo_.css +0 -1
- package/dist/client/assets/PullRequestView-D0WgwdAi.js +0 -6
- package/dist/client/assets/SessionTerminal-BVon9kbr.js +0 -2
- package/dist/client/assets/SettingsModal-B4WANQnu.js +0 -21
- package/dist/client/assets/SettingsModal-tUDR6nJ9.css +0 -1
- package/dist/client/assets/ShadcnColorPicker-4e_aXoGX.js +0 -11
- package/dist/client/assets/ShadcnColorPicker-CzZo9UOD.css +0 -1
- package/dist/client/assets/WorkflowNodeEditor-DrdTCstS.js +0 -8
- package/dist/client/assets/WorkflowNodeEditor-WYIxHTxY.css +0 -1
- package/dist/client/assets/channel-Q2WKocEP.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CPFl2Aqd.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CPFl2Aqd.js +0 -1
- package/dist/client/assets/index-B9jtBwFy.css +0 -1
- package/dist/client/assets/index-DFeBJ3GM.js +0 -1302
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import{r as s,j as t,b as ar,R as rr}from"./vendor-react-SZ_qB27O.js";import{c as os,aA as nt,ay as Ye,dL as Gs,dM as cs,bU as _t,dN as Vs,aD as ce,dO as fn,dx as wt,dP as ir,dQ as Ft,dR as or,dy as vn,dK as xt,dS as cr,dT as Ws,dU as lr,dV as ur,dW as dr,dX as mr,ai as ka,dY as hr,az as ss,bB as Xs,dZ as fr,d_ as gr,d$ as Wn,e0 as pr,e1 as br,e2 as vr,e3 as xr,e4 as yr,e5 as wr,f as xn,e6 as Cr,e7 as Ma,bo as Sr,al as kr,bb as gn,a2 as Mr,c0 as Rr,e8 as Nr,i as Ar,e9 as Ra,ea as jr,dv as Tr,W as Er,eb as Dr,s as Na,v as Aa,G as $r,H as Fr,V as Pr,P as pt,di as Qs,dh as Ir,X as Lr,aK as _r,J as Xn,ds as It,I as qs,bO as Or,bs as Ys,o as cn,ec as Js,ed as Zs,cE as ea,bu as Lt,D as zr,F as Br,ee as yn,dj as ta,b8 as Hr,cn as Ur,bM as na,bP as Kr,ef as Gr,eg as Vr}from"./index-Y-vyXPPN.js";import{u as Je}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as sa}from"./SessionTerminal-CumHUelZ.js";import"./vendor-reactflow-CnI7NMXG.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";import"./shield-alert-BBK8Risa.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 Wr=[["path",{d:"M5 3h14",key:"7usisc"}],["path",{d:"m18 13-6-6-6 6",key:"1kf1n9"}],["path",{d:"M12 7v14",key:"1akyts"}]],Xr=os("arrow-up-to-line",Wr);/**
|
|
7
|
+
* @license lucide-react v1.7.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const Qr=[["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"}]],ja=os("hash",Qr);/**
|
|
12
|
+
* @license lucide-react v1.7.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const qr=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]],aa=os("wrench",qr);function ra(n){const{sessionId:a,tempUserMessageId:o,initialText:l,initialThinking:c,initialToolCalls:u,setStreamingText:b,setStreamingThinking:p,setStreamingToolCalls:i,cancelStreamingFlushesRef:h,addToast:P,onDone:w,onError:M,onFallbackSession:S}=n;let T=l??"",j=c??"",R=u?[...u]:[],O,v=null,Y=null;const W=()=>{v=null,b(T)},le=()=>{Y=null,p(j)},A=()=>{v!==null&&(cancelAnimationFrame(v),v=null),Y!==null&&(cancelAnimationFrame(Y),Y=null)};return h.current=A,{handlers:{onThinking:I=>{j+=I,Y===null&&(Y=requestAnimationFrame(le))},onText:I=>{T+=I,v===null&&(v=requestAnimationFrame(W))},onToolStart:I=>{R=[...R,{toolName:I.toolName,args:I.args,isError:!1,status:"running"}],i(R)},onToolEnd:I=>{const z=[...R];for(let F=z.length-1;F>=0;F--){const H=z[F];if(H?.toolName===I.toolName&&H.status==="running"){z[F]={...H,status:"completed",isError:I.isError,result:I.result},R=z,i(z);return}}R=[...z,{toolName:I.toolName,isError:I.isError,result:I.result,status:"completed"}],i(R)},onFallback:I=>{O=I,S?.(I,a),P?.(`Primary model unavailable. Switched to fallback ${I.fallbackModel}.`,"warning")},onDone:I=>{A(),w({messageId:I.messageId,message:I.message,accumulated:{text:T,thinking:j,toolCalls:R,fallbackInfo:O}})},onError:I=>{A(),M(I,o)}},cancelFlushes:A}}const Yr="fusion:chat-pending:";function ls(n){return n?`${Yr}${n}`:null}function Jr(n){const a=ls(n);if(!a||typeof window>"u")return[];try{const o=localStorage.getItem(a);if(!o)return[];try{const c=JSON.parse(o);if(Array.isArray(c))return c.filter(u=>typeof u=="string"&&u.trim().length>0)}catch{}const l=o.trim();return l?[l]:[]}catch{return[]}}function Qn(n,a){const o=ls(n);if(!(!o||typeof window>"u"))try{const l=a.filter(c=>c.trim().length>0);if(l.length===0){localStorage.removeItem(o);return}localStorage.setItem(o,JSON.stringify(l))}catch{}}function ln(n){const a=ls(n);if(!(!a||typeof window>"u"))try{localStorage.removeItem(a)}catch{}}const qn="kb-chat-active-session",Zr="task-planner:";function ei(n){return n.agentId.startsWith(Zr)&&!n.lastMessageAt&&!n.lastMessagePreview}function ia(n){const a=typeof n=="string"?n.trim():"",o=a.indexOf("/");return!a||o<=0||o>=a.length-1?{}:{modelProvider:a.slice(0,o),modelId:a.slice(o+1)}}function ti(n){const a=n?.toolCalls;if(!Array.isArray(a))return;const o=a.map(l=>{if(!l||typeof l!="object")return null;const c=l,u=typeof c.toolName=="string"?c.toolName:"";if(!u)return null;const b=c.args;return{toolName:u,...b&&typeof b=="object"?{args:b}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(l=>l!==null);return o.length>0?o:void 0}function ni(n){const a=n?.fallback;if(!a||typeof a!="object")return;const o=a,l=typeof o.primaryModel=="string"?o.primaryModel:"",c=typeof o.fallbackModel=="string"?o.fallbackModel:"",u=o.triggerPoint;if(!(!l||!c||u!=="session-creation"&&u!=="prompt-time"))return{primaryModel:l,fallbackModel:c,triggerPoint:u}}function si(n){const a=n?.failureInfo;if(!a||typeof a!="object")return;const o=a,l=typeof o.summary=="string"?o.summary.trim():"";if(!l)return;const c=(()=>{const u=o.reference;if(!u||typeof u!="object")return;const b=u,p=typeof b.kind=="string"?b.kind.trim():"",i=typeof b.id=="string"?b.id.trim():"";if(!(!p||!i))return{kind:p,id:i,...typeof b.label=="string"&&b.label.trim()?{label:b.label.trim()}:{}}})();return{summary:l,...typeof o.errorClass=="string"&&o.errorClass.trim()?{errorClass:o.errorClass.trim()}:{},...typeof o.code=="string"&&o.code.trim()?{code:o.code.trim()}:{},...typeof o.detail=="string"&&o.detail.trim()?{detail:o.detail.trim()}:{},...c?{reference:c}:{}}}function oa(n,a){const o="Failed to get response";return typeof n=="string"?{summary:n.trim()||o}:{summary:typeof n.summary=="string"&&n.summary.trim()?n.summary.trim():o,...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 Yn(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:ti(n.metadata),fallbackInfo:ni(n.metadata),failureInfo:si(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function ai(n,a){const o=s.useCallback(g=>g?`${nt.CHAT_SESSIONS_PREFIX}${g}`:null,[]),l=s.useCallback((g,x)=>g&&x?`${nt.CHAT_MESSAGES_PREFIX}${g}:${x}`:null,[]),c=s.useCallback(g=>{const x=o(g);return x?Ye(x,{maxAgeMs:Gs})??[]:[]},[o]),[u,b]=s.useState(()=>c(n)),[p,i]=s.useState(null),[h,P]=s.useState(()=>c(n).length===0),[w,M]=s.useState([]),[S,T]=s.useState(!1),[j,R]=s.useState(!1),[O,v]=s.useState(""),[Y,W]=s.useState(""),[le,A]=s.useState([]),[X,I]=s.useState([]),[z,F]=s.useState(""),[H,y]=s.useState(!1),{agentsMap:L}=cs(n),E=s.useRef(null),q=s.useRef(null),k=s.useRef(!1),D=s.useRef([]),$=s.useRef(()=>!1),f=s.useRef(null),_=s.useRef(u),m=s.useRef(p),oe=s.useRef(w),U=s.useRef(j);_.current=u,m.current=p,oe.current=w,U.current=j,s.useEffect(()=>{D.current=X},[X]);const K=s.useRef(new Set),he=s.useRef(0),ge=s.useRef(n);ge.current!==n&&(_t({view:"useChat",trigger:"project-context-change",projectId:n,replayAttempted:!1,detail:{previousProjectId:ge.current??null}}),ge.current=n,he.current++);const se=s.useCallback(async()=>{_.current.length===0&&P(!0);try{const x=[...(await Vs(n)).sessions].sort((G,re)=>new Date(re.updatedAt).getTime()-new Date(G.updatedAt).getTime());b(x);const N=o(n);N&&ce(N,x,{maxBytes:5e5})}catch{const g=c(n);if(_.current.length===0&&g.length===0){const x=o(n);x&&fn(x)}}finally{P(!1)}},[o,n]);s.useEffect(()=>{const g=c(n);b(g),P(g.length===0)},[n,c]),s.useEffect(()=>{se()},[se,n]);const ve=s.useRef(()=>{}),xe=s.useRef(!1);s.useEffect(()=>{xe.current=!1,q.current=null},[n]),s.useEffect(()=>{if(h||xe.current||m.current)return;const g=wt(qn,n);if(!g){xe.current=!0;return}const x=u.find(N=>N.id===g);if(x){xe.current=!0,ve.current(g,x);return}xe.current=!0},[h,u,n]);const Ke=s.useCallback((g,x)=>{const N=l(g,x);return N?Ye(N,{maxAgeMs:Gs})??[]:[]},[l]),Ge=s.useCallback((g,x)=>{const N=Ke(n,g);return N.length>0?(M(N),T(!1),!0):(x?.clearOnMiss!==!1&&M([]),!1)},[n,Ke]),ye=s.useCallback(async(g,x)=>{const N=typeof x?.offset=="number"&&x.offset>0||typeof x?.before=="string",G=l(n,g),re=N?[]:Ke(n,g),V=re.length>0;!N&&V?(M(re),T(!1)):T(!0);try{const J=await ir(g,{limit:50,order:"desc",...x},n),Q=J.messages.slice().reverse().map(Yn),Z=m.current?.id===g||x?.commitForStreamingAttach===!0&&q.current?.sessionId===g;N?Z&&(M(ie=>[...Q,...ie]),y(J.messages.length>=50)):Z&&(M(Q),y(J.messages.length>=50),G&&ce(G,Q,{maxBytes:5e5}))}catch{!N&&oe.current.length===0&&V&&(M(re),T(!1))}finally{T(!1)}},[l,n,Ke]),$e=s.useCallback(()=>{f.current?.(),f.current=null,D.current=[],I([]),v(""),W(""),A([]),R(!1)},[]),Ot=s.useCallback(g=>{const x=m.current?.id;if(typeof g=="number"){const N=D.current.filter((G,re)=>re!==g);D.current=N,I(N),Qn(x,N);return}ln(x),D.current=[],I([])},[]),fe=s.useCallback(()=>{const[g,...x]=D.current,N=g?.trim();if(!N)return;const G=m.current?.id;D.current=x,I(x),Qn(G,x),St.current(N)},[]),Ze=s.useCallback(async(g,x)=>{try{const{session:N}=await Ft(g,n);if(m.current?.id!==g||D.current.length===0)return;if(N.isGenerating||N.inFlightGeneration){$.current(g,N.inFlightGeneration,{silent:x?.silent,priorThreadLoadAlreadyStarted:!0});return}fe()}catch{}},[fe,n]),de=s.useCallback((g,x,N)=>{if(E.current||!g)return!0;k.current=!1;const G=oe.current,re=G.length===0||G[0]?.sessionId!==g;q.current={sessionId:g,replayFromEventId:typeof x?.replayFromEventId=="number"?x.replayFromEventId:null},re&&!N?.priorThreadLoadAlreadyStarted&&(Ge(g,{clearOnMiss:!1}),ye(g,{commitForStreamingAttach:!0})),x&&(v(x.streamingText),W(x.streamingThinking),A(x.toolCalls)),R(!0);const{handlers:V}=ra({sessionId:g,tempUserMessageId:"",initialText:x?.streamingText,initialThinking:x?.streamingThinking,initialToolCalls:x?.toolCalls,setStreamingText:v,setStreamingThinking:W,setStreamingToolCalls:A,cancelStreamingFlushesRef:f,addToast:N?.silent?void 0:a,onFallbackSession:(Q,Z)=>{const ie=ia(Q.fallbackModel);b(ne=>ne.map(ee=>ee.id===Z?{...ee,...ie}:ee)),i(ne=>ne&&ne.id===Z?{...ne,...ie}:ne)},onDone:()=>{v(""),W(""),A([]),R(!1),U.current=!1,E.current=null,q.current=null,ye(g),fe()},onError:Q=>{v(""),W(""),A([]),R(!1),U.current=!1,E.current=null,q.current=null;const Z=oa(Q);N?.silent||a?.(Z.summary,"error"),ye(g),Ze(g,{silent:N?.silent})}});_t({view:"useChat",trigger:"sse-open",projectId:n,replayAttempted:typeof x?.replayFromEventId=="number",replayFromEventId:x?.replayFromEventId??null,lastEventId:x?.replayFromEventId??null});const J=or(g,V,n,{...typeof x?.replayFromEventId=="number"?{lastEventId:x.replayFromEventId}:{}});return E.current=J,!0},[a,fe,Ze,Ge,ye,n]);$.current=de;const Ee=s.useCallback((g,x)=>{const N=m.current?.id??null;if(g&&N===g&&!x)return;E.current&&(E.current.close(),E.current=null),q.current=null;const G=x??u.find(re=>re.id===g);i(G||null),m.current=G||null,g&&Ft(g,n).then(({session:re})=>{!re.isGenerating||!re.inFlightGeneration||i(V=>!V||V.id!==g?V:{...V,...re})}).catch(()=>{}),$e(),y(!1),g?(Ge(g),ye(g)):M([]),G?.isGenerating&&de(G.id,G.inFlightGeneration,{priorThreadLoadAlreadyStarted:!0}),g?vn(qn,g,n):xt(qn,n)},[de,Ge,u,ye,n,$e]);ve.current=Ee,s.useEffect(()=>{const g=p?.id;if(!g)return;const x=Jr(g);if(x.length===0)return;D.current=x,I(x);let N=!1;return Ft(g,n).then(({session:G})=>{if(!(N||m.current?.id!==g||D.current.length===0)){if(G.isGenerating){E.current||de(g,G.inFlightGeneration);return}!U.current&&!E.current&&fe()}}).catch(()=>{}),()=>{N=!0}},[p?.id,de,fe,n]);const Ct=s.useCallback(async g=>{const x=m.current?.id,N=await cr(g,n);E.current&&(E.current.close(),E.current=null),q.current=null;const G={id:N.session.id,title:N.session.title,agentId:N.session.agentId,status:N.session.status,modelProvider:N.session.modelProvider,modelId:N.session.modelId,createdAt:N.session.createdAt,updatedAt:N.session.updatedAt};return b(re=>re.some(V=>V.id===G.id)?re:[G,...re]),ln(x),$e(),Ee(G.id,G),G},[n,$e,Ee]),wn=s.useCallback(async g=>{ln(g),await Ws(g,{status:"archived"},n),b(x=>x.filter(N=>N.id!==g)),p?.id===g&&(q.current=null,i(null),M([]))},[p,n]),st=s.useCallback(async(g,x)=>{const N=x.trim()||null,G=u,re=p;b(V=>V.map(J=>J.id===g?{...J,title:N}:J)),i(V=>V?.id===g?{...V,title:N}:V);try{const J=(await Ws(g,{title:N},n)).session;b(Q=>Q.map(Z=>Z.id===g?{...Z,title:J.title,updatedAt:J.updatedAt}:Z)),i(Q=>Q?.id===g?{...Q,title:J.title,updatedAt:J.updatedAt}:Q)}catch(V){throw b(G),i(re),a?.("Failed to rename conversation","error"),V}},[p,a,n,u]),zt=s.useCallback(async g=>{ln(g),p?.id===g&&E.current&&(E.current.close(),E.current=null),p?.id===g&&(q.current=null),await lr(g,n);const x=l(n,g);x&&fn(x),b(N=>N.filter(G=>G.id!==g)),p?.id===g&&(i(null),M([]))},[p,l,n]),De=s.useCallback(async()=>{if(!p||!H)return;const g=oe.current[0]?.createdAt;g&&await ye(p.id,{before:g})},[p,H,ye]),Bt=s.useCallback(()=>{p&&(k.current=!0,f.current?.(),f.current=null,E.current?.close(),E.current=null,q.current=null,ur(p.id,n).catch(()=>{}),R(!1),U.current=!1,v(""),W(""),A([]),fe())},[p,n,fe]),St=s.useRef(()=>{}),kt=dr(),at=s.useCallback(async g=>{try{await se();const x=await Ft(g,n);m.current?.id===g&&i(N=>!N||N.id!==g?N:{...N,...x.session}),x.session.isGenerating?(v(""),W(""),A([]),R(!0),U.current=!0,de(g,x.session.inFlightGeneration,{silent:!0})):(v(""),W(""),A([]),R(!1),U.current=!1,await ye(g))}catch{}},[de,ye,n,se]),rt=s.useCallback((g,x)=>{if(!p)return;if(U.current){const V=g.trim();if(!V)return;const J=[...D.current,V];D.current=J,I(J),Qn(p.id,J);return}k.current=!1,E.current&&(E.current.close(),E.current=null),q.current=null;const N=`temp-${Date.now()}`,G={id:N,sessionId:p.id,role:"user",content:g,createdAt:new Date().toISOString()};M(V=>[...V,G]),v(""),W(""),A([]),R(!0),U.current=!0;const{handlers:re}=ra({sessionId:p.id,tempUserMessageId:N,setStreamingText:v,setStreamingThinking:W,setStreamingToolCalls:A,cancelStreamingFlushesRef:f,addToast:a,onFallbackSession:(V,J)=>{const Q=ia(V.fallbackModel);b(Z=>Z.map(ie=>ie.id===J?{...ie,...Q}:ie)),i(Z=>Z&&Z.id===J?{...Z,...Q}:Z)},onDone:({messageId:V,message:J,accumulated:Q})=>{const Z=J?{...Yn(J),...Q.text.length>0?{content:Q.text}:{}}:{id:V||`msg-${Date.now()}`,sessionId:p.id,role:"assistant",content:Q.text,thinkingOutput:Q.thinking,toolCalls:Q.toolCalls.length>0?Q.toolCalls:void 0,fallbackInfo:Q.fallbackInfo,createdAt:new Date().toISOString()};K.current.add(Z.id),M(ie=>[...ie,Z]),v(""),W(""),A([]),R(!1),U.current=!1,E.current=null,q.current=null,setTimeout(()=>{K.current.delete(Z.id)},1e3),se(),fe()},onError:(V,J)=>{const Q=oa(V),Z=typeof V=="string"?V:Q.summary,ie=hr(Z);M(ne=>{const ee=ne.filter(me=>me.id!==J);return ie?ee:[...ee,{id:`error-${Date.now()}`,sessionId:p.id,role:"assistant",content:Q.summary,failureInfo:Q,createdAt:new Date().toISOString()}]}),v(""),W(""),A([]),R(!1),U.current=!1,E.current=null,q.current=null,console.error("[useChat] Stream error:",V),ie?(console.info("[useChat] Suppressed tab-suspension stream error:",V),p?.id&&(v(""),W(""),A([]),R(!0),U.current=!0,at(p.id))):(a?.(Q.summary,"error"),se()),k.current||fe()}});E.current=mr(p.id,g,re,x,n)},[p,n,se,a,de,at,fe]);St.current=rt;const Cn=z?u.filter(g=>g.title?.toLowerCase().includes(z.toLowerCase())||g.agentId.toLowerCase().includes(z.toLowerCase())):u;return s.useEffect(()=>{if(!p?.id||p.isGenerating!==!0||E.current)return;const g=typeof p.inFlightGeneration?.replayFromEventId=="number"?p.inFlightGeneration.replayFromEventId:null,x=q.current;x?.sessionId===p.id&&x.replayFromEventId===g||de(p.id,p.inFlightGeneration,{silent:!0})},[p?.id,p?.isGenerating,p?.inFlightGeneration,de]),s.useEffect(()=>{if(!m.current?.isGenerating||(E.current||de(m.current.id,m.current.inFlightGeneration),!U.current||E.current||!m.current))return;const g=setInterval(async()=>{if(!U.current||E.current||!m.current){clearInterval(g);return}try{(await Vs(n)).sessions.find(G=>G.id===m.current?.id)?.isGenerating||(clearInterval(g),await ye(m.current.id),v(""),W(""),A([]),R(!1),U.current=!1,fe())}catch{}},3e3);return()=>clearInterval(g)},[de,ye,n,p,fe]),s.useEffect(()=>kt.onBecameVisible(()=>{const x=m.current;if(!x||E.current)return;const N=he.current;Ft(x.id,n).then(G=>{if(!(he.current!==N||E.current)){if(G.session.isGenerating){v(""),W(""),A([]),R(!0),U.current=!0,de(x.id,G.session.inFlightGeneration,{silent:!0});return}U.current&&(v(""),W(""),A([]),R(!1),U.current=!1,fe(),ye(x.id))}}).catch(()=>{})}),[de,ye,n,kt,fe]),s.useEffect(()=>{const g=he.current,x=n?`?projectId=${encodeURIComponent(n)}`:"",N=()=>he.current!==g,G=ie=>{if(N())return;const ne=JSON.parse(ie.data);ei(ne)||b(ee=>ee.some(me=>me.id===ne.id)?ee:[ne,...ee])},re=ie=>{if(N())return;const ne=JSON.parse(ie.data);b(ee=>[...ee.map(pe=>pe.id===ne.id?ne:pe)]),m.current?.id===ne.id&&(i(ne),ne.isGenerating&&!E.current&&de(ne.id,ne.inFlightGeneration))},V=ie=>{if(N())return;const{id:ne}=JSON.parse(ie.data);b(me=>me.filter(pe=>pe.id!==ne));const ee=l(n,ne);ee&&fn(ee),m.current?.id===ne&&(i(null),M([]))},J=ie=>{if(N())return;const ne=JSON.parse(ie.data),ee=Yn(ne);if(_.current.some(me=>me.id===ee.sessionId)||se(),!K.current.has(ee.id)){if(m.current?.id===ee.sessionId&&U.current&&!E.current&&ee.role==="assistant"){M(me=>me.some(pe=>pe.id===ee.id)?me:[...me,ee]),v(""),W(""),A([]),R(!1),U.current=!1,fe();return}m.current?.id===ee.sessionId&&!U.current&&M(me=>{if(me.some(pe=>pe.id===ee.id))return me;if(ee.role==="user"){const pe=me.findIndex(ke=>ke.role==="user"&&ke.id.startsWith("temp-")&&ke.content.trim()===ee.content.trim());if(pe>=0){const ke=[...me];return ke[pe]=ee,ke}}return[...me,ee]})}},Q=ie=>{if(N())return;const{id:ne}=JSON.parse(ie.data);M(ee=>ee.filter(me=>me.id!==ne))};return ka(`/api/events${x}`,{events:{"chat:session:created":G,"chat:session:updated":re,"chat:session:deleted":V,"chat:message:added":J,"chat:message:deleted":Q}})},[de,l,n,fe,se]),s.useEffect(()=>()=>{E.current&&(E.current.close(),E.current=null),q.current=null},[]),{sessions:u,activeSession:p,sessionsLoading:h,messages:w,messagesLoading:S,isStreaming:j,streamingText:O,streamingThinking:Y,streamingToolCalls:le,pendingMessages:X,selectSession:Ee,createSession:Ct,archiveSession:wn,renameSession:st,deleteSession:zt,sendMessage:rt,stopStreaming:Bt,clearPendingMessage:Ot,loadMoreMessages:De,hasMoreMessages:H,searchQuery:z,setSearchQuery:F,filteredSessions:Cn,refreshSessions:se,agentsMap:L}}function un(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function ri(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function Jn(n,a){const o=ri(),l=a?.warm===!0,c=un(),u=new Map;let b=!1,p=!1;return{mark(h){b||p||!o||u.has(h)||u.set(h,un())},complete:h=>{if(!o||b||p){b=!0;return}b=!0,u.set("complete",un());const P=Array.from(u.entries()).sort((T,j)=>T[1]-j[1]);let w=c;const M={};for(const[T,j]of P)M[T]=Math.max(0,j-w),w=j;const S=Math.max(0,un()-c);try{console.debug("[room-open]",{roomId:n,warm:l,totalMs:S,phases:M,...h??{}})}catch{}},cancel(){p=!0,b=!0}}}const qe="fusion:chat-active-room";class Ta extends Error{roomId;constructor(a,o){super(a),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=o}}function as(n){return[...n].sort((a,o)=>new Date(o.updatedAt).getTime()-new Date(a.updatedAt).getTime())}function bt(n,a){const o=n.findIndex(c=>c.id===a.id);if(o===-1)return as([a,...n]);const l=[...n];return l[o]=a,as(l)}function Ue(n){try{return JSON.parse(n.data)}catch{return null}}function ii(n,a,o){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:n,role:"user",content:a,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...o?.length?{attachments:o}:{},createdAt:new Date().toISOString()}}function ca(n,a,o){if(n.some(c=>c.id===a.id))return n;const l=o?n.findIndex(c=>c.id===o):-1;if(l>=0){const c=[...n];return c[l]=a,c}if(a.role==="user"){const c=n.findIndex(u=>u.role==="user"&&u.id.startsWith("temp-")&&u.content.trim()===a.content.trim());if(c>=0){const u=[...n];return u[c]=a,u}}return[...n,a]}function oi(n,a){const{t:o}=Je("app"),l=`${nt.CHAT_ROOMS}:${n??"global"}`,c=`${nt.ACTIVE_CHAT_ROOM_ID}:${n??"global"}`,u=s.useCallback(k=>`${nt.CHAT_ROOM_MESSAGES_PREFIX}${n??"global"}:${k}`,[n]),b=s.useCallback(k=>`${nt.CHAT_ROOM_MEMBERS_PREFIX}${n??"global"}:${k}`,[n]),[p,i]=s.useState(()=>{const k=Ye(l,{maxAgeMs:ss});return Array.isArray(k)?k:[]}),[h,P]=s.useState(()=>p.length===0),[w,M]=s.useState(null),[S,T]=s.useState(()=>{const k=Ye(c,{maxAgeMs:Xs});return k?p.find(D=>D.id===k)??null:null}),[j,R]=s.useState([]),[O,v]=s.useState([]),[Y,W]=s.useState(!1),le=s.useRef(p),A=s.useRef(S),X=s.useRef(0),I=s.useRef(n);le.current=p,A.current=S,I.current!==n&&(I.current=n,X.current+=1);const z=s.useCallback(async k=>{if(!k){R([]),v([]),W(!1);return}const D=Jn(k.id,{warm:!1});D.mark("select");const $=Ye(u(k.id),{maxAgeMs:fr}),f=Ye(b(k.id),{maxAgeMs:ss}),_=Array.isArray($)&&$.length>0,m=Array.isArray(f)&&f.length>0;_||m?(D.mark("cache-hit"),_&&(v($),D.mark("hydrate")),m&&R(f),W(!1)):(v([]),W(!0));try{const[oe,U]=await Promise.all([gr(k.id,n),Wn(k.id,{limit:100,order:"desc"},n)]);D.mark("members-fetch"),D.mark("messages-fetch"),ce(b(k.id),oe.members,{maxBytes:5e5}),ce(u(k.id),U.messages,{maxBytes:5e5}),A.current?.id===k.id&&(R(oe.members),v(U.messages),D.mark("hydrate"))}catch{!_&&!m&&(R([]),v([]))}finally{W(!1),D.complete({warm:_,membersCached:m})}},[b,u,n]),F=s.useCallback(async()=>{le.current.length===0&&P(!0);try{const k=await pr({},n),D=as(k.rooms);i(D),ce(l,D,{maxBytes:5e5}),M(null);const $=Ye(c,{maxAgeMs:Xs})??wt(qe,n);if($){const f=D.find(_=>_.id===$)??null;f?(T(f),z(f)):(xt(qe,n),ce(c,"",{maxBytes:5e5}))}}catch(k){const D=k instanceof Error?k.message:o("chatRooms.error.failedToLoad","Failed to load chat rooms");M(D),a?.(D,"error")}finally{P(!1)}},[c,a,z,n,l]),H=s.useCallback(k=>{if(!k){A.current=null,T(null),xt(qe,n),ce(c,"",{maxBytes:5e5}),z(null);return}const D=le.current.find($=>$.id===k)??null;A.current=D,T(D),D&&(vn(qe,D.id,n),ce(c,D.id,{maxBytes:5e5}),z(D))},[c,z,n]),y=s.useCallback(async k=>{const $=(await br({name:k.name,memberAgentIds:k.memberAgentIds},n)).room;return i(f=>bt(f,$)),A.current=$,T($),vn(qe,$.id,n),ce(c,$.id,{maxBytes:5e5}),await z($),$},[c,z,n]),L=s.useCallback(async k=>{await vr(k,n),i(D=>D.filter($=>$.id!==k)),ce(u(k),[],{maxBytes:5e5}),ce(b(k),[],{maxBytes:5e5}),A.current?.id===k&&(A.current=null,T(null),R([]),v([]),xt(qe,n),ce(c,"",{maxBytes:5e5}))},[c,b,u,n]),E=s.useCallback(async(k,D)=>{const $=A.current,f=$?.id;if(!f)throw new Error(o("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const _=Jn(f,{warm:!1}),m=D?.files?.map(K=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:K.name,originalName:K.name,mimeType:K.type||"application/octet-stream",size:K.size,createdAt:new Date().toISOString()})),oe=ii(f,k,m?.length?m:D?.attachments);A.current?.id===f&&v(K=>{const he=[...K,oe];return ce(u(f),he,{maxBytes:5e5}),he});let U=!1;try{const K=[];if(D?.files?.length)for(const ve of D.files)try{const xe=await xr(f,ve,n);K.push(xe.attachment)}catch{throw new Error(o("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:ve.name}))}const he=[...D?.attachments??[],...K],ge=await yr(f,{content:k,...he.length?{attachments:he}:{}},n);U=!0,ge.message?.createdAt&&$&&i(ve=>bt(ve,{...$,updatedAt:ge.message.createdAt})),A.current?.id===f&&v(ve=>{const xe=ca(ve,ge.message,oe.id);return ce(u(f),xe,{maxBytes:5e5}),xe});const se=await Wn(f,{limit:100,order:"desc"},n);if(ce(u(f),se.messages,{maxBytes:5e5}),A.current?.id!==f)return;v(se.messages),_.mark("hydrate")}catch(K){let he=null;try{const se=await Wn(f,{limit:100,order:"desc"},n);he=se.messages,ce(u(f),se.messages,{maxBytes:5e5}),A.current?.id===f&&(v(se.messages),_.mark("hydrate"))}catch{A.current?.id===f&&v(se=>{const ve=se.filter(xe=>xe.id!==oe.id);return ce(u(f),ve,{maxBytes:5e5}),ve})}const ge=he?.some(se=>se.role==="user"&&se.content.trim()===oe.content.trim());if(U||ge){const se=K instanceof Error&&K.message.trim()?K.message:o("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new Ta(se,f)}throw K}finally{_.complete({source:"send-room-message"})}},[u,n]),q=s.useCallback(async k=>{!k||!le.current.some(D=>D.id===k)||(await wr(k,n),ce(u(k),[],{maxBytes:5e5}),A.current?.id===k&&v([]))},[u,n]);return s.useEffect(()=>{F()},[F]),s.useEffect(()=>{const k=X.current,D=n?`/api/events?projectId=${encodeURIComponent(n)}`:"/api/events";return ka(D,{onReconnect:()=>{_t({view:"useChatRooms",trigger:"sse-reconnect",projectId:n,replayAttempted:!1});const $=A.current?.id;if($){const f=Jn($,{warm:!0});f.mark("sse-reconnect-refresh"),F().finally(()=>f.complete({source:"sse-reconnect"}));return}F()},events:{"chat:room:created":$=>{if(X.current!==k)return;const f=Ue($);f&&i(_=>bt(_,f))},"chat:room:updated":$=>{if(X.current!==k)return;const f=Ue($);f&&(i(_=>bt(_,f)),A.current?.id===f.id&&T(f))},"chat:room:deleted":$=>{if(X.current!==k)return;const f=Ue($);f?.id&&(i(_=>_.filter(m=>m.id!==f.id)),ce(u(f.id),[],{maxBytes:5e5}),ce(b(f.id),[],{maxBytes:5e5}),A.current?.id===f.id&&(A.current=null,T(null),R([]),v([]),xt(qe,n),ce(c,"",{maxBytes:5e5})))},"chat:room:member:added":$=>{if(X.current!==k)return;const f=Ue($);!f||A.current?.id!==f.roomId||R(_=>{if(_.some(oe=>oe.agentId===f.agentId))return _;const m=[..._,f];return ce(b(f.roomId),m,{maxBytes:5e5}),m})},"chat:room:member:removed":$=>{if(X.current!==k)return;const f=Ue($);!f||A.current?.id!==f.roomId||R(_=>{const m=_.filter(oe=>oe.agentId!==f.agentId);return ce(b(f.roomId),m,{maxBytes:5e5}),m})},"chat:room:message:added":$=>{if(X.current!==k)return;const f=Ue($);f&&(i(_=>{const m=_.find(oe=>oe.id===f.roomId);return m?bt(_,{...m,updatedAt:f.createdAt}):_}),A.current?.id===f.roomId&&v(_=>{const m=ca(_,f);return m===_?_:(ce(u(f.roomId),m,{maxBytes:5e5}),m)}))},"chat:room:message:updated":$=>{if(X.current!==k)return;const f=Ue($);!f||A.current?.id!==f.roomId||v(_=>{const m=_.map(oe=>oe.id===f.id?f:oe);return ce(u(f.roomId),m,{maxBytes:5e5}),m})},"chat:room:message:deleted":$=>{if(X.current!==k)return;const f=Ue($);f?.id&&v(_=>{const m=_.filter(U=>U.id!==f.id),oe=A.current?.id;return oe&&ce(u(oe),m,{maxBytes:5e5}),m})},"chat:room:messages:cleared":$=>{if(X.current!==k)return;const f=Ue($);f?.roomId&&(ce(u(f.roomId),[],{maxBytes:5e5}),A.current?.id===f.roomId&&v([]),i(_=>{const m=_.find(oe=>oe.id===f.roomId);return m?bt(_,{...m,updatedAt:new Date().toISOString()}):_}))}}})},[c,b,u,n,F]),s.useEffect(()=>{S&&(p.some(k=>k.id===S.id)||(A.current=null,T(null),R([]),v([]),xt(qe,n),ce(c,"",{maxBytes:5e5})))},[S,c,n,p]),{rooms:p,roomsLoading:h,roomsError:w,activeRoom:S,activeRoomMembers:j,messages:O,messagesLoading:Y,selectRoom:H,createRoom:y,deleteRoom:L,sendRoomMessage:E,clearRoom:q,refreshRooms:F}}const Pt={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},la=200;function rs(n){if(!n)return null;const a=new Date(n).getTime();return Number.isFinite(a)?a:null}function Ea(n){const a=Object.entries(n);if(a.length<=la)return n;const o=a.map(([l,c])=>({id:l,timestamp:c,value:rs(c)??0})).sort((l,c)=>c.value-l.value).slice(0,la);return Object.fromEntries(o.map(({id:l,timestamp:c})=>[l,c]))}function dn(n){if(!n)return{};try{const a=JSON.parse(n);if(!a||typeof a!="object")return{};const o={};for(const[l,c]of Object.entries(a))typeof l=="string"&&typeof c=="string"&&(o[l]=c);return Ea(o)}catch{return{}}}function ci(n){const[a,o]=s.useState(()=>{try{return dn(wt(Pt.direct,n))}catch{return{}}}),[l,c]=s.useState(()=>{try{return dn(wt(Pt.room,n))}catch{return{}}});s.useEffect(()=>{try{o(dn(wt(Pt.direct,n)))}catch{o({})}try{c(dn(wt(Pt.room,n)))}catch{c({})}},[n]);const u=s.useMemo(()=>({direct:a,room:l}),[a,l]),b=s.useCallback((w,M)=>{const S=Ea(M);try{vn(Pt[w],JSON.stringify(S),n)}catch{}return S},[n]),p=s.useCallback((w,M)=>{if(w==="direct"){o(S=>b(w,M(S)));return}c(S=>b(w,M(S)))},[b]),i=s.useCallback((w,M,S)=>{const T=rs(S);if(T===null)return!1;const j=u[w][M],R=rs(j);return R===null?!0:T>R},[u]),h=s.useCallback((w,M,S)=>{if(!M)return;const T=S??new Date().toISOString();p(w,j=>({...j,[M]:T}))},[p]),P=s.useCallback((w,M)=>{M.length!==0&&p(w,S=>{const T={...S};for(const j of M)j.id&&(T[j.id]=j.lastActivityAt??new Date().toISOString());return T})},[p]);return{isUnread:i,markRead:h,markAllRead:P}}function ua(n){return n.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function Da(n,a){const o=a.trim();if(!o)return!0;const l=ua(o);return ua(n).includes(l)||n.toLowerCase().includes(o.toLowerCase())}function da({agents:n,filter:a,highlightedIndex:o,visible:l,onSelect:c,position:u="below",roomMemberIds:b,roomName:p}){const{t:i}=Je("app"),h=s.useMemo(()=>n.filter(j=>Da(j.name,a)),[n,a]),P=!!b,w=P&&a.trim().length>0,M=s.useMemo(()=>P?h.filter(j=>b?.has(j.id)):h,[h,b,P]),S=s.useMemo(()=>P?h.filter(j=>!b?.has(j.id)):[],[h,b,P]),T=w?[...M,...S]:M;return l?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${u}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":i("agentMention.suggestionsLabel","Agent mention suggestions"),children:T.length===0?t.jsx("div",{className:"agent-mention-empty",children:i("agentMention.noAgentsFound","No agents found")}):t.jsxs(t.Fragment,{children:[P&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:p?i("agentMention.membersOf","Members of #{{roomName}}",{roomName:p}):i("agentMention.roomMembers","Room members")}),M.map((j,R)=>t.jsxs("button",{type:"button",className:`agent-mention-item${R===o?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${j.id}`,onMouseDown:O=>O.preventDefault(),onClick:()=>c(j),role:"option","aria-selected":R===o,children:[t.jsx(xn,{agent:j,size:20}),P&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":i("agentMention.roomMemberBadge","Room member")}),t.jsx("span",{className:"agent-mention-name",children:j.name}),t.jsx("span",{className:"agent-mention-role",children:j.role})]},j.id)),P&&!w&&S.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:i("agentMention.typeToSearch","Type to search other agents")}),P&&w&&S.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:i("agentMention.otherAgents","Other agents")}),S.map((j,R)=>{const O=M.length+R;return t.jsxs("button",{type:"button",className:`agent-mention-item${O===o?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${j.id}`,onMouseDown:v=>v.preventDefault(),onClick:()=>c(j),role:"option","aria-selected":O===o,children:[t.jsx(xn,{agent:j,size:20}),t.jsx("span",{className:"agent-mention-name",children:j.name}),t.jsx("span",{className:"agent-mention-role",children:j.role})]},j.id)})]})]})}):null}function li(n,a){return n+a}function ui({visible:n,position:a,tasks:o,files:l,selectedIndex:c,onSelectTask:u,onSelectFile:b,loading:p}){const{t:i}=Je("app");if(!n)return null;const h=o.length>0,P=l.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:a.top,left:a.left},"data-testid":"file-mention-popup",onMouseDown:w=>{w.preventDefault()},children:[p&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!p&&!h&&!P&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:i("fileMention.empty","No tasks or files found")}),!p&&(h||P)&&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:i("fileMention.taskHeader","Tasks")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":i("fileMention.taskMatches","Task matches"),children:o.map((w,M)=>{const S=M;return t.jsxs("li",{className:`file-mention-popup-item${S===c?" file-mention-popup-item--selected":""}`,onClick:()=>u(w),role:"option","aria-selected":S===c,"data-testid":`task-mention-item-${S}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(ja,{})}),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:w.id}),t.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${w.column}`,children:w.column})]}),t.jsx("span",{className:"file-mention-popup-item-path",children:w.title})]})]},w.id)})})]}),P&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:i("fileMention.fileHeader","Files")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":i("fileMention.fileMatches","File matches"),children:l.map((w,M)=>{const S=li(o.length,M),T=Cr(w.path);return t.jsxs("li",{className:`file-mention-popup-item${S===c?" file-mention-popup-item--selected":""}`,onClick:()=>b(w),role:"option","aria-selected":S===c,"data-testid":`file-mention-item-${S}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Ma,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:w.name}),T&&t.jsx("span",{className:"file-mention-popup-item-path",children:T})]})]},w.path)})})]})]})]})}function di(n,a=[],o){const l=n.trim().replace(/^#/,""),c=(b,p)=>o?o(b,p):p;if(!l)return{ok:!1,error:c("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(l))return{ok:!1,error:c("createRoom.lowercase","Use lowercase letters only.")};const u=l.toLowerCase();return u.length>80?{ok:!1,error:c("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(u)?/^[-_]|[-_]$/.test(u)?{ok:!1,error:c("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:a.some(b=>b.toLowerCase()===u)?{ok:!1,error:c("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:u}:{ok:!1,error:c("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function mi({isOpen:n,onClose:a,onCreate:o,projectId:l,existingRoomNames:c=[]}){const{t:u}=Je("app"),[b,p]=s.useState(""),[i,h]=s.useState([]),[P,w]=s.useState(""),[M,S]=s.useState([]),[T,j]=s.useState(!1),[R,O]=s.useState(null),[v,Y]=s.useState(!1),W=s.useRef(null),le=s.useRef(null);s.useEffect(()=>{n&&(le.current=document.activeElement instanceof HTMLElement?document.activeElement:null,j(!0),O(null),Sr(void 0,l).then(y=>h(y)).catch(()=>{h([]),O(u("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>j(!1)))},[n,l]),s.useEffect(()=>{if(!n){p(""),w(""),S([]),O(null),Y(!1);return}const y=window.requestAnimationFrame(()=>W.current?.focus());return()=>window.cancelAnimationFrame(y)},[n]),s.useEffect(()=>{if(!n)return;const y=L=>{L.key==="Escape"&&a()};return document.addEventListener("keydown",y),()=>document.removeEventListener("keydown",y)},[n,a]),s.useEffect(()=>{n||le.current?.focus()},[n]);const A=s.useMemo(()=>di(b,c,u),[b,c,u]),X=s.useMemo(()=>{const y=P.trim().toLowerCase();return y?i.filter(L=>L.name.toLowerCase().includes(y)):i},[i,P]),I=s.useMemo(()=>i.filter(y=>M.includes(y.id)),[i,M]),z=A.ok&&M.length>0&&!v&&!T;if(!n)return null;const F=y=>{v||S(L=>L.includes(y)?L.filter(E=>E!==y):[...L,y])},H=async()=>{if(!A.ok){O(A.error);return}if(M.length===0){O(u("createRoom.selectMember","Select at least one member."));return}O(null),Y(!0);try{await o({name:A.name,displayName:`#${A.name}`,memberAgentIds:M}),a()}catch(y){O(y instanceof Error?y.message:u("createRoom.failedCreate","Failed to create room."))}finally{Y(!1)}};return ar.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:y=>y.target===y.currentTarget&&a(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":u("createRoom.title","Create room"),onClick:y=>y.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:u("createRoom.title","Create room")}),t.jsx("button",{type:"button",className:"modal-close","aria-label":u("actions.close","Close"),onClick:a,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:u("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:b,disabled:v,onChange:y=>{const L=y.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();p(L)}})]}),!A.ok&&t.jsx("div",{className:"form-error",children:A.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:u("createRoom.members","Members")}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:u("createRoom.searchAgents","Search agents"),value:P,disabled:v,onChange:y=>w(y.target.value)})]}),I.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:I.map(y=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>F(y.id),disabled:v,children:[y.name," ×"]},y.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:T?t.jsx("div",{className:"create-room-modal-empty",children:t.jsx(kr,{label:u("createRoom.loadingAgents","Loading agents...")})}):X.length===0?t.jsx("div",{className:"create-room-modal-empty",children:i.length===0?u("createRoom.noAgents","No agents in this project yet."):u("createRoom.noMatch","No agents match your search.")}):X.map(y=>{const L=M.includes(y.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${L?" create-room-modal-member-row--selected":""}`,onClick:()=>F(y.id),disabled:v,children:[t.jsx(xn,{agent:y,size:20}),t.jsx("span",{children:y.name}),t.jsx("span",{className:"create-room-modal-member-role",children:y.role})]},y.id)})}),R&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:R})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:a,disabled:v,children:u("actions.cancel","Cancel")}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void H(),disabled:!z,children:v?u("createRoom.creating","Creating..."):u("createRoom.create","Create room")})]})]})}),document.body)}function hi({cliSessionId:n,tier:a,projectId:o,renderTranscript:l,renderComposer:c,queuedCount:u=0,terminalProps:b}){const{t:p}=Je("app"),i=a==="generic",[h,P]=s.useState(i?"terminal":"transcript");if(i)return t.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:t.jsx(sa,{sessionId:n,projectId:o,...b})});const w=h==="terminal";return t.jsxs("div",{className:"cli-chat-surface","data-tier":a,"data-view":h,children:[t.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":p("cliChat.viewToggleLabel","Chat view"),children:[t.jsxs("button",{type:"button",role:"tab","aria-selected":!w,className:`cli-chat-surface__tab${w?"":" is-active"}`,onClick:()=>P("transcript"),children:[t.jsx(gn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:p("cliChat.transcriptTab","Transcript")})]}),t.jsxs("button",{type:"button",role:"tab","aria-selected":w,className:`cli-chat-surface__tab${w?" is-active":""}`,onClick:()=>P("terminal"),children:[t.jsx(Mr,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:p("cliChat.terminalTab","Terminal")})]})]}),t.jsx("div",{className:"cli-chat-surface__body",children:w?t.jsx(sa,{sessionId:n,projectId:o,...b}):l()}),!w&&t.jsxs("div",{className:"cli-chat-surface__composer",children:[u>0&&t.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:p("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:u})}),c()]})]})}const fi=200,gi=8,pi=8;function ma(){return new DOMException("The operation was aborted.","AbortError")}function ha(n,a){return a.aborted?Promise.reject(ma()):new Promise((o,l)=>{const c=()=>l(ma());a.addEventListener("abort",c,{once:!0}),n.then(u=>{a.removeEventListener("abort",c),o(u)},u=>{a.removeEventListener("abort",c),l(u)})})}function fa(n,a,o){const l=n.slice(0,a),c=n.slice(a+1),u=c.match(/[\s]|$/),b=u?u.index??c.length:c.length,p=c.slice(b);return`${l}${o}${p}`}function bi(n={}){const{projectId:a,workspace:o="project"}=n,[l,c]=s.useState(!1),[u,b]=s.useState(""),[p,i]=s.useState(-1),[h,P]=s.useState([]),[w,M]=s.useState([]),[S,T]=s.useState(!1),[j,R]=s.useState(0),O=s.useRef(null),v=s.useRef(null),Y=[...h.map(F=>({kind:"task",task:F})),...w.map(F=>({kind:"file",file:F}))];s.useEffect(()=>()=>{O.current&&clearTimeout(O.current),v.current?.abort()},[]);const W=s.useCallback((F,H)=>{if(H<0||H>F.length){c(!1);return}const y=L=>/[a-zA-Z0-9/_.-]/.test(L);for(let L=H-1;L>=0;L--){if(F[L]==="#"){if(L===0){const q=F.slice(L+1,H);i(L),b(q),R(0),c(!0);return}const E=F[L-1];if(/[\s,.;:!?'"()[\]{}]/.test(E)){const q=F.slice(L+1,H);i(L),b(q),R(0),c(!0);return}c(!1);return}if(!y(F[L])){c(!1);return}}c(!1)},[]),le=s.useCallback(()=>{v.current?.abort(),c(!1),b(""),i(-1),P([]),M([]),R(0),T(!1)},[]),A=s.useCallback(async F=>{if(!F.trim()){P([]),M([]),T(!1);return}v.current?.abort();const H=new AbortController;v.current=H;try{T(!0);const[y,L]=await Promise.allSettled([ha(Rr(20,0,a,F),H.signal),ha(Nr(F,o,a),H.signal)]);if(H.signal.aborted)return;const E=y.status==="fulfilled"?y.value.slice(0,gi).map(k=>({id:k.id,title:k.title??"",column:k.column})):[],q=L.status==="fulfilled"?L.value.files.slice(0,pi):[];P(E),M(q),R(0)}catch(y){y.name!=="AbortError"&&(P([]),M([]))}finally{H.signal.aborted||T(!1)}},[o,a]);s.useEffect(()=>{if(l)return O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{A(u)},fi),()=>{O.current&&clearTimeout(O.current)}},[u,l,A]);const X=s.useCallback((F,H)=>!l||p<0?H:fa(H,p,`#${F.id}`),[l,p]),I=s.useCallback((F,H)=>!l||p<0?H:fa(H,p,`#${F.path}`),[l,p]),z=s.useCallback((F,H)=>{if(!l||Y.length===0)return!1;switch(F.key){case"ArrowDown":return F.preventDefault(),R(y=>Math.min(y+1,Y.length-1)),!0;case"ArrowUp":return F.preventDefault(),R(y=>Math.max(y-1,0)),!0;case"Enter":case"Tab":return Y[j]?(F.preventDefault(),!0):!1;case"Escape":return F.preventDefault(),le(),!0;default:return!1}},[l,Y,j,le]);return{mentionActive:l,tasks:h,files:w,combinedItems:Y,loading:S,mentionQuery:u,selectedIndex:j,setSelectedIndex:R,detectMention:W,selectTask:X,selectFile:I,dismissMention:le,handleKeyDown:z}}const Zn=new Map,pn=new Map;function us(n){return n??"global"}function is(n){return`${nt.DISCOVERED_SKILLS_PREFIX}${us(n)}`}function vt(n){return Ye(is(n),{maxAgeMs:ss})}function vi(n,a){for(const o of pn.get(n)??[])o(a)}async function xi(n){const a=us(n),o=Zn.get(a);if(o)return o;const l=Ar(n).finally(()=>{Zn.delete(a)});return Zn.set(a,l),l}function yi(n){const[a,o]=s.useState(()=>vt(n)??[]),[l,c]=s.useState(()=>vt(n)===null),u=s.useRef(vt(n)!==null),b=us(n);s.useEffect(()=>{const h=vt(n)??[];o(h),c(vt(n)===null),u.current=vt(n)!==null},[n]),s.useEffect(()=>{const h=pn.get(b)??new Set;return h.add(o),pn.set(b,h),()=>{h.delete(o),h.size===0&&pn.delete(b)}},[b]);const p=s.useCallback(async()=>{try{const h=await xi(n);u.current=!0,ce(is(n),h,{maxBytes:5e5}),vi(b,h)}catch{u.current||fn(is(n))}finally{c(!1)}},[n,b]);s.useEffect(()=>{p()},[p]);const i=s.useCallback(async()=>{c(!0),await p()},[p]);return{skills:a,loading:l,refresh:i}}function wi(n,a){const o=n.reduce((l,c)=>l+(c.content?.length??0),0)+(a?.length??0);return Math.ceil(o/4)}function ga(n){if(!Number.isFinite(n)||n<=0)return"0";if(n<1e3)return String(Math.round(n));const a=n/1e3;return a<10?`~${Number(a.toFixed(1))}k`:`${Math.round(a)}k`}const ds=640,Ci=200,pa="__SKIP__";let es=!1;function Si(n,a=ds){return n>a?"auto":"hidden"}function ki(n,a=ds){return Math.max(40,Math.min(n,a))}function $a(n,a){const o=new Date(n),c=new Date().getTime()-o.getTime(),u=Math.floor(c/1e3),b=Math.floor(u/60),p=Math.floor(b/60),i=Math.floor(p/24);return u<60?a("chat.relativeTimeJustNow","just now"):b<60?a("chat.relativeTimeMinutes","{{count}}m ago",{count:b}):p<24?a("chat.relativeTimeHours","{{count}}h ago",{count:p}):i<7?a("chat.relativeTimeDays","{{count}}d ago",{count:i}):o.toLocaleDateString()}function ba(n,a){if(!n||!a)return null;const o=a.toLowerCase();if(o.includes("claude")){let c=a.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return c=c.replace(/\s+/g," "),c.length>30?c.slice(0,30)+"…":c}if(o.includes("gpt")||o.includes("openai")){const c=a.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return c.length>30?c.slice(0,30)+"…":c}if(o.includes("gemini")){const c=a.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return c.length>30?c.slice(0,30)+"…":c}const l=a.replace(/-/g," ").replace(/^\w/,c=>c.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function bn(n,a){return n.length<=a?n:`${n.slice(0,a)}…`}function Mi(n){if(!n)return null;const a=Object.entries(n);return a.length===0?null:a.map(([o,l])=>{const c=typeof l=="string"?l:(()=>{try{return JSON.stringify(l)}catch{return String(l)}})();return`${o}=${bn(c,50)}`}).join(", ")}function Ri(n){if(n===void 0)return null;if(typeof n=="string")return bn(n,200);try{return bn(JSON.stringify(n),200)}catch{return bn(String(n),200)}}function Ni(n){if(!n)return null;if(n.kind==="mailbox"||n.kind==="mailbox-message"){const a=typeof window>"u"?"/":window.location.pathname||"/",o=new URLSearchParams(typeof window>"u"?"":window.location.search);return o.set("view","mailbox"),o.set("mailbox-message",n.id),`${a}?${o.toString()}#message-${encodeURIComponent(n.id)}`}return null}function Ai(n,a){if(!n)return null;const o=n.label??`${n.kind} ${n.id}`,l=Ni(n),c=`chat-failure-reference-${n.kind}-${n.id}`.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase();return t.jsxs("div",{className:"chat-message-failure-reference",children:[t.jsx("span",{className:"chat-message-failure-reference-label",children:a("chat.failureReferenceLabel","Reference")}),t.jsx("span",{className:"chat-message-failure-reference-value",children:o}),l?t.jsx("a",{className:"btn btn-sm chat-message-failure-reference-link",href:l,children:a("chat.openMailboxMessage","Open mailbox message")}):t.jsxs("details",{className:"chat-message-failure-reference-details",children:[t.jsx("summary",{className:"btn btn-sm chat-message-failure-reference-link",children:a("chat.viewFailureDetails","View failure details")}),t.jsxs("dl",{className:"chat-message-failure-reference-meta",id:c,children:[t.jsxs("div",{children:[t.jsx("dt",{children:a("chat.failureReferenceKind","Kind")}),t.jsx("dd",{children:n.kind})]}),t.jsxs("div",{children:[t.jsx("dt",{children:a("chat.failureReferenceId","ID")}),t.jsx("dd",{children:n.id})]}),n.label&&t.jsxs("div",{children:[t.jsx("dt",{children:a("chat.failureReferenceMetaLabel","Label")}),t.jsx("dd",{children:n.label})]})]})]})]})}function Fa(n,a,o){if(!n||n.length===0)return null;const l=(S,T)=>{const j=Gr(S);if(j){const A=o?.isAwaitingAnswer===!0;return t.jsx(Vr,{parsed:j,answered:!A,submittedAnswer:o?.submittedAnswer,disabled:!A,onSubmit:(X,I)=>o?.onQuestionSubmit?.(X,I)},`${S.toolName}-${T}`)}const R=S.status==="running",O=S.status==="completed"&&S.isError,v=Mi(S.args),Y=Ri(S.result),W=R?v:Y?`${a("chat.toolCallResultPrefix","result")}: ${Y}`:v?`${a("chat.toolCallArgsPrefix","args")}: ${v}`:null,le=R?a("chat.toolCallStatusRunning","running"):O?a("chat.toolCallStatusError","error"):a("chat.toolCallStatusCompleted","completed");return t.jsxs("details",{className:`chat-tool-call${R?" chat-tool-call--running":""}${O?" chat-tool-call--error":""}`,open:R,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",title:S.toolName,children:S.toolName}),W&&t.jsx("span",{className:"chat-tool-call-preview",title:W,children:W}),t.jsx("span",{className:"chat-tool-call-status-text",children:le})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[v&&t.jsxs("div",{className:"chat-tool-call-row",children:[t.jsx("span",{className:"chat-tool-call-label",children:a("chat.toolCallArgsPrefix","args")}),t.jsx("span",{className:"chat-tool-call-value",children:v})]}),Y&&t.jsxs("div",{className:`chat-tool-call-row${O?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:a("chat.toolCallResultPrefix","result")}),t.jsx("span",{className:"chat-tool-call-value",children:Y})]})]})]},`${S.toolName}-${T}`)},c="chat-tool-calls";if(n.length===1)return t.jsxs("div",{className:c,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(aa,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:a("chat.toolCallsHeader","Tool calls")})]}),l(n[0],0)]});const u=n.filter(S=>S.status==="running").length,b=n.filter(S=>S.status==="completed"&&S.isError).length,p=u>0,i=Array.from(new Set(n.map(S=>S.toolName))),h=i.slice(0,5),P=Math.max(0,i.length-h.length),w=P>0?`${h.join(", ")}, +${P} more`:h.join(", "),M=p?`(${u} ${a("chat.toolCallStatusRunning","running")})`:b>0?`(${b} ${b===1?a("chat.toolCallStatusError","error"):a("chat.toolCallStatusErrors","errors")})`:null;return t.jsx("div",{className:c,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:p,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(aa,{size:12,"aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-calls-count",children:a("chat.toolCallsCount","{{count}} tool calls",{count:n.length})}),t.jsx("span",{className:"chat-tool-calls-names",title:w,children:w}),M&&t.jsx("span",{className:"chat-tool-calls-group-status",children:M})]}),n.map((S,T)=>l(S,T))]})})}const Pa={p:({children:n,...a})=>t.jsx("p",{...a,children:ta(n)}),li:({children:n,...a})=>t.jsx("li",{...a,children:ta(n)}),pre:({children:n,...a})=>t.jsx("pre",{...a,className:"chat-markdown-pre",children:n}),code:({children:n,...a})=>{const o=typeof n=="string"?n:rr.Children.toArray(n).join(""),l=yn(o);return l.length===1&&typeof l[0]=="string"?t.jsx("code",{...a,children:n}):t.jsx("code",{...a,children:l})},table:({children:n,...a})=>t.jsx("table",{...a,className:"chat-markdown-table",children:n})},yt="__fn_agent__",ji=280,mn=180,hn=500,va="fusion:chat-sidebar-width",ts="fusion:chat-scope",Ti="fusion:chat-draft:";function xa(n,a){return a?`${Ti}${n}:${a}`:null}function ya(n){if(!n)return"";try{return localStorage.getItem(n)??""}catch{return""}}const Ei=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function wa(n){const a=/(^|[\s])\/([^\s]*)$/.exec(n);if(!a)return null;const o=a[1]??"",l=a[2]??"",c=a.index+o.length;return{filter:l,start:c,end:n.length}}function Di(n,a){const o=n.slice(0,a),l=/(^|[\s\n])@([\w-]*)$/.exec(o);if(!l)return null;const c=l[2]??"",u=o.length-c.length-1;return{filter:c,start:u,end:a}}function $i(n){const a=n?.runtimeConfig;if(!a||typeof a!="object")return null;const o=Reflect.get(a,"modelProvider"),l=Reflect.get(a,"modelId");return typeof o!="string"||o.trim().length===0||typeof l!="string"||l.trim().length===0?null:{provider:o,modelId:l}}function Ca(n,a,o){if(n?.modelProvider&&n?.modelId)return{provider:n.modelProvider,modelId:n.modelId};const l=$i(a??void 0);return l||(o.provider&&o.modelId?{provider:o.provider,modelId:o.modelId}:null)}function Fi({projectId:n,defaultModel:a,onClose:o,onCreate:l}){const{t:c}=Je("app"),[u,b]=s.useState("agent"),{agents:p,loading:i}=cs(n),[h,P]=s.useState(""),{models:w,favoriteProviders:M,favoriteModels:S,loading:T,refresh:j}=Ra(),R=a.provider&&a.modelId?`${a.provider}/${a.modelId}`:"",[O,v]=s.useState(R),[Y,W]=s.useState(M),[le,A]=s.useState(S);s.useEffect(()=>{W(M)},[M]),s.useEffect(()=>{A(S)},[S]),s.useEffect(()=>{R&&v(y=>y||R)},[R]);const X=s.useCallback(async y=>{const L=Y,q=L.includes(y)?L.filter(k=>k!==y):[y,...L];W(q);try{await na({favoriteProviders:q,favoriteModels:le}),await j()}catch{W(L)}},[Y,le,j]),I=s.useCallback(async y=>{const L=le,q=L.includes(y)?L.filter(k=>k!==y):[y,...L];A(q);try{await na({favoriteProviders:Y,favoriteModels:q}),await j()}catch{A(L)}},[le,Y,j]),z=O||R,F=y=>{if(y.preventDefault(),u==="agent"){if(!h)return;l({agentId:h});return}if(!z)return;const L=z.indexOf("/");if(L<=0)return;const E=z.slice(0,L),q=z.slice(L+1);l({agentId:yt,modelProvider:E,modelId:q})},H=u==="agent"?!h:!z;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:o,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:y=>y.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${u==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{b("agent")},children:c("chat.newChatModeAgent","Agent")}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${u==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{b("model"),P(""),v(y=>y||R)},children:c("chat.newChatModeModel","Model")})]}),t.jsxs("form",{onSubmit:F,children:[u==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:[c("chat.newChatModeAgent","Agent"),i?t.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingAgents","Loading agents...")}):p.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:p.map(y=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${h===y.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>P(y.id),"data-testid":`agent-option-${y.id}`,children:[t.jsx(Lt,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:y.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:y.role})]},y.id))})]}),u==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:T?t.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingModels","Loading models...")}):t.jsx(Kr,{models:w,value:O,onChange:v,label:c("chat.newChatModeModel","Model"),placeholder:c("chat.selectModel","Select a model"),favoriteProviders:Y,onToggleFavorite:X,favoriteModels:le,onToggleModelFavorite:I})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:o,children:c("chat.cancel","Cancel")}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:H,children:c("chat.create","Create")})]})]})]})})}function Sa(n,a){return n.slice(a+1).find(o=>o.role==="user")?.content}const ns=s.memo(function({message:a,forcePlain:o,agentName:l,hideAssistantIdentity:c,showAssistantModelTag:u,activeModelTag:b,activeModelProvider:p,activeSessionId:i,mentionAgentsByName:h,roomContext:P,copyAction:w,onScrollToTop:M,isAwaitingQuestionAnswer:S,submittedQuestionAnswer:T,onQuestionSubmit:j}){const{t:R}=Je("app"),O=a.role==="assistant",v=O?a.failureInfo:void 0,Y=O&&(!c||!!v),W=s.useMemo(()=>{if(O)return null;const X=a.content,I=/@([\w-]+)/g,z=[];let F=0,H=I.exec(X);for(;H;){const[y,L=""]=H,E=H.index;E>F&&z.push(X.slice(F,E));const q=L.replace(/_/g," ").toLowerCase(),k=h.get(q);if(k){const D=!!(P&&!P.memberIds.has(k.id)),$=D?R("chat.mentionNonMember","Not a member of {{roomName}}",{roomName:P?.roomName}):void 0;z.push(t.jsxs("span",{className:`chat-mention-chip${D?" chat-mention-chip--non-member":""}`,title:$,"aria-label":$,children:["@",k.name.replace(/\s+/g,"_")]},`${k.id}-${E}`))}else z.push(y);F=E+y.length,H=I.exec(X)}return F<X.length&&z.push(X.slice(F)),z.length===0?X:z},[O,a.content,h,P]),le=s.useMemo(()=>{const X=a.attachments;if(!X||X.length===0)return null;const I=a.roomId?`/api/chat/rooms/${encodeURIComponent(a.roomId)}/attachments/`:i?`/api/chat/sessions/${encodeURIComponent(i)}/attachments/`:null;return I?t.jsx("div",{className:"chat-message-attachments",children:X.map(z=>{const F=z.mimeType.startsWith("image/"),H=z.id||z.filename,y=`${I}${encodeURIComponent(z.filename)}`;return F?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:y,alt:z.originalName})},H):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(Ma,{size:14}),t.jsx("span",{children:z.originalName})]},H)})}):null},[a.attachments,a.roomId,i]),A=s.useMemo(()=>O?v?t.jsxs("div",{className:"chat-message-content chat-message-content--failure",children:[t.jsxs("div",{className:"chat-message-failure-summary-row",children:[t.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),t.jsx("span",{className:"chat-message-failure-label",children:R("chat.responseFailed","Response failed")})]}),t.jsx("div",{className:"chat-message-failure-summary",children:v.summary}),(v.errorClass||v.code)&&t.jsxs("div",{className:"chat-message-failure-badges",children:[v.errorClass&&t.jsx("span",{className:"chat-message-failure-badge",children:v.errorClass}),v.code&&t.jsx("span",{className:"chat-message-failure-badge",children:v.code})]}),(v.detail||v.reference)&&t.jsxs("details",{className:"chat-message-failure-details",children:[t.jsxs("summary",{children:[t.jsx(Hr,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:R("chat.failureDetails","Failure details")})]}),v.detail&&t.jsx("pre",{className:"chat-message-failure-detail",children:yn(v.detail)}),Ai(v.reference,R)]})]}):o?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:a.content}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(Na,{remarkPlugins:[Aa],components:Pa,children:a.content})}):null,[v,o,O,a.content]);return t.jsxs("div",{className:`chat-message chat-message--${a.role}${v?" chat-message--failure":""}`,"data-testid":`chat-message-${a.id}`,"data-message-id":a.id,children:[Y&&t.jsxs("div",{className:"chat-message-avatar",children:[p?t.jsx(It,{provider:p,size:"sm"}):t.jsx(Lt,{size:14}),t.jsx("span",{children:l}),u&&b&&t.jsx("span",{className:"chat-model-tag",children:b})]}),O?A:t.jsx("div",{className:"chat-message-content",children:W}),O&&!v&&(w||M)&&t.jsxs("div",{className:"chat-message-actions",children:[w,M&&t.jsx("button",{type:"button",className:"btn-icon chat-message-scroll-to-top-action","aria-label":R("chat.scrollMessageToTop","Scroll message to top"),"data-testid":`chat-message-scroll-to-top-${a.id}`,onClick:()=>M(a.id),children:t.jsx(Xr,{size:14})})]}),Fa(a.toolCalls,R,{isAwaitingAnswer:S,submittedAnswer:T,onQuestionSubmit:j}),a.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:R("chat.thinking","Thinking")}),t.jsx("pre",{className:"chat-message-thinking-content",children:yn(a.thinkingOutput)})]}),le,t.jsx("div",{className:"chat-message-time",children:$a(a.createdAt,R)})]})});function Ui({projectId:n,addToast:a,floating:o=!1,compactLayout:l=!1,onPopOut:c,onMaximize:u,onMinimize:b,onClose:p}){const{t:i}=Je("app");s.useEffect(()=>(_t({view:"ChatView",trigger:es?"route-active":"remount",projectId:n,replayAttempted:!1}),es=!1,()=>{es=!0,_t({view:"ChatView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{activeSession:h,sessionsLoading:P,messages:w,messagesLoading:M,isStreaming:S,streamingText:T,streamingThinking:j,streamingToolCalls:R,selectSession:O,createSession:v,archiveSession:Y,renameSession:W,deleteSession:le,sendMessage:A,stopStreaming:X,pendingMessages:I,clearPendingMessage:z,loadMoreMessages:F,hasMoreMessages:H,searchQuery:y,setSearchQuery:L,filteredSessions:E,agentsMap:q}=ai(n,a),[k,D]=s.useState(!1),$=!0,[f,_]=s.useState(()=>{try{if(localStorage.getItem(ts)==="rooms"&&$)return"rooms"}catch{}return"direct"}),m=oi(n,a),{isUnread:oe,markRead:U}=ci(n),[K,he]=s.useState(()=>{const e=xa(f,f==="rooms"?m.activeRoom?.id:h?.id);return ya(e)}),[ge,se]=s.useState(null),[ve,xe]=s.useState(null),[Ke,Ge]=s.useState(""),[ye,$e]=s.useState(null),[Ot,fe]=s.useState(null),[Ze,de]=s.useState(!0),[Ee,Ct]=s.useState(ji),[wn,st]=s.useState(!1),{agentsMap:zt}=cs(n),De=s.useMemo(()=>q.size>0?q:zt,[zt,q]),{models:Bt,defaultProvider:St,defaultModelId:kt}=Ra(),at=s.useMemo(()=>({provider:St,modelId:kt}),[kt,St]),{skills:rt,loading:Cn}=yi(n),[g,x]=s.useState(!1),[N,G]=s.useState(""),[re,V]=s.useState(0),[J,Q]=s.useState(""),[Z,ie]=s.useState(!1),[ne,ee]=s.useState(0),[me,pe]=s.useState(-1),[ke,Ia]=s.useState(!1),[Ae,Sn]=s.useState([]),[ms,it]=s.useState(!1),[hs,Ht]=s.useState(!1),[ot,fs]=s.useState({}),[Ut,Ve]=s.useState(!1),[Kt,Mt]=s.useState(!1),{pushNav:gs}=jr(),[,Gt]=s.useState(!1),[La,_a]=s.useState({top:0,left:0}),ue=bi({projectId:n}),kn=s.useCallback(e=>{if(!e||!ue.mentionActive)return;const r=e.getBoundingClientRect();_a({top:r.top-260,left:r.left+8})},[ue.mentionActive]),ps=s.useRef(null),bs=s.useRef(null),vs=s.useRef(null),xs=s.useRef(null),Me=s.useRef(!1),Vt=s.useRef(null),ys=s.useRef(null),We=s.useRef(null),Wt=s.useRef(0),Mn=s.useRef(null),Rt=s.useRef(null),Pe=s.useRef(null),Re=s.useRef(null),Rn=s.useRef(null),Xt=s.useRef(!1),Ie=s.useRef(null),Le=s.useRef(null),Se=s.useRef(null),Qt=s.useRef(null),ws=s.useRef([]),ct=s.useRef(0),Nt=s.useRef(new Map),Nn=s.useRef(!1),qt=s.useRef(!1),_e=s.useRef(null),An=s.useRef(!1),Yt=Tr(),et=Yt==="mobile",jn=Yt==="tablet",Cs=s.useRef(null),[Oa,Ss]=s.useState(!1);s.useLayoutEffect(()=>{if(!o){Ss(!1);return}const e=Cs.current;if(!e||typeof ResizeObserver>"u")return;const r=()=>{Ss(e.getBoundingClientRect().width<=768)};r();const d=new ResizeObserver(r);return d.observe(e),()=>d.disconnect()},[o]);const ae=et||Oa||l;s.useEffect(()=>{h?.id&&U("direct",h.id,h.lastMessageAt??h.updatedAt)},[h?.id,h?.lastMessageAt,h?.updatedAt,U]),s.useEffect(()=>{m.activeRoom?.id&&U("room",m.activeRoom.id,m.activeRoom.updatedAt)},[m.activeRoom?.id,m.activeRoom?.updatedAt,U]),s.useEffect(()=>{if(!h?.id||w.length===0)return;const e=w[w.length-1];U("direct",h.id,e?.createdAt??h.lastMessageAt??h.updatedAt)},[h?.id,h?.lastMessageAt,h?.updatedAt,U,w]),s.useEffect(()=>{if(!m.activeRoom?.id||m.messages.length===0)return;const e=m.messages[m.messages.length-1];U("room",m.activeRoom.id,e?.createdAt??m.activeRoom.updatedAt)},[U,m.activeRoom?.id,m.activeRoom?.updatedAt,m.messages]),s.useEffect(()=>{try{const e=localStorage.getItem(va);if(!e)return;const r=Number.parseInt(e,10);if(Number.isNaN(r))return;const d=Math.max(mn,Math.min(hn,r));Ct(d)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(ts);if(e==="direct"){_("direct");return}e==="rooms"&&$&&_("rooms")}catch{}},[$]),s.useEffect(()=>{try{localStorage.setItem(ts,f)}catch{}},[$,f]);const Ne=xa(f,f==="rooms"?m.activeRoom?.id:h?.id),Tn=s.useRef(Ne);s.useEffect(()=>{Ne!==Tn.current&&(Tn.current=Ne,he(ya(Ne)))},[Ne]),s.useEffect(()=>{if(!(!Ne||Tn.current!==Ne))try{if(K){localStorage.setItem(Ne,K);return}localStorage.removeItem(Ne)}catch{}},[Ne,K]);const be=f==="rooms"&&!!m.activeRoom,{keyboardOverlap:ks,keyboardOpen:Jt}=Er({enabled:(ae||jn)&&(!!h||be),allowNonMobileViewport:jn}),At=jn&&Jt,je=s.useMemo(()=>{const e=N.trim().toLowerCase();return(e?rt.filter(d=>d.name.toLowerCase().includes(e)):rt).slice(0,10)},[rt,N]),lt=s.useMemo(()=>Array.from(De.values()),[De]),Oe=s.useMemo(()=>f!=="rooms"||!m.activeRoom?null:{roomId:m.activeRoom.id,roomName:m.activeRoom.name,memberIds:new Set(m.activeRoomMembers.map(e=>e.agentId))},[$,f,m.activeRoom,m.activeRoomMembers]),tt=s.useMemo(()=>{const e=lt.filter(C=>Da(C.name,J));if(!Oe)return e;const r=e.filter(C=>Oe.memberIds.has(C.id));if(J.trim().length===0)return r;const d=e.filter(C=>!Oe.memberIds.has(C.id));return[...r,...d]},[lt,J,Oe]),En=s.useMemo(()=>{const e=new Map;for(const r of lt)e.set(r.name.toLowerCase(),r);return e},[lt]),za=s.useMemo(()=>je.map(e=>e.id).join("\0"),[je]);s.useEffect(()=>{V(0)},[za]),s.useEffect(()=>{ee(0)},[J,Z]),s.useEffect(()=>()=>{Pe.current!==null&&window.clearTimeout(Pe.current)},[]),s.useEffect(()=>{const e=bs.current;if(!e||!H||M)return;const r=new IntersectionObserver(d=>{d[0].isIntersecting&&F()},{threshold:.1});return r.observe(e),()=>r.disconnect()},[H,M,F]);const ut=s.useCallback(()=>be?m.activeRoom?.id??null:h?.id??null,[be,m.activeRoom?.id,h?.id]),Ms=s.useCallback((e,r)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(r)}"]`):e.querySelector(`.chat-message[data-message-id="${r.replace(/"/g,'\\"')}"]`),[]),Zt=s.useCallback(()=>{const e=Re.current,r=ut();if(!e||!r)return;const d=e.scrollTop,C=e.querySelectorAll(".chat-message[data-message-id]"),B=Array.from(C).find(we=>we.offsetTop+we.offsetHeight>=d)??C[0]??null,te=B?.getAttribute("data-message-id")??null,Ce=B?B.offsetTop-d:0;Rt.current={threadId:r,scrollTop:d,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:te,anchorOffset:Ce,wasPinnedBefore:!Me.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[ut]),Rs=s.useCallback(()=>{const e=Re.current;if(!e)return;const d=e.scrollTop+e.clientHeight>=e.scrollHeight-50;Ht(!d),Me.current=!d,Zt()},[Zt]),ze=s.useCallback((e,r)=>{if(!e.isConnected||!r?.force&&Me.current)return;let d=0,C=0,B=-1;const te=6,Ce=()=>{if(e.isConnected&&!(!r?.force&&Me.current)){if(e.scrollTop=e.scrollHeight,e.scrollHeight===B?C+=1:(C=0,B=e.scrollHeight),d+=1,d>=te||C>=2){Ht(!1),Me.current=!1;return}window.requestAnimationFrame(Ce)}};Ce()},[]),jt=be?m.messages:w;s.useLayoutEffect(()=>{const e=Re.current,r=ut(),d=Rt.current;if(!e||!r||!d||d.threadId!==r||d.wasPinnedBefore)return;const C=(typeof performance<"u"?performance.now():Date.now())-d.capturedAtMs,B=e.scrollHeight>e.clientHeight,te=C>3e3,Ce=d.scrollTop<=0&&d.anchorOffset<=0&&B;if(!Me.current||te||Ce){Rt.current=null;return}let we=d.scrollTop;if(d.anchorMessageId){const He=Ms(e,d.anchorMessageId);He?we=He.offsetTop-d.anchorOffset:we=d.scrollTop+(e.scrollHeight-d.scrollHeight)}else we=d.scrollTop+(e.scrollHeight-d.scrollHeight);e.scrollTop=Math.max(0,we),Me.current=!0,Ht(!0),Rt.current=null},[jt,ut,Ms]);const Dn=s.useCallback(e=>{},[jt.length,be]),Fe=s.useCallback(e=>{Dn(e);const r=Re.current;r&&(Rt.current=null,Me.current=!1,ze(r))},[ze,Dn]);s.useLayoutEffect(()=>{We.current!==null&&(window.clearTimeout(We.current),We.current=null);const e=be?m.activeRoom?.id??null:h?.id??null;if(!e){Vt.current=null;return}const r={threadId:e,loaded:be?!m.messagesLoading:!M,hasMessages:be?m.messages.length>0:w.length>0},d=Vt.current,C=d?.threadId!==e,B=d?.threadId===e&&!d.loaded&&r.loaded,te=d?.threadId===e&&!d.hasMessages&&r.hasMessages;if(!(d===null||C||B||te))return;const we=Re.current;if(we)return Dn(C?"thread-change":B?"finished-loading":te?"first-messages":"mount"),ze(we,{force:!0}),be||(We.current=window.setTimeout(()=>{if(We.current=null,Me.current)return;const He=Re.current;He&&ze(He)},250)),Vt.current=r,()=>{We.current!==null&&(window.clearTimeout(We.current),We.current=null)}},[be,m.activeRoom?.id,m.messages.length,m.messagesLoading,h?.id,w.length,M,ze]),s.useEffect(()=>{!S||Me.current||Fe("streaming")},[S,T,j,Fe]),s.useEffect(()=>{const e=ut();if(!e){Wt.current=0,Mn.current=null;return}if(Mn.current!==e){Mn.current=e,Wt.current=jt.length;return}const r=Wt.current,d=jt.length,C=d>r,B=!Me.current;Wt.current=d,C&&B&&Fe("new-message")},[jt,ut,Fe]),s.useEffect(()=>{ks<=0||!Re.current||Fe("keyboard")},[ks,Fe]),Dr(et&&Jt),s.useLayoutEffect(()=>{if(!et||!h&&!be||typeof window>"u")return;const e=Rn.current,r=window.visualViewport;if(!e||!r)return;const d=B=>{if(!(B instanceof HTMLElement))return!1;if(B.tagName==="TEXTAREA")return!0;if(B.tagName!=="INPUT")return!1;const te=B.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(te)},C=()=>{if(Xt.current){e.classList.remove("chat-thread--keyboard-active"),e.style.transform="",e.style.willChange="";return}const B=Math.max(0,window.innerHeight-r.offsetTop-r.height),te=r.offsetTop||0;e.style.setProperty("--vv-height",`${r.height}px`),e.style.setProperty("--vv-offset-top",`${te}px`),e.style.setProperty("--keyboard-overlap",`${B}px`);const Ce=(B>0||te>0)&&d(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",Ce),Ce&&te>0?(e.style.transform=`translateY(${te}px)`,e.style.willChange="transform"):(e.style.transform="",e.style.willChange="")};return C(),r.addEventListener("resize",C),r.addEventListener("scroll",C),document.addEventListener("focusin",C),document.addEventListener("focusout",C),window.addEventListener("pageshow",C),document.addEventListener("visibilitychange",C),()=>{r.removeEventListener("resize",C),r.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.transform="",e.style.willChange=""}},[h,et,be]),s.useEffect(()=>{const e=()=>se(null);if(ge)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[ge]),s.useEffect(()=>{if(!et||!Jt)return;const e=r=>{r.target?.closest(".chat-messages")||r.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[et,Jt]),s.useEffect(()=>{const e=ys.current;if(ys.current=f,f==="rooms"&&!m.activeRoom){Vt.current=null;return}if(!(f==="direct"&&(e===null||e==="rooms"))&&!(f==="rooms"&&(e===null||e==="direct")))return;const C=Re.current;C&&(ze(C,{force:!0}),Me.current=!1,Ht(!1))},[f,m.activeRoom,ze]),s.useEffect(()=>{if(!h&&!be||be&&!ae)return;const e=()=>{const d=!Me.current;Zt(),d&&ae&&Re.current&&Fe("visibility-restore")},r=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",r),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",r),window.removeEventListener("pageshow",e)}},[ae,et,h,be,Zt,Fe]),s.useEffect(()=>{if(be||typeof ResizeObserver>"u")return;const e=Re.current;if(!e)return;const r=new ResizeObserver(()=>{Me.current||ze(e)});return r.observe(e),()=>{r.disconnect()}},[be,ze,h?.id,f]),s.useEffect(()=>{ws.current=Ae},[Ae]),s.useEffect(()=>()=>{for(const e of ws.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of Nt.current.values())window.clearTimeout(e);Nt.current.clear()},[]);const dt=s.useCallback(e=>{if(!e||e.length===0)return;const r=[];for(const d of Array.from(e)){if(!Ei.includes(d.type))continue;const C=d.type.startsWith("image/");r.push({file:d,previewUrl:C?URL.createObjectURL(d):""})}r.length>0&&Sn(d=>[...d,...r])},[]),Ns=s.useCallback(e=>{Sn(r=>{const d=r[e];return d?.previewUrl&&URL.revokeObjectURL(d.previewUrl),r.filter((C,B)=>B!==e)})},[]),As=s.useCallback(e=>{const r=e.clipboardData?.files;if(!r||r.length===0)return;const d=Array.from(r).filter(C=>C.type.startsWith("image/"));d.length!==0&&dt(d)},[dt]),Ba=s.useCallback(async e=>{try{await v(e),D(!1),ae&&de(!1)}catch{a(i("chat.failedToCreateSession","Failed to create chat session"),"error")}},[v,a,ae]),Te=s.useCallback(e=>{const r=e??Se.current;if(!r)return;const d=Yt==="tablet"?Ci:ds;r.style.height="auto",r.style.height=`${ki(r.scrollHeight,d)}px`,r.style.overflowY=Si(r.scrollHeight,d)},[Yt]),js=s.useCallback(e=>{Se.current=e,e&&Te(e)},[Te]);s.useLayoutEffect(()=>{Te()},[f,K,h?.id,m.activeRoom?.id,Te]);const mt=s.useCallback(()=>{if(he(""),Ne)try{localStorage.removeItem(Ne)}catch{}x(!1),G(""),ie(!1),Q(""),pe(-1),Sn(e=>{for(const r of e)r.previewUrl&&URL.revokeObjectURL(r.previewUrl);return[]})},[Ne]),ht=s.useCallback(()=>{qt.current=!0,_e.current!=null&&clearTimeout(_e.current),_e.current=window.setTimeout(()=>{qt.current=!1,_e.current=null},700)},[]),ft=s.useCallback(()=>An.current?!1:(An.current=!0,window.setTimeout(()=>{An.current=!1},0),!0),[]),$n=s.useCallback(()=>qt.current?(qt.current=!1,_e.current!=null&&(clearTimeout(_e.current),_e.current=null),!0):!1,[]);s.useEffect(()=>()=>{_e.current!=null&&clearTimeout(_e.current)},[]);const Tt=s.useCallback(()=>{const e=K.trim(),r=Ae.map(d=>d.file);if(!(!e&&r.length===0||!h)){if(e==="/clear"||e==="/new"){mt(),z(),X(),v({agentId:h.agentId,modelProvider:h.modelProvider??void 0,modelId:h.modelId??void 0}).catch(()=>{a(i("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}mt(),A(e,r)}},[K,Ae,h,mt,X,z,v,a,A]),Et=s.useCallback(async()=>{const e=K.trim(),r=Ae.map(d=>d.file);if(!(!e&&r.length===0)){if(f==="rooms"){if(!m.activeRoom)return;if(e==="/clear"||e==="/new"){mt();try{await m.clearRoom(m.activeRoom.id)}catch{a(i("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(Nn.current)return;Nn.current=!0;const d=K;mt();try{await m.sendRoomMessage(e,{files:r})}catch(C){if(C instanceof Ta){const te=C.message.trim()?C.message:i("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");a(i("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:te}),"error");return}he(d);const B=C instanceof Error&&C.message.trim()?C.message:i("chat.failedToSendRoomMessage","Failed to send room message");a(B,"error")}finally{Nn.current=!1}return}Tt()}},[K,Ae,$,f,m,m.clearRoom,mt,a,Tt]),en=s.useCallback(async e=>{if(f==="rooms"){if(!m.activeRoom)return;try{await m.sendRoomMessage(e)}catch(r){const d=r instanceof Error&&r.message.trim()?r.message:i("chat.failedToSendRoomMessage","Failed to send room message");a(d,"error")}return}h&&A(e)},[h,a,$,f,m,A,i]),Fn=s.useCallback(e=>{he(r=>{const d=wa(r);if(!d)return r;const C=`/skill:${e.name} `,B=r.slice(0,d.start)+C+r.slice(d.end);return window.requestAnimationFrame(()=>{Se.current&&(Te(Se.current),Se.current.focus())}),B}),x(!1),G(""),V(0)},[Te]),tn=s.useCallback(e=>{const r=Se.current;if(!r||me<0)return;const d=r.selectionStart??ct.current,C=r.selectionEnd??d,B=Math.max(d,C),te=Math.min(me,B),we=`${`@${e.name.replace(/\s+/g,"_")}`} `,He=K.slice(0,te)+we+K.slice(B),gt=te+we.length;he(He),ie(!1),Q(""),ee(0),pe(-1),window.requestAnimationFrame(()=>{Se.current&&(Te(Se.current),Se.current.focus(),Se.current.setSelectionRange(gt,gt))})},[me,K,Te]),Dt=s.useCallback((e,r)=>{const C=Se.current?.selectionStart??ct.current,B=K.lastIndexOf("#",C),te=B>=0?B+r.length:e.length;he(e),ue.dismissMention(),Gt(!1),window.requestAnimationFrame(()=>{Se.current&&(Te(Se.current),Se.current.focus(),Se.current.setSelectionRange(te,te))})},[ue,K,Te]),Ts=s.useCallback(e=>{if(ct.current=e.currentTarget.selectionStart??ct.current,ue.mentionActive&&ue.combinedItems.length>0){if(ue.handleKeyDown(e,K),e.key==="Enter"||e.key==="Tab"){const r=ue.combinedItems[ue.selectedIndex];r?.kind==="task"?Dt(ue.selectTask(r.task,K),`#${r.task.id}`):r?.kind==="file"&&Dt(ue.selectFile(r.file,K),`#${r.file.path}`)}return}if(Z&&e.key==="ArrowDown"){e.preventDefault(),tt.length>0&&ee(r=>(r+1)%tt.length);return}if(Z&&e.key==="ArrowUp"){e.preventDefault(),tt.length>0&&ee(r=>r===0?tt.length-1:r-1);return}if(Z&&e.key==="Enter"){e.preventDefault();const r=tt[ne]??tt[0];r&&tn(r);return}if(Z&&e.key==="Escape"){e.preventDefault(),ie(!1),Q(""),pe(-1);return}if(g&&e.key==="ArrowDown"){e.preventDefault(),je.length>0&&V(r=>(r+1)%je.length);return}if(g&&e.key==="ArrowUp"){e.preventDefault(),je.length>0&&V(r=>r===0?je.length-1:r-1);return}if(g&&(e.key==="Enter"||e.key==="Tab")&&je.length>0){e.preventDefault();const r=je[re]??je[0];r&&Fn(r);return}if(g&&e.key==="Escape"){e.preventDefault(),x(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Et())},[Z,tt,ne,tn,g,je,re,Fn,Et,ue,Dt,K]),nn=s.useCallback((e,r)=>{const d=Di(e,r);if(d){ie(!0),Q(d.filter),pe(d.start);return}ie(!1),Q(""),pe(-1)},[]),Es=s.useCallback(e=>{const r=e.target,d=r.value,C=r.selectionStart??d.length;Te(r),ct.current=C,he(d);const B=wa(d);B?(x(!0),G(B.filter)):(x(!1),G("")),nn(d,C),ue.detectMention(d,C),Gt(ue.mentionActive),ue.mentionActive&&kn(r)},[nn,Te]),sn=s.useCallback(e=>{const r=e.currentTarget,d=r.selectionStart??r.value.length;ct.current=d,nn(r.value,d),ue.detectMention(r.value,d),Gt(ue.mentionActive),ue.mentionActive&&kn(r)},[nn,ue,kn]),Ds=s.useCallback(e=>{e.key!=="Escape"&&sn(e)},[sn]),$s=s.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(Xt.current=!0,Ie.current!==null&&window.clearTimeout(Ie.current),Ie.current=window.setTimeout(()=>{Xt.current=!1,Ie.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),Le.current!==null&&window.clearTimeout(Le.current),Le.current=window.setTimeout(()=>{Le.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Pe.current!==null&&window.clearTimeout(Pe.current),Pe.current=window.setTimeout(()=>{x(!1),ie(!1),Q(""),pe(-1),Gt(!1),ue.dismissMention(),Pe.current=null},120)},[ue]),Fs=s.useCallback(()=>{Xt.current=!1,Ie.current!==null&&(window.clearTimeout(Ie.current),Ie.current=null),Pe.current!==null&&(window.clearTimeout(Pe.current),Pe.current=null),Le.current!==null&&(window.clearTimeout(Le.current),Le.current=null)},[]);s.useEffect(()=>()=>{Ie.current!==null&&window.clearTimeout(Ie.current),Le.current!==null&&window.clearTimeout(Le.current)},[]);const Ha=s.useCallback(async e=>{se(null);try{await Y(e),a(i("chat.conversationArchived","Conversation archived"),"success")}catch{a(i("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[Y,a]),Ps=s.useCallback(e=>{const r=E.find(d=>d.id===e)??(h?.id===e?h:null);se(null),Ve(!1),Ge(r?.title??""),xe({sessionId:e,title:r?.title??""})},[h,E]),Is=s.useCallback(async()=>{if(ve)try{await W(ve.sessionId,Ke),xe(null),Ge(""),a(i("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[a,ve,W,Ke,i]),Ua=s.useCallback(async e=>{$e(null),se(null);try{await le(e),a(i("chat.conversationDeleted","Conversation deleted"),"success")}catch{a(i("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[le,a]),$t=s.useCallback(e=>{try{localStorage.setItem(va,String(e))}catch{}},[]),Ka=s.useCallback(e=>{if(ae||At)return;e.preventDefault(),e.stopPropagation();const r=e.currentTarget;typeof r.setPointerCapture=="function"&&r.setPointerCapture(e.pointerId);const d=e.clientX,C=Ee;let B=C;document.body.style.userSelect="none";const te=we=>{const He=we.clientX-d,gt=Math.max(mn,Math.min(hn,C+He));B=gt,Ct(gt),$t(gt)},Ce=we=>{typeof r.releasePointerCapture=="function"&&r.releasePointerCapture(we.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",te),document.removeEventListener("pointerup",Ce),$t(B)};document.addEventListener("pointermove",te),document.addEventListener("pointerup",Ce)},[ae,$t,Ee,At]),Ga=s.useCallback(e=>{if(ae||At||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const r=e.shiftKey?50:10,d=e.key==="ArrowLeft"?-r:r,C=Math.max(mn,Math.min(hn,Ee+d));Ct(C),$t(C)},[ae,$t,Ee,At]),Ls=s.useCallback(e=>{const r=E.find(d=>d.id===e);U("direct",e,r?.lastMessageAt??r?.updatedAt),O(e),Ve(!1),ae&&de(!1)},[E,ae,U,O]),Pn=s.useCallback(()=>{O(""),de(!0),Ve(!1)},[O]),In=s.useCallback(()=>{m.selectRoom(null),de(!0),Ve(!1)},[m]),Va=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(gn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:i("chat.startNewConversation","Start a new conversation")}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>D(!0),children:[t.jsx(pt,{size:16}),i("chat.newChat","New Chat")]})]}),Be=Ca(h,h?.agentId?De.get(h.agentId)??null:null,at),Ln=s.useMemo(()=>{if(!Be?.provider||!Be.modelId)return null;const e=Bt.find(r=>r.provider===Be.provider&&r.id===Be.modelId);return e?.contextWindow?e.contextWindow:null},[Be?.modelId,Be?.provider,Bt]),Wa=s.useMemo(()=>wi(w,S?T:void 0),[S,w,T]),Xe=ba(Be?.provider,Be?.modelId),Qe=Be?.provider??null,an=!!(h||S||w.length>0),rn=f==="rooms"?be:!!h,_s=s.useRef(rn);s.useEffect(()=>{const e=_s.current;_s.current=rn,ae&&(e||!rn||gs({type:"view",revert:f==="rooms"?In:Pn}))},[f,Pn,In,rn,ae,gs]);const _n=h?.agentId===yt?Xe??"Fusion":h?.title||De.get(h?.agentId??"")?.name||h?.agentId||"Chat",Os=!!(Xe&&Xe!==_n),Xa=!ae&&an&&Ln!==null,zs=ga(Wa),on=Ln!==null?ga(Ln):null,On=on?i("chat.contextWindowAria","Estimated {{used}} of {{total}} context tokens",{used:zs,total:on}):null,Qa=ae&&f==="direct"&&!!h,zn=De.get(h?.agentId??"")?.name||(h?.agentId===yt?Xe??"Fusion":h?.agentId?.slice(0,30)??"Fusion"),Bn=!1,Hn=h?.agentId===yt,qa=e=>e.length>50?`${e.slice(0,50)}…`:e,Ya=s.useCallback(()=>{Ia(e=>!e)},[]);s.useEffect(()=>{if(!Ut)return;const e=r=>{vs.current?.contains(r.target)||Ve(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[Ut]),s.useEffect(()=>{if(!Kt)return;const e=d=>{xs.current?.contains(d.target)||Mt(!1)},r=d=>{d.key==="Escape"&&Mt(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",r),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",r)}},[Kt]),s.useEffect(()=>{(!ae||f!=="direct"||Ze)&&Ve(!1)},[ae,f,Ze]),s.useEffect(()=>{Mt(!1)},[m.activeRoom?.id]);const Un=s.useCallback((e,r)=>{const d=Nt.current.get(e);d&&window.clearTimeout(d),fs(B=>({...B,[e]:r}));const C=window.setTimeout(()=>{fs(B=>{const{[e]:te,...Ce}=B;return Ce}),Nt.current.delete(e)},2e3);Nt.current.set(e,C)},[]),Bs=s.useCallback(async(e,r)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(r),Un(e,"success")}catch{Un(e,"error")}},[Un]),Ja=s.useCallback((e,r=!1)=>r?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:e}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(Na,{remarkPlugins:[Aa],components:Pa,children:e})}),[]),Kn=h?.agentId===yt,Gn=s.useCallback((e,r,d)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${ot[e]==="success"?" chat-message-copy-action--success":""}${ot[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":d??`chat-copy-response-${e}`,"aria-label":ot[e]==="success"?i("chat.responseCopied","Response copied"):ot[e]==="error"?i("chat.copyFailed","Copy failed"):i("chat.copyResponse","Copy response"),onClick:()=>{Bs(e,r)},children:ot[e]==="success"?t.jsx($r,{size:14}):t.jsx(Fr,{size:14})}),[ot,Bs]),Vn=s.useCallback(e=>{const r=Re.current;if(!r)return;const d=`[data-testid="chat-message-${e}"]`,C=r.querySelector(d);if(!C)return;const B=C.getBoundingClientRect().top-r.getBoundingClientRect().top+r.scrollTop,te=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;r.scrollTo({top:B,behavior:te?"auto":"smooth"})},[]),Hs=h?.cliExecutorAdapterId??null,Za=!!Hs,er=Hs==="generic"?"generic":"hybrid",tr=h?.cliSessionFile||h?.id||"",Us=()=>t.jsxs("div",{className:"chat-messages",ref:Re,onScroll:Rs,children:[t.jsx("div",{ref:bs,className:"chat-load-more-sentinel",children:H&&M&&t.jsx("div",{className:"chat-loading-older",children:i("chat.loadingOlderMessages","Loading older messages…")})}),S?t.jsxs(t.Fragment,{children:[w.map((e,r)=>t.jsx(ns,{message:e,forcePlain:ke,agentName:zn,hideAssistantIdentity:Hn,showAssistantModelTag:Bn,activeModelTag:Xe,activeModelProvider:Qe,activeSessionId:h?.id??null,mentionAgentsByName:En,roomContext:null,copyAction:Kn&&e.role==="assistant"?Gn(e.id,e.content):void 0,onScrollToTop:Vn,isAwaitingQuestionAnswer:e.role==="assistant"&&r===w.length-1&&!S,submittedQuestionAnswer:Sa(w,r),onQuestionSubmit:en},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!Hn&&t.jsxs("div",{className:"chat-message-avatar",children:[Qe?t.jsx(It,{provider:Qe,size:"sm"}):t.jsx(Lt,{size:14}),t.jsx("span",{children:zn}),Bn]}),T?Ja(T,ke):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:j?i("chat.thinkingStatus","Thinking…"):i("chat.workingStatus","Working…")}),Kn&&T&&Gn("__streaming__",T,"chat-copy-response-streaming"),Fa(R,i,{isAwaitingAnswer:!0,onQuestionSubmit:en}),j&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:i("chat.thinking","Thinking")}),t.jsx("pre",{className:"chat-message-thinking-content",children:yn(j)})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):M?t.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):w.length===0&&!h?Va():w.length===0&&h?t.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):t.jsx(t.Fragment,{children:w.map((e,r)=>t.jsx(ns,{message:e,forcePlain:ke,agentName:zn,hideAssistantIdentity:Hn,showAssistantModelTag:Bn,activeModelTag:Xe,activeModelProvider:Qe,activeSessionId:h?.id??null,mentionAgentsByName:En,roomContext:null,copyAction:Kn&&e.role==="assistant"?Gn(e.id,e.content):void 0,onScrollToTop:Vn,isAwaitingQuestionAnswer:e.role==="assistant"&&r===w.length-1&&!S,submittedQuestionAnswer:Sa(w,r),onQuestionSubmit:en},e.id))}),t.jsx("div",{ref:ps})]}),Ks=()=>t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Qt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{dt(e.target.files),e.target.value=""}}),g&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":i("chat.skillSuggestions","Skill suggestions"),children:Cn?t.jsx("div",{className:"chat-skill-menu-empty",children:i("chat.loadingSkills","Loading skills…")}):je.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:N?i("chat.noSkillsFound","No skills found"):i("chat.noSkillsAvailable","No skills available")}):je.map((e,r)=>t.jsxs("button",{type:"button",role:"option","aria-selected":r===re,className:`chat-skill-menu-item${r===re?" chat-skill-menu-item--highlighted":""}`,onMouseDown:d=>d.preventDefault(),onMouseEnter:()=>V(r),onClick:()=>Fn(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))}),Ae.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Ae.map((e,r)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${r}`,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:()=>Ns(r),"data-testid":`chat-attachment-remove-${r}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${r}`))}),I.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-pending-stack","data-testid":"chat-pending-stack",children:I.map((e,r)=>t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:i("chat.queuedMessage","Queued: {{preview}}",{preview:qa(e)})}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":i("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":`chat-pending-dismiss-${r}`,onClick:()=>z(r),children:"×"})]},`${r}-${e}`))}),t.jsx("div",{className:"chat-pending-divider","aria-hidden":"true"})]}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>Qt.current?.click(),children:t.jsx(Js,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${ms?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),it(!0)},onDragLeave:()=>it(!1),onDrop:e=>{e.preventDefault(),it(!1),dt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:js,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:K,onChange:Es,onKeyDown:Ts,onKeyUp:Ds,onClick:sn,onBlur:$s,onFocus:Fs,onPaste:As,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Zs()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(da,{agents:lt,filter:J,highlightedIndex:ne,visible:Z,onSelect:tn,position:"below",roomMemberIds:Oe?.memberIds,roomName:Oe?.roomName}),t.jsx(ui,{visible:ue.mentionActive&&!Z,position:La,tasks:ue.tasks,files:ue.files,selectedIndex:ue.selectedIndex,onSelectTask:e=>{Dt(ue.selectTask(e,K),`#${e.id}`)},onSelectFile:e=>{Dt(ue.selectFile(e,K),`#${e.path}`)},loading:ue.loading})]}),S?t.jsx("button",{className:"chat-input-stop",onPointerDown:e=>{if(e.pointerType&&e.pointerType!=="mouse"){if(e.preventDefault(),!ft())return;ht(),X()}},onTouchStart:e=>{e.preventDefault(),ft()&&(ht(),X())},onMouseDown:e=>{e.preventDefault()},onClick:()=>{$n()||X()},"aria-label":i("chat.stopGeneration","Stop generation"),"data-testid":"chat-stop-btn",children:t.jsx(Ur,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{if(e.pointerType&&e.pointerType!=="mouse"){if(e.preventDefault(),!ft())return;ht(),Tt()}},onTouchStart:e=>{e.preventDefault(),ft()&&(ht(),Tt())},onMouseDown:e=>{e.preventDefault()},onClick:()=>{$n()||Tt()},disabled:!K.trim()&&Ae.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(ea,{size:16})})]})]}),nr=ae?void 0:{width:`${Ee}px`},sr=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${f==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":f==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>_("direct"),children:[t.jsx(gn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.scopeDirect","Direct")})]}),t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${f==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":f==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>_("rooms"),children:[t.jsx(ja,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.scopeRooms","Rooms")})]})]});return t.jsxs("div",{ref:Cs,className:`chat-view${o?" chat-view--floating":""}${ae?" chat-view--narrow":""}`,children:[t.jsx(Pr,{icon:gn,title:i("chat.title","Chat"),actions:t.jsxs(t.Fragment,{children:[sr,ae?null:t.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:()=>D(!0),"data-testid":"chat-new-btn",children:[t.jsx(pt,{size:14}),i("chat.newChat","New Chat")]}),!o&&c?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:c,"aria-label":i("chat.popOut","Pop out chat"),title:i("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:t.jsx(Qs,{size:16})}):null,o&&u?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:u,"aria-label":i("chat.maximizeToChatView","Open in Chat view"),title:i("chat.maximizeToChatView","Open in Chat view"),"data-testid":"chat-modal-maximize",children:t.jsx(Qs,{size:16})}):null,o&&b?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:b,"aria-label":i("chat.minimizeToQuickChat","Minimize to quick chat"),title:i("chat.minimizeToQuickChat","Minimize to quick chat"),"data-testid":"chat-modal-minimize",children:t.jsx(Ir,{size:16})}):null,o&&p?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:p,"aria-label":i("chat.closeChat","Close chat"),title:i("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:t.jsx(Lr,{size:16})}):null]})}),t.jsxs("div",{className:"chat-view__body",children:[t.jsxs("div",{className:`chat-sidebar${Ze?"":" chat-sidebar--hidden"}`,style:nr,children:[f==="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(_r,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:i("chat.searchConversations","Search conversations..."),value:y,onChange:e=>L(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:P?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.loadingConversations","Loading...")}):E.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.noConversationsYet","No conversations yet")}):E.map(e=>{const r=h?.id===e.id,d=!r&&oe("direct",e.id,e.lastMessageAt??e.updatedAt),C=Ca(e,De.get(e.agentId)??null,at),B=ba(C?.provider,C?.modelId)??"Fusion";return t.jsxs("div",{className:`chat-session-item${r?" chat-session-item--active":""}`,onClick:()=>Ls(e.id),onContextMenu:te=>{te.preventDefault(),se({sessionId:e.id,x:te.clientX,y:te.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:te=>{te.stopPropagation(),$e(e.id)},"data-testid":"chat-session-delete-btn","aria-label":i("chat.deleteConversation","Delete conversation"),children:t.jsx(Xn,{size:14})}),t.jsxs("div",{className:"chat-session-title",children:[e.title||i("chat.untitledSession","Untitled"),d?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||i("chat.noMessages","No messages")}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[C?.provider?t.jsx(It,{provider:C.provider,size:"sm"}):null,t.jsx("span",{children:De.get(e.agentId)?.name||(e.agentId===yt?B:e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?$a(e.updatedAt,i):""})]})]},e.id)})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!ae&&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:()=>st(!0),children:[t.jsx(pt,{size:14}),i("chat.createRoom","Create room")]})}),m.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:i("chat.noRoomsYet","No rooms yet.")}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:m.rooms.map(e=>{const r=m.activeRoom?.id===e.id,d=!r&&oe("room",e.id,e.updatedAt);return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${r?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{U("room",e.id,e.updatedAt),m.selectRoom(e.id),ae&&de(!1)},onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),U("room",e.id,e.updatedAt),m.selectRoom(e.id),ae&&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]}),d?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),r?t.jsx("span",{className:"chat-room-item-meta",children:i("chat.roomMemberCount","{{count}} member",{count:m.activeRoomMembers.length,defaultValue_one:"{{count}} member",defaultValue_other:"{{count}} members"})}):null]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":i("chat.deleteRoom","Delete room {{name}}",{name:e.name}),onClick:C=>{C.stopPropagation(),fe(e.id)},children:t.jsx(Xn,{size:14})})]},e.id)})})]}),f==="rooms"?ae?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:()=>st(!0),children:[t.jsx(pt,{size:14}),i("chat.createRoom","Create room")]})}):null:ae?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>D(!0),"data-testid":"chat-new-btn",children:[t.jsx(pt,{size:14}),i("chat.newChat","New Chat")]})}):null]}),!ae&&Ze&&!At&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":mn,"aria-valuemax":hn,"aria-valuenow":Ee,"aria-label":i("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:Ka,onKeyDown:Ga}),ge&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:ge.y,left:ge.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Ps(ge.sessionId),"data-testid":"chat-context-rename",children:[t.jsx(qs,{size:14}),i("chat.rename","Rename")]}),t.jsxs("button",{onClick:()=>Ha(ge.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Or,{size:14}),i("chat.archive","Archive")]}),t.jsxs("button",{onClick:()=>{se(null),$e(ge.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(Xn,{size:14}),i("chat.delete","Delete")]})]}),ve&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>xe(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:i("chat.renameConversationTitle","Rename Conversation")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.renameConversationBody","Choose a new name for this conversation. Leave it blank to show Untitled.")}),t.jsx("label",{className:"chat-rename-label",htmlFor:"chat-rename-input",children:i("chat.conversationName","Conversation name")}),t.jsx("input",{id:"chat-rename-input",className:"input chat-rename-input",type:"text",value:Ke,placeholder:i("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:e=>Ge(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),Is())},autoFocus:!0}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>xe(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Is(),"data-testid":"chat-rename-save",children:i("chat.save","Save")})]})]})}),ye&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>$e(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:i("chat.deleteConversationTitle","Delete Conversation?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.deleteConversationBody","This action cannot be undone. All messages in this conversation will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>$e(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Ua(ye),children:i("chat.delete","Delete")})]})]})}),Ot&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>fe(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:i("chat.deleteRoomTitle","Delete Room?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.deleteRoomBody","This action cannot be undone. This room and all its messages will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>fe(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await m.deleteRoom(Ot),fe(null)}catch{a(i("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:i("chat.delete","Delete")})]})]})}),f==="rooms"?t.jsxs("div",{ref:Rn,className:"chat-thread",children:[m.activeRoom?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-room-thread-header",children:[ae&&t.jsx("button",{className:"btn-icon",onClick:In,"data-testid":"chat-back-btn",children:t.jsx(Ys,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:xs,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":Kt,onClick:()=>Mt(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",m.activeRoom.name]}),t.jsx(cn,{size:16,"aria-hidden":"true"})]}),Kt&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:m.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===m.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{U("room",e.id,e.updatedAt),m.selectRoom(e.id),Mt(!1)},children:["#",e.name]},e.id))})]}),t.jsx("div",{className:"chat-room-thread-members",children:m.activeRoomMembers.map(e=>t.jsx(xn,{agent:De.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:Re,onScroll:Rs,children:[m.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):m.messages.filter(e=>e.content.trim()!==pa).length===0?t.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):m.messages.filter(e=>e.content.trim()!==pa).map(e=>{const r=e.senderAgentId?De.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):i("chat.you","You"),d={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(ns,{message:d,forcePlain:ke,agentName:r,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:m.activeRoom?.id??null,mentionAgentsByName:En,roomContext:Oe,onScrollToTop:Vn,isAwaitingQuestionAnswer:!1,onQuestionSubmit:en},e.id)}),t.jsx("div",{ref:ps})]}),m.activeRoom&&hs&&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(cn,{size:14}),i("chat.latest","Latest")]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:i("chat.selectRoomOrCreate","Select a room or create one")}),m.activeRoom&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Qt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{dt(e.target.files),e.target.value=""}}),Ae.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Ae.map((e,r)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${r}`,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:()=>Ns(r),"data-testid":`chat-attachment-remove-${r}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${r}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>Qt.current?.click(),children:t.jsx(Js,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${ms?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),it(!0)},onDragLeave:()=>it(!1),onDrop:e=>{e.preventDefault(),it(!1),dt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:js,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:K,onChange:Es,onKeyDown:Ts,onKeyUp:Ds,onClick:sn,onBlur:$s,onFocus:Fs,onPaste:As,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Zs()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(da,{agents:lt,filter:J,highlightedIndex:ne,visible:Z,onSelect:tn,position:"below",roomMemberIds:Oe?.memberIds,roomName:Oe?.roomName})]}),t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{if(e.pointerType&&e.pointerType!=="mouse"){if(e.preventDefault(),!ft())return;ht(),Et()}},onTouchStart:e=>{e.preventDefault(),ft()&&(ht(),Et())},onMouseDown:e=>{e.preventDefault()},onClick:()=>{$n()||Et()},disabled:!K.trim()&&Ae.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(ea,{size:16})})]})]})]}):t.jsxs("div",{ref:Rn,className:"chat-thread",children:[(an||!ae)&&t.jsxs("div",{className:"chat-thread-header",children:[ae&&an&&t.jsx("button",{className:"btn-icon",onClick:Pn,"data-testid":"chat-back-btn",children:t.jsx(Ys,{size:16})}),t.jsx("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:Qa?t.jsxs("div",{className:"chat-mobile-session-menu",ref:vs,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":Ut,onClick:()=>Ve(e=>!e),children:[Qe?t.jsx(It,{provider:Qe,size:"md"}):t.jsx(Lt,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:_n}),Os&&t.jsx("span",{className:"chat-model-tag",children:Xe}),t.jsx(cn,{size:16,"aria-hidden":"true"})]}),Ut&&t.jsxs("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:[E.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:()=>Ls(e.id),children:t.jsx("span",{className:"chat-mobile-session-option-title",children:e.title||i("chat.untitledSession","Untitled")})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-rename","data-testid":`chat-mobile-session-rename-${e.id}`,"aria-label":i("chat.renameConversationAria","Rename conversation {{title}}",{title:e.title||i("chat.untitledSession","Untitled")}),onClick:()=>Ps(e.id),children:t.jsx(qs,{size:14})})]},e.id)),t.jsxs("button",{type:"button",role:"menuitem",className:"chat-mobile-session-new","data-testid":"chat-mobile-session-new",onClick:()=>{Ve(!1),D(!0)},children:[t.jsx(pt,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.newChat","New Chat")})]})]})]}):t.jsxs(t.Fragment,{children:[Qe?t.jsx(It,{provider:Qe,size:"md"}):t.jsx(Lt,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:_n}),Os&&t.jsx("span",{className:"chat-model-tag",children:Xe}),Xa&&on&&On?t.jsxs("span",{className:"chat-thread-header-context","data-testid":"chat-thread-context-window",title:On,"aria-label":On,children:[zs," / ",on]}):null]})}),an&&t.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${ke?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":ke?i("chat.showRenderedMarkdown","Show all messages as rendered Markdown"):i("chat.showPlainText","Show all messages as plain text"),onClick:Ya,children:ke?t.jsx(zr,{size:14}):t.jsx(Br,{size:14})})]}),Za?t.jsx(hi,{cliSessionId:tr,tier:er,projectId:n,renderTranscript:Us,renderComposer:()=>h?Ks():null}):t.jsxs(t.Fragment,{children:[Us(),hs&&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(cn,{size:14}),i("chat.latest","Latest")]}),h&&Ks()]})]}),t.jsx(mi,{isOpen:wn,onClose:()=>st(!1),projectId:n,existingRoomNames:m.rooms.map(e=>e.name),onCreate:async e=>{await m.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),f!=="rooms"&&_("rooms"),st(!1),ae&&de(!1)}})]}),k&&t.jsx(Fi,{projectId:n,defaultModel:at,onClose:()=>D(!1),onCreate:Ba})]})}export{Ui as ChatView,ki as clampChatInputHeight,Si as resolveChatInputOverflowY,Ca as resolveSessionProvider};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.chat-input-wrapper{position:relative;display:flex;flex:1;flex-direction:column;align-items:stretch;gap:var(--space-xs);min-width:0}.agent-mention-popup{position:absolute;z-index:250;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);min-width:220px;max-width:320px;max-height:240px;overflow-y:auto;box-shadow:var(--shadow-lg);padding:var(--space-xs) 0}.agent-mention-popup--below{top:calc(100% + var(--space-xs));left:0}.agent-mention-popup--above{bottom:calc(100% + var(--space-xs));left:0}.agent-mention-item{display:flex;align-items:center;gap:var(--space-sm);padding:calc(var(--space-sm) - (var(--space-xs) / 2)) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);color:var(--text);cursor:pointer;border:none;background:transparent;width:100%;text-align:left}.agent-mention-item:hover,.agent-mention-item--highlighted{background:var(--card-hover)}.agent-mention-item:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);background:var(--card-hover)}.agent-mention-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-mention-role{font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.agent-mention-empty{padding:calc(var(--space-sm) + (var(--space-xs) / 2)) var(--space-md);font-size:var(--space-md);color:var(--text-dim)}.agent-mention-section-header{padding:var(--space-xs) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs) * .5);text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted)}.agent-mention-hint{padding:var(--space-xs) var(--space-md);font-size:var(--space-md);color:var(--text-muted)}.agent-mention-member-dot{background:var(--color-success)}@media(max-width:1024px){.agent-mention-popup{min-width:200px;max-width:min(280px,100%)}.agent-mention-popup--below,.agent-mention-popup--above{bottom:calc(100% + var(--space-xs));top:auto;left:0}}.file-mention-popup{position:absolute;z-index:250;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);min-width:calc(var(--space-xl) * 7 + var(--space-md));max-width:calc(var(--space-xl) * 10);max-height:calc(var(--space-xl) * 7 + var(--space-sm));overflow-y:auto;padding:var(--space-xs) 0}.file-mention-popup-groups,.file-mention-popup-group{display:flex;flex-direction:column}.file-mention-popup-group-header{padding:var(--space-xs) var(--space-md);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;letter-spacing:calc(var(--space-xs) / 2);text-transform:uppercase}.file-mention-popup-list{list-style:none;margin:0;padding:0}.file-mention-popup-item{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);cursor:pointer;color:var(--text);font-size:calc(var(--space-sm) + var(--space-xs) * 1.5)}.file-mention-popup-item:hover{background:var(--card-hover)}.file-mention-popup-item--selected{background:color-mix(in srgb,var(--todo) 15%,transparent)}.file-mention-popup-item:focus-visible{outline:none;box-shadow:var(--focus-ring);background:var(--card-hover)}.file-mention-popup-icon{flex-shrink:0;display:inline-flex;align-items:center;color:var(--text-muted);margin-top:1px}.file-mention-popup-info{display:flex;flex-direction:column;min-width:0;gap:calc(var(--space-xs) / 2)}.file-mention-popup-item-name{font-weight:500;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-mention-popup-item-path{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-mention-popup-task-row{display:flex;align-items:center;gap:var(--space-sm);min-width:0}.file-mention-popup-task-id{font-family:var(--font-mono);font-weight:600;color:var(--text);white-space:nowrap}.file-mention-popup-column-badge{display:inline-flex;align-items:center;justify-content:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;line-height:1;text-transform:capitalize}.file-mention-popup-column-badge--triage{background:var(--status-triage-bg);color:var(--triage)}.file-mention-popup-column-badge--todo{background:var(--status-todo-bg);color:var(--todo)}.file-mention-popup-column-badge--in-progress{background:var(--status-in-progress-bg);color:var(--in-progress)}.file-mention-popup-column-badge--in-review{background:var(--status-in-review-bg);color:var(--in-review)}.file-mention-popup-column-badge--done{background:var(--status-done-bg);color:var(--done)}.file-mention-popup-column-badge--archived{background:var(--status-archived-bg);color:var(--text-muted)}.file-mention-popup-empty{padding:var(--space-lg) var(--space-md);text-align:center;color:var(--text-muted);font-size:var(--space-md)}.file-mention-popup-loading{display:flex;align-items:center;justify-content:center;padding:var(--space-lg) var(--space-md)}.file-mention-popup-loading .spinner{display:inline-block;width:var(--space-lg);height:var(--space-lg);border:calc(var(--space-xs) / 2) solid var(--border);border-top-color:var(--text-muted);border-radius:50%;animation:file-mention-popup-spinner-spin var(--duration-slow) linear infinite}@keyframes file-mention-popup-spinner-spin{to{transform:rotate(360deg)}}@media(max-width:768px){.file-mention-popup{top:auto!important;bottom:calc(100% + var(--space-xs));left:max(var(--space-md),env(safe-area-inset-left,0px))!important;right:max(var(--space-md),env(safe-area-inset-right,0px));max-width:none;width:auto;max-height:calc(var(--space-xl) * 8 + var(--space-sm))}.file-mention-popup-item{min-height:calc(var(--space-lg) + var(--space-xl) - var(--space-sm));padding:calc(var(--space-sm) + (var(--space-xs) / 2)) var(--space-md)}}.chat-empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-lg);color:var(--text-muted);padding:var(--space-xl);text-align:center}.chat-empty-state h2{font-size:calc(var(--space-xl) - var(--space-xs));color:var(--text);margin:0}.chat-empty-state-agent-select select{padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);color:var(--text);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5));min-width:calc(var(--space-xl) * 8 + var(--space-sm))}.chat-new-dialog-backdrop{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:100}.chat-new-dialog{background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-xl);width:calc(var(--space-xl) * 16 + var(--space-md));max-width:calc(100vw - (var(--space-md) * 2));display:flex;flex-direction:column;gap:var(--space-lg)}.chat-new-dialog h3{margin:0;font-size:calc(var(--space-lg) + (var(--space-xs) / 2))}.chat-new-dialog label{display:flex;flex-direction:column;gap:var(--space-xs);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.25));color:var(--text-muted)}.chat-new-dialog input,.chat-new-dialog select{padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);color:var(--text);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5))}.chat-new-dialog-mode-toggle{display:flex;gap:var(--space-xs)}.chat-new-dialog-mode-btn{flex:1;padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.25));cursor:pointer;transition:var(--transition-fast)}.chat-new-dialog-mode-btn:hover{background:color-mix(in srgb,var(--todo) 10%,transparent);color:var(--text);border-color:color-mix(in srgb,var(--todo) 40%,var(--border))}.chat-new-dialog-mode-btn--active{background:color-mix(in srgb,var(--todo) 18%,transparent);color:var(--text);border-color:color-mix(in srgb,var(--todo) 50%,var(--border));font-weight:500}.chat-new-dialog-mode-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.chat-new-dialog-actions{display:flex;justify-content:flex-end;gap:var(--space-sm)}.chat-view-delete-dialog-copy{margin:0 0 var(--space-lg);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.5)}.chat-new-dialog-model-label{display:flex;flex-direction:column;gap:var(--space-sm)}.chat-new-dialog-loading,.chat-new-dialog-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5))}.chat-new-dialog-agent-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-xl) * 12 + var(--space-md));overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-xs)}.chat-new-dialog-agent-item{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5));text-align:left;cursor:pointer;transition:background var(--transition-fast)}.chat-new-dialog-agent-item:hover{background:var(--surface-hover)}.chat-new-dialog-agent-item--selected{background:color-mix(in srgb,var(--todo) 10%,transparent);border:1px solid color-mix(in srgb,var(--todo) 30%,transparent)}.chat-new-dialog-agent-name{flex:1;font-weight:500}.chat-new-dialog-agent-role{font-size:var(--space-md);color:var(--text-muted);text-transform:capitalize}.chat-new-dialog{overflow:visible}@media(max-width:768px){.quick-chat-fab{right:var(--space-xs);bottom:calc(var(--space-xs) + var(--executor-footer-height-mobile, var(--executor-footer-height, 0px)) + var(--mobile-nav-height, 44px) + env(safe-area-inset-bottom,0px))}.chat-view-dialog-backdrop{align-items:center;justify-content:center;overflow-y:auto;padding:var(--space-md);padding-top:max(var(--space-md),env(safe-area-inset-top,0px));padding-bottom:max(var(--space-md),env(safe-area-inset-bottom,0px))}.chat-view-dialog{width:100%;max-width:min(100%,calc(var(--space-xl) * 16));max-height:calc(100dvh - (var(--space-md) * 2) - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px));display:flex;flex-direction:column;overflow-y:auto}}.create-room-modal{display:flex;flex-direction:column;gap:var(--space-md)}.create-room-modal-name-group{margin-bottom:0}.create-room-modal-name-field{display:flex;align-items:center;gap:var(--space-sm)}.create-room-modal-name-hash{color:var(--text-muted);font-family:var(--font-mono)}.create-room-modal-name-field .input{flex:1}.create-room-modal-selected{display:flex;flex-wrap:wrap;gap:var(--space-sm);padding:0 var(--space-xl)}.create-room-modal-chip{border-color:var(--border)}.create-room-modal-member-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-2xl) * 8);overflow-y:auto;padding:0 var(--space-xl)}.create-room-modal-member-row{display:flex;width:100%;align-items:center;gap:var(--space-sm);text-align:left;border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-sm);background:var(--surface);color:var(--text);transition:background var(--transition-fast),border-color var(--transition-fast)}.create-room-modal-member-row:hover{background:var(--card-hover)}.create-room-modal-member-row:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.create-room-modal-member-row--selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.create-room-modal-member-role{margin-left:auto;color:var(--text-muted);font-size:var(--space-md)}.create-room-modal-empty{color:var(--text-muted);padding:var(--space-md);text-align:center}@media(max-width:768px){.create-room-modal{width:100%}.create-room-modal-selected,.create-room-modal-member-list{padding:0 var(--space-md)}.create-room-modal .modal-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.create-room-modal .modal-actions .btn{width:100%}}
|