@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
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import{r as a,j as e,b as cr,R as lr}from"./vendor-react-SZ_qB27O.js";import{c as ls,aA as at,ay as Ze,dK as Vs,dL as us,bU as zt,dM as Qs,aD as ie,dN as bn,dp as kt,dO as ur,dP as Lt,dQ as dr,dq as wn,dr as Ct,dR as mr,dS as Ws,dT as hr,dU as fr,dV as gr,dW as pr,ai as ja,dX as br,az as rs,bB as Xs,dY as vr,dZ as yr,d_ as Wn,d$ as xr,e0 as wr,e1 as Cr,e2 as Sr,e3 as kr,e4 as Nr,f as Cn,e5 as Mr,e6 as Ta,bo as Rr,al as Ar,bb as vn,a1 as jr,c0 as Tr,e7 as Er,i as _r,e8 as Ea,e9 as $r,dz as Dr,W as Fr,ea as Lr,s as _a,v as $a,G as Pr,H as Ir,V as Or,P as yt,di as Ys,dh as zr,X as Br,aK as Hr,J as Xn,dw as It,I as Js,bO as Ur,bs as Zs,o as dn,eb as ea,ec as ta,cE as na,bu as Ot,D as qr,F as Kr,ed as Sn,dj as sa,b7 as Gr,cn as Vr,bM as aa,bP as Qr}from"./index-DFeBJ3GM.js";import{u as De}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as ra}from"./SessionTerminal-BVon9kbr.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";import"./shield-alert-BfOnDO6O.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=ls("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 Yr=[["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"}]],Da=ls("hash",Yr);/**
|
|
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 Jr=[["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"}]],ia=ls("wrench",Jr);function oa(n){const{sessionId:s,tempUserMessageId:r,initialText:l,initialThinking:c,initialToolCalls:d,setStreamingText:f,setStreamingThinking:i,setStreamingToolCalls:u,cancelStreamingFlushesRef:_,addToast:j,onDone:R,onError:p,onFallbackSession:S}=n;let k=l??"",E=c??"",C=d?[...d]:[],O,b=null,W=null;const U=()=>{b=null,f(k)},re=()=>{W=null,i(E)},T=()=>{b!==null&&(cancelAnimationFrame(b),b=null),W!==null&&(cancelAnimationFrame(W),W=null)};return _.current=T,{handlers:{onThinking:z=>{E+=z,W===null&&(W=requestAnimationFrame(re))},onText:z=>{k+=z,b===null&&(b=requestAnimationFrame(U))},onToolStart:z=>{C=[...C,{toolName:z.toolName,args:z.args,isError:!1,status:"running"}],u(C)},onToolEnd:z=>{const H=[...C];for(let F=H.length-1;F>=0;F--){const G=H[F];if(G?.toolName===z.toolName&&G.status==="running"){H[F]={...G,status:"completed",isError:z.isError,result:z.result},C=H,u(H);return}}C=[...H,{toolName:z.toolName,isError:z.isError,result:z.result,status:"completed"}],u(C)},onFallback:z=>{O=z,S?.(z,s),j?.(`Primary model unavailable. Switched to fallback ${z.fallbackModel}.`,"warning")},onDone:z=>{T(),R({messageId:z.messageId,message:z.message,accumulated:{text:k,thinking:E,toolCalls:C,fallbackInfo:O}})},onError:z=>{T(),p(z,r)}},cancelFlushes:T}}const Zr="fusion:chat-pending:";function ds(n){return n?`${Zr}${n}`:null}function ei(n){const s=ds(n);if(!s||typeof window>"u")return[];try{const r=localStorage.getItem(s);if(!r)return[];try{const c=JSON.parse(r);if(Array.isArray(c))return c.filter(d=>typeof d=="string"&&d.trim().length>0)}catch{}const l=r.trim();return l?[l]:[]}catch{return[]}}function Yn(n,s){const r=ds(n);if(!(!r||typeof window>"u"))try{const l=s.filter(c=>c.trim().length>0);if(l.length===0){localStorage.removeItem(r);return}localStorage.setItem(r,JSON.stringify(l))}catch{}}function mn(n){const s=ds(n);if(!(!s||typeof window>"u"))try{localStorage.removeItem(s)}catch{}}const Jn="kb-chat-active-session";function ca(n){const s=typeof n=="string"?n.trim():"",r=s.indexOf("/");return!s||r<=0||r>=s.length-1?{}:{modelProvider:s.slice(0,r),modelId:s.slice(r+1)}}function ti(n){const s=n?.toolCalls;if(!Array.isArray(s))return;const r=s.map(l=>{if(!l||typeof l!="object")return null;const c=l,d=typeof c.toolName=="string"?c.toolName:"";if(!d)return null;const f=c.args;return{toolName:d,...f&&typeof f=="object"?{args:f}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(l=>l!==null);return r.length>0?r:void 0}function ni(n){const s=n?.fallback;if(!s||typeof s!="object")return;const r=s,l=typeof r.primaryModel=="string"?r.primaryModel:"",c=typeof r.fallbackModel=="string"?r.fallbackModel:"",d=r.triggerPoint;if(!(!l||!c||d!=="session-creation"&&d!=="prompt-time"))return{primaryModel:l,fallbackModel:c,triggerPoint:d}}function si(n){const s=n?.failureInfo;if(!s||typeof s!="object")return;const r=s,l=typeof r.summary=="string"?r.summary.trim():"";if(!l)return;const c=(()=>{const d=r.reference;if(!d||typeof d!="object")return;const f=d,i=typeof f.kind=="string"?f.kind.trim():"",u=typeof f.id=="string"?f.id.trim():"";if(!(!i||!u))return{kind:i,id:u,...typeof f.label=="string"&&f.label.trim()?{label:f.label.trim()}:{}}})();return{summary:l,...typeof r.errorClass=="string"&&r.errorClass.trim()?{errorClass:r.errorClass.trim()}:{},...typeof r.code=="string"&&r.code.trim()?{code:r.code.trim()}:{},...typeof r.detail=="string"&&r.detail.trim()?{detail:r.detail.trim()}:{},...c?{reference:c}:{}}}function la(n,s){const r="Failed to get response";return typeof n=="string"?{summary:n.trim()||r}:{summary:typeof n.summary=="string"&&n.summary.trim()?n.summary.trim():r,...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 Zn(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,s){const r=a.useCallback(h=>h?`${at.CHAT_SESSIONS_PREFIX}${h}`:null,[]),l=a.useCallback((h,x)=>h&&x?`${at.CHAT_MESSAGES_PREFIX}${h}:${x}`:null,[]),c=a.useCallback(h=>{const x=r(h);return x?Ze(x,{maxAgeMs:Vs})??[]:[]},[r]),[d,f]=a.useState(()=>c(n)),[i,u]=a.useState(null),[_,j]=a.useState(()=>c(n).length===0),[R,p]=a.useState([]),[S,k]=a.useState(!1),[E,C]=a.useState(!1),[O,b]=a.useState(""),[W,U]=a.useState(""),[re,T]=a.useState([]),[X,z]=a.useState([]),[H,F]=a.useState(""),[G,y]=a.useState(!1),{agentsMap:L}=us(n),P=a.useRef(null),Y=a.useRef(null),N=a.useRef(!1),$=a.useRef([]),w=a.useRef(()=>!1),v=a.useRef(null),g=a.useRef(d),D=a.useRef(i),Q=a.useRef(R),I=a.useRef(E);g.current=d,D.current=i,Q.current=R,I.current=E,a.useEffect(()=>{$.current=X},[X]);const ue=a.useRef(new Set),me=a.useRef(0),xe=a.useRef(n);xe.current!==n&&(zt({view:"useChat",trigger:"project-context-change",projectId:n,replayAttempted:!1,detail:{previousProjectId:xe.current??null}}),xe.current=n,me.current++);const le=a.useCallback(async()=>{g.current.length===0&&j(!0);try{const x=[...(await Qs(n)).sessions].sort((K,se)=>new Date(se.updatedAt).getTime()-new Date(K.updatedAt).getTime());f(x);const A=r(n);A&&ie(A,x,{maxBytes:5e5})}catch{const h=c(n);if(g.current.length===0&&h.length===0){const x=r(n);x&&bn(x)}}finally{j(!1)}},[r,n]);a.useEffect(()=>{const h=c(n);f(h),j(h.length===0)},[n,c]),a.useEffect(()=>{le()},[le,n]);const ve=a.useRef(()=>{}),we=a.useRef(!1);a.useEffect(()=>{we.current=!1,Y.current=null},[n]),a.useEffect(()=>{if(_||we.current||D.current)return;const h=kt(Jn,n);if(!h){we.current=!0;return}const x=d.find(A=>A.id===h);if(x){we.current=!0,ve.current(h,x);return}we.current=!0},[_,d,n]);const qe=a.useCallback((h,x)=>{const A=l(h,x);return A?Ze(A,{maxAgeMs:Vs})??[]:[]},[l]),et=a.useCallback((h,x)=>{const A=qe(n,h);return A.length>0?(p(A),k(!1),!0):(x?.clearOnMiss!==!1&&p([]),!1)},[n,qe]),ge=a.useCallback(async(h,x)=>{const A=typeof x?.offset=="number"&&x.offset>0||typeof x?.before=="string",K=l(n,h),se=A?[]:qe(n,h),q=se.length>0;!A&&q?(p(se),k(!1)):k(!0);try{const J=await ur(h,{limit:50,order:"desc",...x},n),V=J.messages.slice().reverse().map(Zn),te=D.current?.id===h||x?.commitForStreamingAttach===!0&&Y.current?.sessionId===h;A?te&&(p(oe=>[...V,...oe]),y(J.messages.length>=50)):te&&(p(V),y(J.messages.length>=50),K&&ie(K,V,{maxBytes:5e5}))}catch{!A&&Q.current.length===0&&q&&(p(se),k(!1))}finally{k(!1)}},[l,n,qe]),tt=a.useCallback(()=>{v.current?.(),v.current=null,$.current=[],z([]),b(""),U(""),T([]),C(!1)},[]),rt=a.useCallback(h=>{const x=D.current?.id;if(typeof h=="number"){const A=$.current.filter((K,se)=>se!==h);$.current=A,z(A),Yn(x,A);return}mn(x),$.current=[],z([])},[]),fe=a.useCallback(()=>{const[h,...x]=$.current,A=h?.trim();if(!A)return;const K=D.current?.id;$.current=x,z(x),Yn(K,x),Mt.current(A)},[]),Ee=a.useCallback(async(h,x)=>{try{const{session:A}=await Lt(h,n);if(D.current?.id!==h||$.current.length===0)return;if(A.isGenerating||A.inFlightGeneration){w.current(h,A.inFlightGeneration,{silent:x?.silent,priorThreadLoadAlreadyStarted:!0});return}fe()}catch{}},[fe,n]),he=a.useCallback((h,x,A)=>{if(P.current||!h)return!0;N.current=!1;const K=Q.current,se=K.length===0||K[0]?.sessionId!==h;Y.current={sessionId:h,replayFromEventId:typeof x?.replayFromEventId=="number"?x.replayFromEventId:null},se&&!A?.priorThreadLoadAlreadyStarted&&(et(h,{clearOnMiss:!1}),ge(h,{commitForStreamingAttach:!0})),x&&(b(x.streamingText),U(x.streamingThinking),T(x.toolCalls)),C(!0);const{handlers:q}=oa({sessionId:h,tempUserMessageId:"",initialText:x?.streamingText,initialThinking:x?.streamingThinking,initialToolCalls:x?.toolCalls,setStreamingText:b,setStreamingThinking:U,setStreamingToolCalls:T,cancelStreamingFlushesRef:v,addToast:A?.silent?void 0:s,onFallbackSession:(V,te)=>{const oe=ca(V.fallbackModel);f(ne=>ne.map(ee=>ee.id===te?{...ee,...oe}:ee)),u(ne=>ne&&ne.id===te?{...ne,...oe}:ne)},onDone:()=>{b(""),U(""),T([]),C(!1),I.current=!1,P.current=null,Y.current=null,ge(h),fe()},onError:V=>{b(""),U(""),T([]),C(!1),I.current=!1,P.current=null,Y.current=null;const te=la(V);A?.silent||s?.(te.summary,"error"),ge(h),Ee(h,{silent:A?.silent})}});zt({view:"useChat",trigger:"sse-open",projectId:n,replayAttempted:typeof x?.replayFromEventId=="number",replayFromEventId:x?.replayFromEventId??null,lastEventId:x?.replayFromEventId??null});const J=dr(h,q,n,{...typeof x?.replayFromEventId=="number"?{lastEventId:x.replayFromEventId}:{}});return P.current=J,!0},[s,fe,Ee,et,ge,n]);w.current=he;const Ke=a.useCallback((h,x)=>{const A=D.current?.id??null;if(h&&A===h&&!x)return;P.current&&(P.current.close(),P.current=null),Y.current=null;const K=x??d.find(se=>se.id===h);u(K||null),D.current=K||null,h&&Lt(h,n).then(({session:se})=>{!se.isGenerating||!se.inFlightGeneration||u(q=>!q||q.id!==h?q:{...q,...se})}).catch(()=>{}),tt(),y(!1),h?(et(h),ge(h)):p([]),K?.isGenerating&&he(K.id,K.inFlightGeneration,{priorThreadLoadAlreadyStarted:!0}),h?wn(Jn,h,n):Ct(Jn,n)},[he,et,d,ge,n,tt]);ve.current=Ke,a.useEffect(()=>{const h=i?.id;if(!h)return;const x=ei(h);if(x.length===0)return;$.current=x,z(x);let A=!1;return Lt(h,n).then(({session:K})=>{if(!(A||D.current?.id!==h||$.current.length===0)){if(K.isGenerating){P.current||he(h,K.inFlightGeneration);return}!I.current&&!P.current&&fe()}}).catch(()=>{}),()=>{A=!0}},[i?.id,he,fe,n]);const kn=a.useCallback(async h=>{const x=D.current?.id,A=await mr(h,n);P.current&&(P.current.close(),P.current=null),Y.current=null;const K={id:A.session.id,title:A.session.title,agentId:A.session.agentId,status:A.session.status,modelProvider:A.session.modelProvider,modelId:A.session.modelId,createdAt:A.session.createdAt,updatedAt:A.session.updatedAt};return f(se=>se.some(q=>q.id===K.id)?se:[K,...se]),mn(x),tt(),Ke(K.id,K),K},[n,tt,Ke]),it=a.useCallback(async h=>{mn(h),await Ws(h,{status:"archived"},n),f(x=>x.filter(A=>A.id!==h)),i?.id===h&&(Y.current=null,u(null),p([]))},[i,n]),Bt=a.useCallback(async(h,x)=>{const A=x.trim()||null,K=d,se=i;f(q=>q.map(J=>J.id===h?{...J,title:A}:J)),u(q=>q?.id===h?{...q,title:A}:q);try{const J=(await Ws(h,{title:A},n)).session;f(V=>V.map(te=>te.id===h?{...te,title:J.title,updatedAt:J.updatedAt}:te)),u(V=>V?.id===h?{...V,title:J.title,updatedAt:J.updatedAt}:V)}catch(q){throw f(K),u(se),s?.("Failed to rename conversation","error"),q}},[i,s,n,d]),Te=a.useCallback(async h=>{mn(h),i?.id===h&&P.current&&(P.current.close(),P.current=null),i?.id===h&&(Y.current=null),await hr(h,n);const x=l(n,h);x&&bn(x),f(A=>A.filter(K=>K.id!==h)),i?.id===h&&(u(null),p([]))},[i,l,n]),Ht=a.useCallback(async()=>{if(!i||!G)return;const h=Q.current[0]?.createdAt;h&&await ge(i.id,{before:h})},[i,G,ge]),Ut=a.useCallback(()=>{i&&(N.current=!0,v.current?.(),v.current=null,P.current?.close(),P.current=null,Y.current=null,fr(i.id,n).catch(()=>{}),C(!1),I.current=!1,b(""),U(""),T([]),fe())},[i,n,fe]),Mt=a.useRef(()=>{}),ot=gr(),ct=a.useCallback(async h=>{try{await le();const x=await Lt(h,n);D.current?.id===h&&u(A=>!A||A.id!==h?A:{...A,...x.session}),x.session.isGenerating?(b(""),U(""),T([]),C(!0),I.current=!0,he(h,x.session.inFlightGeneration,{silent:!0})):(b(""),U(""),T([]),C(!1),I.current=!1,await ge(h))}catch{}},[he,ge,n,le]),qt=a.useCallback((h,x)=>{if(!i)return;if(I.current){const q=h.trim();if(!q)return;const J=[...$.current,q];$.current=J,z(J),Yn(i.id,J);return}N.current=!1,P.current&&(P.current.close(),P.current=null),Y.current=null;const A=`temp-${Date.now()}`,K={id:A,sessionId:i.id,role:"user",content:h,createdAt:new Date().toISOString()};p(q=>[...q,K]),b(""),U(""),T([]),C(!0),I.current=!0;const{handlers:se}=oa({sessionId:i.id,tempUserMessageId:A,setStreamingText:b,setStreamingThinking:U,setStreamingToolCalls:T,cancelStreamingFlushesRef:v,addToast:s,onFallbackSession:(q,J)=>{const V=ca(q.fallbackModel);f(te=>te.map(oe=>oe.id===J?{...oe,...V}:oe)),u(te=>te&&te.id===J?{...te,...V}:te)},onDone:({messageId:q,message:J,accumulated:V})=>{const te=J?{...Zn(J),...V.text.length>0?{content:V.text}:{}}:{id:q||`msg-${Date.now()}`,sessionId:i.id,role:"assistant",content:V.text,thinkingOutput:V.thinking,toolCalls:V.toolCalls.length>0?V.toolCalls:void 0,fallbackInfo:V.fallbackInfo,createdAt:new Date().toISOString()};ue.current.add(te.id),p(oe=>[...oe,te]),b(""),U(""),T([]),C(!1),I.current=!1,P.current=null,Y.current=null,setTimeout(()=>{ue.current.delete(te.id)},1e3),le(),fe()},onError:(q,J)=>{const V=la(q),te=typeof q=="string"?q:V.summary,oe=br(te);p(ne=>{const ee=ne.filter(de=>de.id!==J);return oe?ee:[...ee,{id:`error-${Date.now()}`,sessionId:i.id,role:"assistant",content:V.summary,failureInfo:V,createdAt:new Date().toISOString()}]}),b(""),U(""),T([]),C(!1),I.current=!1,P.current=null,Y.current=null,console.error("[useChat] Stream error:",q),oe?(console.info("[useChat] Suppressed tab-suspension stream error:",q),i?.id&&(b(""),U(""),T([]),C(!0),I.current=!0,ct(i.id))):(s?.(V.summary,"error"),le()),N.current||fe()}});P.current=pr(i.id,h,se,x,n)},[i,n,le,s,he,ct,fe]);Mt.current=qt;const Ge=H?d.filter(h=>h.title?.toLowerCase().includes(H.toLowerCase())||h.agentId.toLowerCase().includes(H.toLowerCase())):d;return a.useEffect(()=>{if(!i?.id||i.isGenerating!==!0||P.current)return;const h=typeof i.inFlightGeneration?.replayFromEventId=="number"?i.inFlightGeneration.replayFromEventId:null,x=Y.current;x?.sessionId===i.id&&x.replayFromEventId===h||he(i.id,i.inFlightGeneration,{silent:!0})},[i?.id,i?.isGenerating,i?.inFlightGeneration,he]),a.useEffect(()=>{if(!D.current?.isGenerating||(P.current||he(D.current.id,D.current.inFlightGeneration),!I.current||P.current||!D.current))return;const h=setInterval(async()=>{if(!I.current||P.current||!D.current){clearInterval(h);return}try{(await Qs(n)).sessions.find(K=>K.id===D.current?.id)?.isGenerating||(clearInterval(h),await ge(D.current.id),b(""),U(""),T([]),C(!1),I.current=!1,fe())}catch{}},3e3);return()=>clearInterval(h)},[he,ge,n,i,fe]),a.useEffect(()=>ot.onBecameVisible(()=>{const x=D.current;if(!x||P.current)return;const A=me.current;Lt(x.id,n).then(K=>{if(!(me.current!==A||P.current)){if(K.session.isGenerating){b(""),U(""),T([]),C(!0),I.current=!0,he(x.id,K.session.inFlightGeneration,{silent:!0});return}I.current&&(b(""),U(""),T([]),C(!1),I.current=!1,fe(),ge(x.id))}}).catch(()=>{})}),[he,ge,n,ot,fe]),a.useEffect(()=>{const h=me.current,x=n?`?projectId=${encodeURIComponent(n)}`:"",A=()=>me.current!==h,K=oe=>{if(A())return;const ne=JSON.parse(oe.data);f(ee=>ee.some(de=>de.id===ne.id)?ee:[ne,...ee])},se=oe=>{if(A())return;const ne=JSON.parse(oe.data);f(ee=>[...ee.map(pe=>pe.id===ne.id?ne:pe)]),D.current?.id===ne.id&&(u(ne),ne.isGenerating&&!P.current&&he(ne.id,ne.inFlightGeneration))},q=oe=>{if(A())return;const{id:ne}=JSON.parse(oe.data);f(de=>de.filter(pe=>pe.id!==ne));const ee=l(n,ne);ee&&bn(ee),D.current?.id===ne&&(u(null),p([]))},J=oe=>{if(A())return;const ne=JSON.parse(oe.data),ee=Zn(ne);if(!ue.current.has(ee.id)){if(D.current?.id===ee.sessionId&&I.current&&!P.current&&ee.role==="assistant"){p(de=>de.some(pe=>pe.id===ee.id)?de:[...de,ee]),b(""),U(""),T([]),C(!1),I.current=!1,fe();return}D.current?.id===ee.sessionId&&!I.current&&p(de=>{if(de.some(pe=>pe.id===ee.id))return de;if(ee.role==="user"){const pe=de.findIndex(Ve=>Ve.role==="user"&&Ve.id.startsWith("temp-")&&Ve.content.trim()===ee.content.trim());if(pe>=0){const Ve=[...de];return Ve[pe]=ee,Ve}}return[...de,ee]})}},V=oe=>{if(A())return;const{id:ne}=JSON.parse(oe.data);p(ee=>ee.filter(de=>de.id!==ne))};return ja(`/api/events${x}`,{events:{"chat:session:created":K,"chat:session:updated":se,"chat:session:deleted":q,"chat:message:added":J,"chat:message:deleted":V}})},[he,l,n,fe]),a.useEffect(()=>()=>{P.current&&(P.current.close(),P.current=null),Y.current=null},[]),{sessions:d,activeSession:i,sessionsLoading:_,messages:R,messagesLoading:S,isStreaming:E,streamingText:O,streamingThinking:W,streamingToolCalls:re,pendingMessages:X,selectSession:Ke,createSession:kn,archiveSession:it,renameSession:Bt,deleteSession:Te,sendMessage:qt,stopStreaming:Ut,clearPendingMessage:rt,loadMoreMessages:Ht,hasMoreMessages:G,searchQuery:H,setSearchQuery:F,filteredSessions:Ge,refreshSessions:le,agentsMap:L}}function hn(){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 es(n,s){const r=ri(),l=s?.warm===!0,c=hn(),d=new Map;let f=!1,i=!1;return{mark(_){f||i||!r||d.has(_)||d.set(_,hn())},complete:_=>{if(!r||f||i){f=!0;return}f=!0,d.set("complete",hn());const j=Array.from(d.entries()).sort((k,E)=>k[1]-E[1]);let R=c;const p={};for(const[k,E]of j)p[k]=Math.max(0,E-R),R=E;const S=Math.max(0,hn()-c);try{console.debug("[room-open]",{roomId:n,warm:l,totalMs:S,phases:p,..._??{}})}catch{}},cancel(){i=!0,f=!0}}}const Je="fusion:chat-active-room";class Fa extends Error{roomId;constructor(s,r){super(s),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=r}}function is(n){return[...n].sort((s,r)=>new Date(r.updatedAt).getTime()-new Date(s.updatedAt).getTime())}function xt(n,s){const r=n.findIndex(c=>c.id===s.id);if(r===-1)return is([s,...n]);const l=[...n];return l[r]=s,is(l)}function Ue(n){try{return JSON.parse(n.data)}catch{return null}}function ii(n,s,r){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:n,role:"user",content:s,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...r?.length?{attachments:r}:{},createdAt:new Date().toISOString()}}function ua(n,s,r){if(n.some(c=>c.id===s.id))return n;const l=r?n.findIndex(c=>c.id===r):-1;if(l>=0){const c=[...n];return c[l]=s,c}if(s.role==="user"){const c=n.findIndex(d=>d.role==="user"&&d.id.startsWith("temp-")&&d.content.trim()===s.content.trim());if(c>=0){const d=[...n];return d[c]=s,d}}return[...n,s]}function oi(n,s){const{t:r}=De("app"),l=`${at.CHAT_ROOMS}:${n??"global"}`,c=`${at.ACTIVE_CHAT_ROOM_ID}:${n??"global"}`,d=a.useCallback(N=>`${at.CHAT_ROOM_MESSAGES_PREFIX}${n??"global"}:${N}`,[n]),f=a.useCallback(N=>`${at.CHAT_ROOM_MEMBERS_PREFIX}${n??"global"}:${N}`,[n]),[i,u]=a.useState(()=>{const N=Ze(l,{maxAgeMs:rs});return Array.isArray(N)?N:[]}),[_,j]=a.useState(()=>i.length===0),[R,p]=a.useState(null),[S,k]=a.useState(()=>{const N=Ze(c,{maxAgeMs:Xs});return N?i.find($=>$.id===N)??null:null}),[E,C]=a.useState([]),[O,b]=a.useState([]),[W,U]=a.useState(!1),re=a.useRef(i),T=a.useRef(S),X=a.useRef(0),z=a.useRef(n);re.current=i,T.current=S,z.current!==n&&(z.current=n,X.current+=1);const H=a.useCallback(async N=>{if(!N){C([]),b([]),U(!1);return}const $=es(N.id,{warm:!1});$.mark("select");const w=Ze(d(N.id),{maxAgeMs:vr}),v=Ze(f(N.id),{maxAgeMs:rs}),g=Array.isArray(w)&&w.length>0,D=Array.isArray(v)&&v.length>0;g||D?($.mark("cache-hit"),g&&(b(w),$.mark("hydrate")),D&&C(v),U(!1)):(b([]),U(!0));try{const[Q,I]=await Promise.all([yr(N.id,n),Wn(N.id,{limit:100,order:"desc"},n)]);$.mark("members-fetch"),$.mark("messages-fetch"),ie(f(N.id),Q.members,{maxBytes:5e5}),ie(d(N.id),I.messages,{maxBytes:5e5}),T.current?.id===N.id&&(C(Q.members),b(I.messages),$.mark("hydrate"))}catch{!g&&!D&&(C([]),b([]))}finally{U(!1),$.complete({warm:g,membersCached:D})}},[f,d,n]),F=a.useCallback(async()=>{re.current.length===0&&j(!0);try{const N=await xr({},n),$=is(N.rooms);u($),ie(l,$,{maxBytes:5e5}),p(null);const w=Ze(c,{maxAgeMs:Xs})??kt(Je,n);if(w){const v=$.find(g=>g.id===w)??null;v?(k(v),H(v)):(Ct(Je,n),ie(c,"",{maxBytes:5e5}))}}catch(N){const $=N instanceof Error?N.message:r("chatRooms.error.failedToLoad","Failed to load chat rooms");p($),s?.($,"error")}finally{j(!1)}},[c,s,H,n,l]),G=a.useCallback(N=>{if(!N){T.current=null,k(null),Ct(Je,n),ie(c,"",{maxBytes:5e5}),H(null);return}const $=re.current.find(w=>w.id===N)??null;T.current=$,k($),$&&(wn(Je,$.id,n),ie(c,$.id,{maxBytes:5e5}),H($))},[c,H,n]),y=a.useCallback(async N=>{const w=(await wr({name:N.name,memberAgentIds:N.memberAgentIds},n)).room;return u(v=>xt(v,w)),T.current=w,k(w),wn(Je,w.id,n),ie(c,w.id,{maxBytes:5e5}),await H(w),w},[c,H,n]),L=a.useCallback(async N=>{await Cr(N,n),u($=>$.filter(w=>w.id!==N)),ie(d(N),[],{maxBytes:5e5}),ie(f(N),[],{maxBytes:5e5}),T.current?.id===N&&(T.current=null,k(null),C([]),b([]),Ct(Je,n),ie(c,"",{maxBytes:5e5}))},[c,f,d,n]),P=a.useCallback(async(N,$)=>{const w=T.current,v=w?.id;if(!v)throw new Error(r("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const g=es(v,{warm:!1}),D=$?.files?.map(ue=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:ue.name,originalName:ue.name,mimeType:ue.type||"application/octet-stream",size:ue.size,createdAt:new Date().toISOString()})),Q=ii(v,N,D?.length?D:$?.attachments);T.current?.id===v&&b(ue=>{const me=[...ue,Q];return ie(d(v),me,{maxBytes:5e5}),me});let I=!1;try{const ue=[];if($?.files?.length)for(const ve of $.files)try{const we=await Sr(v,ve,n);ue.push(we.attachment)}catch{throw new Error(r("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:ve.name}))}const me=[...$?.attachments??[],...ue],xe=await kr(v,{content:N,...me.length?{attachments:me}:{}},n);I=!0,xe.message?.createdAt&&w&&u(ve=>xt(ve,{...w,updatedAt:xe.message.createdAt})),T.current?.id===v&&b(ve=>{const we=ua(ve,xe.message,Q.id);return ie(d(v),we,{maxBytes:5e5}),we});const le=await Wn(v,{limit:100,order:"desc"},n);if(ie(d(v),le.messages,{maxBytes:5e5}),T.current?.id!==v)return;b(le.messages),g.mark("hydrate")}catch(ue){let me=null;try{const le=await Wn(v,{limit:100,order:"desc"},n);me=le.messages,ie(d(v),le.messages,{maxBytes:5e5}),T.current?.id===v&&(b(le.messages),g.mark("hydrate"))}catch{T.current?.id===v&&b(le=>{const ve=le.filter(we=>we.id!==Q.id);return ie(d(v),ve,{maxBytes:5e5}),ve})}const xe=me?.some(le=>le.role==="user"&&le.content.trim()===Q.content.trim());if(I||xe){const le=ue instanceof Error&&ue.message.trim()?ue.message:r("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new Fa(le,v)}throw ue}finally{g.complete({source:"send-room-message"})}},[d,n]),Y=a.useCallback(async N=>{!N||!re.current.some($=>$.id===N)||(await Nr(N,n),ie(d(N),[],{maxBytes:5e5}),T.current?.id===N&&b([]))},[d,n]);return a.useEffect(()=>{F()},[F]),a.useEffect(()=>{const N=X.current,$=n?`/api/events?projectId=${encodeURIComponent(n)}`:"/api/events";return ja($,{onReconnect:()=>{zt({view:"useChatRooms",trigger:"sse-reconnect",projectId:n,replayAttempted:!1});const w=T.current?.id;if(w){const v=es(w,{warm:!0});v.mark("sse-reconnect-refresh"),F().finally(()=>v.complete({source:"sse-reconnect"}));return}F()},events:{"chat:room:created":w=>{if(X.current!==N)return;const v=Ue(w);v&&u(g=>xt(g,v))},"chat:room:updated":w=>{if(X.current!==N)return;const v=Ue(w);v&&(u(g=>xt(g,v)),T.current?.id===v.id&&k(v))},"chat:room:deleted":w=>{if(X.current!==N)return;const v=Ue(w);v?.id&&(u(g=>g.filter(D=>D.id!==v.id)),ie(d(v.id),[],{maxBytes:5e5}),ie(f(v.id),[],{maxBytes:5e5}),T.current?.id===v.id&&(T.current=null,k(null),C([]),b([]),Ct(Je,n),ie(c,"",{maxBytes:5e5})))},"chat:room:member:added":w=>{if(X.current!==N)return;const v=Ue(w);!v||T.current?.id!==v.roomId||C(g=>{if(g.some(Q=>Q.agentId===v.agentId))return g;const D=[...g,v];return ie(f(v.roomId),D,{maxBytes:5e5}),D})},"chat:room:member:removed":w=>{if(X.current!==N)return;const v=Ue(w);!v||T.current?.id!==v.roomId||C(g=>{const D=g.filter(Q=>Q.agentId!==v.agentId);return ie(f(v.roomId),D,{maxBytes:5e5}),D})},"chat:room:message:added":w=>{if(X.current!==N)return;const v=Ue(w);v&&(u(g=>{const D=g.find(Q=>Q.id===v.roomId);return D?xt(g,{...D,updatedAt:v.createdAt}):g}),T.current?.id===v.roomId&&b(g=>{const D=ua(g,v);return D===g?g:(ie(d(v.roomId),D,{maxBytes:5e5}),D)}))},"chat:room:message:updated":w=>{if(X.current!==N)return;const v=Ue(w);!v||T.current?.id!==v.roomId||b(g=>{const D=g.map(Q=>Q.id===v.id?v:Q);return ie(d(v.roomId),D,{maxBytes:5e5}),D})},"chat:room:message:deleted":w=>{if(X.current!==N)return;const v=Ue(w);v?.id&&b(g=>{const D=g.filter(I=>I.id!==v.id),Q=T.current?.id;return Q&&ie(d(Q),D,{maxBytes:5e5}),D})},"chat:room:messages:cleared":w=>{if(X.current!==N)return;const v=Ue(w);v?.roomId&&(ie(d(v.roomId),[],{maxBytes:5e5}),T.current?.id===v.roomId&&b([]),u(g=>{const D=g.find(Q=>Q.id===v.roomId);return D?xt(g,{...D,updatedAt:new Date().toISOString()}):g}))}}})},[c,f,d,n,F]),a.useEffect(()=>{S&&(i.some(N=>N.id===S.id)||(T.current=null,k(null),C([]),b([]),Ct(Je,n),ie(c,"",{maxBytes:5e5})))},[S,c,n,i]),{rooms:i,roomsLoading:_,roomsError:R,activeRoom:S,activeRoomMembers:E,messages:O,messagesLoading:W,selectRoom:G,createRoom:y,deleteRoom:L,sendRoomMessage:P,clearRoom:Y,refreshRooms:F}}const Pt={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},da=200;function os(n){if(!n)return null;const s=new Date(n).getTime();return Number.isFinite(s)?s:null}function La(n){const s=Object.entries(n);if(s.length<=da)return n;const r=s.map(([l,c])=>({id:l,timestamp:c,value:os(c)??0})).sort((l,c)=>c.value-l.value).slice(0,da);return Object.fromEntries(r.map(({id:l,timestamp:c})=>[l,c]))}function fn(n){if(!n)return{};try{const s=JSON.parse(n);if(!s||typeof s!="object")return{};const r={};for(const[l,c]of Object.entries(s))typeof l=="string"&&typeof c=="string"&&(r[l]=c);return La(r)}catch{return{}}}function ci(n){const[s,r]=a.useState(()=>{try{return fn(kt(Pt.direct,n))}catch{return{}}}),[l,c]=a.useState(()=>{try{return fn(kt(Pt.room,n))}catch{return{}}});a.useEffect(()=>{try{r(fn(kt(Pt.direct,n)))}catch{r({})}try{c(fn(kt(Pt.room,n)))}catch{c({})}},[n]);const d=a.useMemo(()=>({direct:s,room:l}),[s,l]),f=a.useCallback((R,p)=>{const S=La(p);try{wn(Pt[R],JSON.stringify(S),n)}catch{}return S},[n]),i=a.useCallback((R,p)=>{if(R==="direct"){r(S=>f(R,p(S)));return}c(S=>f(R,p(S)))},[f]),u=a.useCallback((R,p,S)=>{const k=os(S);if(k===null)return!1;const E=d[R][p],C=os(E);return C===null?!0:k>C},[d]),_=a.useCallback((R,p,S)=>{if(!p)return;const k=S??new Date().toISOString();i(R,E=>({...E,[p]:k}))},[i]),j=a.useCallback((R,p)=>{p.length!==0&&i(R,S=>{const k={...S};for(const E of p)E.id&&(k[E.id]=E.lastActivityAt??new Date().toISOString());return k})},[i]);return{isUnread:u,markRead:_,markAllRead:j}}const li=["AskUserQuestion","ask_user","ask_followup_question","request_user_input","elicit","ask_question","fn_ask_question"],ui=new Set(li.map(n=>n.toLowerCase()));function di(n){return ui.has(n.toLowerCase())}function mi(n){if(!di(n.toolName))return null;const s=Nt(n.args);if(!s)return null;const r=Array.isArray(s.questions)?s.questions:null,l=r?r.map((c,d)=>ma(c,d)).filter(fa):[ma(s,0)].filter(fa);return l.length>0?{questions:l}:null}function hi(n,s){return n.map(r=>{const l=s[r.id];return`> Q: ${r.question}
|
|
17
|
-
${vi(r,l)}`}).join(`
|
|
18
|
-
|
|
19
|
-
`)}function ma(n,s){const r=Nt(n);if(!r)return null;const l=$e(r.question,r.prompt,r.message,r.text,r.title);if(!l)return null;const c=bi(yi(r.options,r.choices,r.enum,r.values)),d=gi($e(r.type,r.questionType,r.inputType,r.responseType)),f=!!(r.multiSelect??r.multiselect??r.multiple??r.allowMultiple??r.multiple_choice);if((d==="single_select"||d==="multi_select")&&c.length===0)return null;const i=fi(r,c,d,f);return(i==="single_select"||i==="multi_select")&&c.length===0?null:{id:$e(r.id,r.name,r.key)??`q-${s}`,type:i,question:l,header:$e(r.header,r.heading)??void 0,description:$e(r.description,r.details,r.helpText)??void 0,options:c.length>0?c:void 0,multiSelect:i==="multi_select"?!0:f||void 0}}function fi(n,s,r,l){return r?r==="multi_select"&&s.length===0||r==="single_select"&&s.length===0?"text":r:pi(n,s)?"confirm":s.length>0?l?"multi_select":"single_select":"text"}function gi(n){if(!n)return null;const s=n.toLowerCase().replace(/[\s-]+/g,"_");return s==="text"||s==="free_text"||s==="input"?"text":s==="single_select"||s==="select"||s==="choice"?"single_select":s==="multi_select"||s==="multiple_select"||s==="checkbox"?"multi_select":s==="confirm"||s==="confirmation"||s==="boolean"||s==="yes_no"?"confirm":null}function pi(n,s){const r=$e(n.type,n.schemaType,n.inputType,n.responseType)?.toLowerCase().replace(/[\s-]+/g,"_");if(r==="boolean"||r==="confirm"||r==="confirmation"||r==="yes_no")return!0;const l=Nt(n.schema)??Nt(n.inputSchema)??Nt(n.parameters),c=$e(l?.type,l?.format)?.toLowerCase().replace(/[\s-]+/g,"_");if(c==="boolean"||c==="yes_no")return!0;if(s.length!==2)return!1;const d=s.map(f=>f.label.trim().toLowerCase());return d.includes("yes")&&d.includes("no")}function bi(n){return n?n.map((s,r)=>{const l=Nt(s);if(!l)return typeof s=="string"||typeof s=="number"||typeof s=="boolean"?{id:`opt-${r}`,label:String(s)}:null;const c=$e(l.label,l.text,l.name,l.title,l.value,l.id);return c?{id:$e(l.id,l.value,l.key)??`opt-${r}`,label:c,description:$e(l.description,l.details,l.helpText)??void 0}:null}).filter(xi):[]}function vi(n,s){if(s===void 0)return"(no answer)";if(n.type==="confirm")return s===!0?"Yes":"No";if(Array.isArray(s)){const r=s.map(l=>ha(n,l)).filter(Boolean);return r.length>0?r.join(", "):"(no answer)"}return n.type==="single_select"?ha(n,String(s))??String(s):String(s).trim()||"(no answer)"}function ha(n,s){return n.options?.find(r=>r.id===s)?.label??null}function Nt(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:null}function $e(...n){for(const s of n){if(typeof s=="string"&&s.trim().length>0)return s.trim();if(typeof s=="number"||typeof s=="boolean")return String(s)}return null}function yi(...n){return n.find(Array.isArray)??null}function fa(n){return n!==null}function xi(n){return n!==null}function wi({parsed:n,answered:s=!1,submittedAnswer:r,compact:l=!1,disabled:c=!1,onSubmit:d}){const{t:f}=De("app"),[i,u]=a.useState({}),_=a.useRef(new Map),j=a.useMemo(()=>n.questions.every(k=>Si(k,i[k.id])),[i,n.questions]);a.useLayoutEffect(()=>{for(const k of _.current.values())k.style.height="0",k.style.height=`${k.scrollHeight}px`},[i]);const R=a.useCallback((k,E)=>{u(C=>({...C,[k]:E}))},[]),p=a.useCallback((k,E,C)=>{u(O=>{const b=O[k],W=Array.isArray(b)?b:[];return{...O,[k]:C?[...W,E]:W.filter(U=>U!==E)}})},[]),S=a.useCallback(()=>{if(!j||s||c)return;const k=hi(n.questions,i);d(k,i)},[i,s,c,j,d,n.questions]);return e.jsxs("section",{className:`chat-question-response${l?" chat-question-response--compact":""}${s?" chat-question-response--answered":""}`,"data-testid":"chat-question-response","aria-label":f("chat.questionResponseLabel","Question from assistant"),children:[e.jsxs("div",{className:"chat-question-response__header",children:[e.jsx("span",{className:"chat-question-response__eyebrow",children:f("chat.questionResponseEyebrow","Assistant question")}),s&&e.jsx("span",{className:"chat-question-response__answered-label",children:f("chat.questionAnsweredLabel","Answered")})]}),e.jsx("div",{className:"chat-question-response__questions",children:n.questions.map((k,E)=>e.jsxs("article",{className:"chat-question-response__question",children:[k.header&&e.jsx("p",{className:"chat-question-response__question-header",children:k.header}),e.jsx("h4",{className:"chat-question-response__question-text",children:k.question}),k.description&&e.jsx("p",{className:"chat-question-response__description",children:k.description}),s?null:e.jsx(Ci,{question:k,questionIndex:E,value:i[k.id],disabled:c,setQuestionAnswer:R,toggleMultiSelect:p,textareaRefs:_})]},k.id))}),s?e.jsxs("div",{className:"chat-question-response__submitted","data-testid":"chat-question-response-submitted-answer",children:[e.jsx("span",{className:"chat-question-response__submitted-label",children:f("chat.questionSubmittedAnswerLabel","Submitted answer")}),e.jsx("pre",{children:r||f("chat.questionAnsweredWithoutContent","A later user reply answered this question.")})]}):e.jsxs("div",{className:"chat-question-response__actions",children:[e.jsx("p",{className:"chat-question-response__hint",children:f("chat.questionSelectHint","Answer all questions to continue the chat.")}),e.jsx("button",{type:"button",className:"btn btn-primary chat-question-response__submit","data-testid":"chat-question-response-submit",disabled:!j||c,onClick:S,children:f("chat.questionSubmit","Send answer")})]})]})}function Ci({question:n,questionIndex:s,value:r,disabled:l,setQuestionAnswer:c,toggleMultiSelect:d,textareaRefs:f}){const{t:i}=De("app");if(n.type==="text")return e.jsx("textarea",{className:"input chat-question-response__textarea","data-testid":`chat-question-response-text-${n.id}`,placeholder:i("chat.questionTextPlaceholder","Type your answer here…"),value:typeof r=="string"?r:"",disabled:l,rows:3,ref:p=>{p?f.current.set(n.id,p):f.current.delete(n.id)},onChange:p=>c(n.id,p.target.value)});if(n.type==="confirm")return e.jsxs("div",{className:"chat-question-response__confirm-group",role:"group","aria-label":n.question,children:[e.jsx("button",{type:"button",className:`btn chat-question-response__confirm${r===!0?" chat-question-response__confirm--selected":""}`,"data-testid":`chat-question-response-option-${n.id}-yes`,disabled:l,onClick:()=>c(n.id,!0),children:i("chat.questionConfirmYes","Yes")}),e.jsx("button",{type:"button",className:`btn chat-question-response__confirm${r===!1?" chat-question-response__confirm--selected":""}`,"data-testid":`chat-question-response-option-${n.id}-no`,disabled:l,onClick:()=>c(n.id,!1),children:i("chat.questionConfirmNo","No")})]});const u=n.options??[],_=Array.isArray(r)?r:[],j=`chat-question-${n.id}-${s}`,R=n.type==="multi_select";return e.jsx("div",{className:"chat-question-response__options",role:R?"group":"radiogroup","aria-label":n.question,children:u.map(p=>{const S=R?_.includes(p.id):r===p.id;return e.jsxs("label",{className:`chat-question-response__option${S?" chat-question-response__option--selected":""}`,"data-testid":`chat-question-response-option-${n.id}-${p.id}`,children:[e.jsx("input",{type:R?"checkbox":"radio",name:R?void 0:j,value:p.id,checked:S,disabled:l,onChange:k=>{R?d(n.id,p.id,k.target.checked):c(n.id,p.id)}}),e.jsxs("span",{className:"chat-question-response__option-content",children:[e.jsx("span",{className:"chat-question-response__option-label",children:p.label}),p.description&&e.jsx("span",{className:"chat-question-response__option-description",children:p.description})]})]},p.id)})})}function Si(n,s){return n.type==="text"?typeof s=="string"&&s.trim().length>0:n.type==="multi_select"?Array.isArray(s)&&s.length>0:n.type==="confirm"?typeof s=="boolean":typeof s=="string"&&s.trim().length>0}function ga(n){return n.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function Pa(n,s){const r=s.trim();if(!r)return!0;const l=ga(r);return ga(n).includes(l)||n.toLowerCase().includes(r.toLowerCase())}function pa({agents:n,filter:s,highlightedIndex:r,visible:l,onSelect:c,position:d="below",roomMemberIds:f,roomName:i}){const{t:u}=De("app"),_=a.useMemo(()=>n.filter(E=>Pa(E.name,s)),[n,s]),j=!!f,R=j&&s.trim().length>0,p=a.useMemo(()=>j?_.filter(E=>f?.has(E.id)):_,[_,f,j]),S=a.useMemo(()=>j?_.filter(E=>!f?.has(E.id)):[],[_,f,j]),k=R?[...p,...S]:p;return l?e.jsx("div",{className:`agent-mention-popup agent-mention-popup--${d}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":u("agentMention.suggestionsLabel","Agent mention suggestions"),children:k.length===0?e.jsx("div",{className:"agent-mention-empty",children:u("agentMention.noAgentsFound","No agents found")}):e.jsxs(e.Fragment,{children:[j&&e.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:i?u("agentMention.membersOf","Members of #{{roomName}}",{roomName:i}):u("agentMention.roomMembers","Room members")}),p.map((E,C)=>e.jsxs("button",{type:"button",className:`agent-mention-item${C===r?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${E.id}`,onMouseDown:O=>O.preventDefault(),onClick:()=>c(E),role:"option","aria-selected":C===r,children:[e.jsx(Cn,{agent:E,size:20}),j&&e.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":u("agentMention.roomMemberBadge","Room member")}),e.jsx("span",{className:"agent-mention-name",children:E.name}),e.jsx("span",{className:"agent-mention-role",children:E.role})]},E.id)),j&&!R&&S.length>0&&e.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:u("agentMention.typeToSearch","Type to search other agents")}),j&&R&&S.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:u("agentMention.otherAgents","Other agents")}),S.map((E,C)=>{const O=p.length+C;return e.jsxs("button",{type:"button",className:`agent-mention-item${O===r?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${E.id}`,onMouseDown:b=>b.preventDefault(),onClick:()=>c(E),role:"option","aria-selected":O===r,children:[e.jsx(Cn,{agent:E,size:20}),e.jsx("span",{className:"agent-mention-name",children:E.name}),e.jsx("span",{className:"agent-mention-role",children:E.role})]},E.id)})]})]})}):null}function ki(n,s){return n+s}function Ni({visible:n,position:s,tasks:r,files:l,selectedIndex:c,onSelectTask:d,onSelectFile:f,loading:i}){const{t:u}=De("app");if(!n)return null;const _=r.length>0,j=l.length>0;return e.jsxs("div",{className:"file-mention-popup",style:{top:s.top,left:s.left},"data-testid":"file-mention-popup",onMouseDown:R=>{R.preventDefault()},children:[i&&e.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:e.jsx("span",{className:"spinner"})}),!i&&!_&&!j&&e.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:u("fileMention.empty","No tasks or files found")}),!i&&(_||j)&&e.jsxs("div",{className:"file-mention-popup-groups",children:[_&&e.jsxs("div",{className:"file-mention-popup-group",children:[e.jsx("div",{className:"file-mention-popup-group-header",children:u("fileMention.taskHeader","Tasks")}),e.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":u("fileMention.taskMatches","Task matches"),children:r.map((R,p)=>{const S=p;return e.jsxs("li",{className:`file-mention-popup-item${S===c?" file-mention-popup-item--selected":""}`,onClick:()=>d(R),role:"option","aria-selected":S===c,"data-testid":`task-mention-item-${S}`,children:[e.jsx("span",{className:"file-mention-popup-icon",children:e.jsx(Da,{})}),e.jsxs("div",{className:"file-mention-popup-info",children:[e.jsxs("div",{className:"file-mention-popup-task-row",children:[e.jsx("span",{className:"file-mention-popup-task-id",children:R.id}),e.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${R.column}`,children:R.column})]}),e.jsx("span",{className:"file-mention-popup-item-path",children:R.title})]})]},R.id)})})]}),j&&e.jsxs("div",{className:"file-mention-popup-group",children:[e.jsx("div",{className:"file-mention-popup-group-header",children:u("fileMention.fileHeader","Files")}),e.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":u("fileMention.fileMatches","File matches"),children:l.map((R,p)=>{const S=ki(r.length,p),k=Mr(R.path);return e.jsxs("li",{className:`file-mention-popup-item${S===c?" file-mention-popup-item--selected":""}`,onClick:()=>f(R),role:"option","aria-selected":S===c,"data-testid":`file-mention-item-${S}`,children:[e.jsx("span",{className:"file-mention-popup-icon",children:e.jsx(Ta,{})}),e.jsxs("div",{className:"file-mention-popup-info",children:[e.jsx("span",{className:"file-mention-popup-item-name",children:R.name}),k&&e.jsx("span",{className:"file-mention-popup-item-path",children:k})]})]},R.path)})})]})]})]})}function Mi(n,s=[],r){const l=n.trim().replace(/^#/,""),c=(f,i)=>r?r(f,i):i;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 d=l.toLowerCase();return d.length>80?{ok:!1,error:c("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(d)?/^[-_]|[-_]$/.test(d)?{ok:!1,error:c("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:s.some(f=>f.toLowerCase()===d)?{ok:!1,error:c("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:d}:{ok:!1,error:c("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function Ri({isOpen:n,onClose:s,onCreate:r,projectId:l,existingRoomNames:c=[]}){const{t:d}=De("app"),[f,i]=a.useState(""),[u,_]=a.useState([]),[j,R]=a.useState(""),[p,S]=a.useState([]),[k,E]=a.useState(!1),[C,O]=a.useState(null),[b,W]=a.useState(!1),U=a.useRef(null),re=a.useRef(null);a.useEffect(()=>{n&&(re.current=document.activeElement instanceof HTMLElement?document.activeElement:null,E(!0),O(null),Rr(void 0,l).then(y=>_(y)).catch(()=>{_([]),O(d("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>E(!1)))},[n,l]),a.useEffect(()=>{if(!n){i(""),R(""),S([]),O(null),W(!1);return}const y=window.requestAnimationFrame(()=>U.current?.focus());return()=>window.cancelAnimationFrame(y)},[n]),a.useEffect(()=>{if(!n)return;const y=L=>{L.key==="Escape"&&s()};return document.addEventListener("keydown",y),()=>document.removeEventListener("keydown",y)},[n,s]),a.useEffect(()=>{n||re.current?.focus()},[n]);const T=a.useMemo(()=>Mi(f,c,d),[f,c,d]),X=a.useMemo(()=>{const y=j.trim().toLowerCase();return y?u.filter(L=>L.name.toLowerCase().includes(y)):u},[u,j]),z=a.useMemo(()=>u.filter(y=>p.includes(y.id)),[u,p]),H=T.ok&&p.length>0&&!b&&!k;if(!n)return null;const F=y=>{b||S(L=>L.includes(y)?L.filter(P=>P!==y):[...L,y])},G=async()=>{if(!T.ok){O(T.error);return}if(p.length===0){O(d("createRoom.selectMember","Select at least one member."));return}O(null),W(!0);try{await r({name:T.name,displayName:`#${T.name}`,memberAgentIds:p}),s()}catch(y){O(y instanceof Error?y.message:d("createRoom.failedCreate","Failed to create room."))}finally{W(!1)}};return cr.createPortal(e.jsx("div",{className:"modal-overlay open",onClick:y=>y.target===y.currentTarget&&s(),children:e.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":d("createRoom.title","Create room"),onClick:y=>y.stopPropagation(),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:d("createRoom.title","Create room")}),e.jsx("button",{type:"button",className:"modal-close","aria-label":d("actions.close","Close"),onClick:s,children:"×"})]}),e.jsxs("div",{className:"form-group create-room-modal-name-group",children:[e.jsx("label",{htmlFor:"create-room-name",children:d("createRoom.nameLabel","Room name")}),e.jsxs("div",{className:"create-room-modal-name-field",children:[e.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),e.jsx("input",{ref:U,id:"create-room-name",className:"input",value:f,disabled:b,onChange:y=>{const L=y.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();i(L)}})]}),!T.ok&&e.jsx("div",{className:"form-error",children:T.error})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"create-room-member-search",children:d("createRoom.members","Members")}),e.jsx("input",{id:"create-room-member-search",className:"input",placeholder:d("createRoom.searchAgents","Search agents"),value:j,disabled:b,onChange:y=>R(y.target.value)})]}),z.length>0&&e.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:z.map(y=>e.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>F(y.id),disabled:b,children:[y.name," ×"]},y.id))}),e.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:k?e.jsx("div",{className:"create-room-modal-empty",children:e.jsx(Ar,{label:d("createRoom.loadingAgents","Loading agents...")})}):X.length===0?e.jsx("div",{className:"create-room-modal-empty",children:u.length===0?d("createRoom.noAgents","No agents in this project yet."):d("createRoom.noMatch","No agents match your search.")}):X.map(y=>{const L=p.includes(y.id);return e.jsxs("button",{type:"button",className:`create-room-modal-member-row${L?" create-room-modal-member-row--selected":""}`,onClick:()=>F(y.id),disabled:b,children:[e.jsx(Cn,{agent:y,size:20}),e.jsx("span",{children:y.name}),e.jsx("span",{className:"create-room-modal-member-role",children:y.role})]},y.id)})}),C&&e.jsx("div",{className:"form-group",children:e.jsx("div",{className:"form-error",children:C})}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:s,disabled:b,children:d("actions.cancel","Cancel")}),e.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void G(),disabled:!H,children:b?d("createRoom.creating","Creating..."):d("createRoom.create","Create room")})]})]})}),document.body)}function Ai({cliSessionId:n,tier:s,projectId:r,renderTranscript:l,renderComposer:c,queuedCount:d=0,terminalProps:f}){const{t:i}=De("app"),u=s==="generic",[_,j]=a.useState(u?"terminal":"transcript");if(u)return e.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:e.jsx(ra,{sessionId:n,projectId:r,...f})});const R=_==="terminal";return e.jsxs("div",{className:"cli-chat-surface","data-tier":s,"data-view":_,children:[e.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":i("cliChat.viewToggleLabel","Chat view"),children:[e.jsxs("button",{type:"button",role:"tab","aria-selected":!R,className:`cli-chat-surface__tab${R?"":" is-active"}`,onClick:()=>j("transcript"),children:[e.jsx(vn,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:i("cliChat.transcriptTab","Transcript")})]}),e.jsxs("button",{type:"button",role:"tab","aria-selected":R,className:`cli-chat-surface__tab${R?" is-active":""}`,onClick:()=>j("terminal"),children:[e.jsx(jr,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:i("cliChat.terminalTab","Terminal")})]})]}),e.jsx("div",{className:"cli-chat-surface__body",children:R?e.jsx(ra,{sessionId:n,projectId:r,...f}):l()}),!R&&e.jsxs("div",{className:"cli-chat-surface__composer",children:[d>0&&e.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:i("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:d})}),c()]})]})}const ji=200,Ti=8,Ei=8;function ba(){return new DOMException("The operation was aborted.","AbortError")}function va(n,s){return s.aborted?Promise.reject(ba()):new Promise((r,l)=>{const c=()=>l(ba());s.addEventListener("abort",c,{once:!0}),n.then(d=>{s.removeEventListener("abort",c),r(d)},d=>{s.removeEventListener("abort",c),l(d)})})}function ya(n,s,r){const l=n.slice(0,s),c=n.slice(s+1),d=c.match(/[\s]|$/),f=d?d.index??c.length:c.length,i=c.slice(f);return`${l}${r}${i}`}function _i(n={}){const{projectId:s,workspace:r="project"}=n,[l,c]=a.useState(!1),[d,f]=a.useState(""),[i,u]=a.useState(-1),[_,j]=a.useState([]),[R,p]=a.useState([]),[S,k]=a.useState(!1),[E,C]=a.useState(0),O=a.useRef(null),b=a.useRef(null),W=[..._.map(F=>({kind:"task",task:F})),...R.map(F=>({kind:"file",file:F}))];a.useEffect(()=>()=>{O.current&&clearTimeout(O.current),b.current?.abort()},[]);const U=a.useCallback((F,G)=>{if(G<0||G>F.length){c(!1);return}const y=L=>/[a-zA-Z0-9/_.-]/.test(L);for(let L=G-1;L>=0;L--){if(F[L]==="#"){if(L===0){const Y=F.slice(L+1,G);u(L),f(Y),C(0),c(!0);return}const P=F[L-1];if(/[\s,.;:!?'"()[\]{}]/.test(P)){const Y=F.slice(L+1,G);u(L),f(Y),C(0),c(!0);return}c(!1);return}if(!y(F[L])){c(!1);return}}c(!1)},[]),re=a.useCallback(()=>{b.current?.abort(),c(!1),f(""),u(-1),j([]),p([]),C(0),k(!1)},[]),T=a.useCallback(async F=>{if(!F.trim()){j([]),p([]),k(!1);return}b.current?.abort();const G=new AbortController;b.current=G;try{k(!0);const[y,L]=await Promise.allSettled([va(Tr(20,0,s,F),G.signal),va(Er(F,r,s),G.signal)]);if(G.signal.aborted)return;const P=y.status==="fulfilled"?y.value.slice(0,Ti).map(N=>({id:N.id,title:N.title??"",column:N.column})):[],Y=L.status==="fulfilled"?L.value.files.slice(0,Ei):[];j(P),p(Y),C(0)}catch(y){y.name!=="AbortError"&&(j([]),p([]))}finally{G.signal.aborted||k(!1)}},[r,s]);a.useEffect(()=>{if(l)return O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{T(d)},ji),()=>{O.current&&clearTimeout(O.current)}},[d,l,T]);const X=a.useCallback((F,G)=>!l||i<0?G:ya(G,i,`#${F.id}`),[l,i]),z=a.useCallback((F,G)=>!l||i<0?G:ya(G,i,`#${F.path}`),[l,i]),H=a.useCallback((F,G)=>{if(!l||W.length===0)return!1;switch(F.key){case"ArrowDown":return F.preventDefault(),C(y=>Math.min(y+1,W.length-1)),!0;case"ArrowUp":return F.preventDefault(),C(y=>Math.max(y-1,0)),!0;case"Enter":case"Tab":return W[E]?(F.preventDefault(),!0):!1;case"Escape":return F.preventDefault(),re(),!0;default:return!1}},[l,W,E,re]);return{mentionActive:l,tasks:_,files:R,combinedItems:W,loading:S,mentionQuery:d,selectedIndex:E,setSelectedIndex:C,detectMention:U,selectTask:X,selectFile:z,dismissMention:re,handleKeyDown:H}}const ts=new Map,yn=new Map;function ms(n){return n??"global"}function cs(n){return`${at.DISCOVERED_SKILLS_PREFIX}${ms(n)}`}function wt(n){return Ze(cs(n),{maxAgeMs:rs})}function $i(n,s){for(const r of yn.get(n)??[])r(s)}async function Di(n){const s=ms(n),r=ts.get(s);if(r)return r;const l=_r(n).finally(()=>{ts.delete(s)});return ts.set(s,l),l}function Fi(n){const[s,r]=a.useState(()=>wt(n)??[]),[l,c]=a.useState(()=>wt(n)===null),d=a.useRef(wt(n)!==null),f=ms(n);a.useEffect(()=>{const _=wt(n)??[];r(_),c(wt(n)===null),d.current=wt(n)!==null},[n]),a.useEffect(()=>{const _=yn.get(f)??new Set;return _.add(r),yn.set(f,_),()=>{_.delete(r),_.size===0&&yn.delete(f)}},[f]);const i=a.useCallback(async()=>{try{const _=await Di(n);d.current=!0,ie(cs(n),_,{maxBytes:5e5}),$i(f,_)}catch{d.current||bn(cs(n))}finally{c(!1)}},[n,f]);a.useEffect(()=>{i()},[i]);const u=a.useCallback(async()=>{c(!0),await i()},[i]);return{skills:s,loading:l,refresh:u}}function Li(n,s){const r=n.reduce((l,c)=>l+(c.content?.length??0),0)+(s?.length??0);return Math.ceil(r/4)}function xa(n){if(!Number.isFinite(n)||n<=0)return"0";if(n<1e3)return String(Math.round(n));const s=n/1e3;return s<10?`~${Number(s.toFixed(1))}k`:`${Math.round(s)}k`}const hs=640,Pi=200,wa="__SKIP__";let ns=!1;function Ii(n,s=hs){return n>s?"auto":"hidden"}function Oi(n,s=hs){return Math.max(40,Math.min(n,s))}function Ia(n,s){const r=new Date(n),c=new Date().getTime()-r.getTime(),d=Math.floor(c/1e3),f=Math.floor(d/60),i=Math.floor(f/60),u=Math.floor(i/24);return d<60?s("chat.relativeTimeJustNow","just now"):f<60?s("chat.relativeTimeMinutes","{{count}}m ago",{count:f}):i<24?s("chat.relativeTimeHours","{{count}}h ago",{count:i}):u<7?s("chat.relativeTimeDays","{{count}}d ago",{count:u}):r.toLocaleDateString()}function Ca(n,s){if(!n||!s)return null;const r=s.toLowerCase();if(r.includes("claude")){let c=s.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(r.includes("gpt")||r.includes("openai")){const c=s.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(r.includes("gemini")){const c=s.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=s.replace(/-/g," ").replace(/^\w/,c=>c.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function xn(n,s){return n.length<=s?n:`${n.slice(0,s)}…`}function zi(n){if(!n)return null;const s=Object.entries(n);return s.length===0?null:s.map(([r,l])=>{const c=typeof l=="string"?l:(()=>{try{return JSON.stringify(l)}catch{return String(l)}})();return`${r}=${xn(c,50)}`}).join(", ")}function Bi(n){if(n===void 0)return null;if(typeof n=="string")return xn(n,200);try{return xn(JSON.stringify(n),200)}catch{return xn(String(n),200)}}function Hi(n){if(!n)return null;if(n.kind==="mailbox"||n.kind==="mailbox-message"){const s=typeof window>"u"?"/":window.location.pathname||"/",r=new URLSearchParams(typeof window>"u"?"":window.location.search);return r.set("view","mailbox"),r.set("mailbox-message",n.id),`${s}?${r.toString()}#message-${encodeURIComponent(n.id)}`}return null}function Ui(n,s){if(!n)return null;const r=n.label??`${n.kind} ${n.id}`,l=Hi(n),c=`chat-failure-reference-${n.kind}-${n.id}`.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase();return e.jsxs("div",{className:"chat-message-failure-reference",children:[e.jsx("span",{className:"chat-message-failure-reference-label",children:s("chat.failureReferenceLabel","Reference")}),e.jsx("span",{className:"chat-message-failure-reference-value",children:r}),l?e.jsx("a",{className:"btn btn-sm chat-message-failure-reference-link",href:l,children:s("chat.openMailboxMessage","Open mailbox message")}):e.jsxs("details",{className:"chat-message-failure-reference-details",children:[e.jsx("summary",{className:"btn btn-sm chat-message-failure-reference-link",children:s("chat.viewFailureDetails","View failure details")}),e.jsxs("dl",{className:"chat-message-failure-reference-meta",id:c,children:[e.jsxs("div",{children:[e.jsx("dt",{children:s("chat.failureReferenceKind","Kind")}),e.jsx("dd",{children:n.kind})]}),e.jsxs("div",{children:[e.jsx("dt",{children:s("chat.failureReferenceId","ID")}),e.jsx("dd",{children:n.id})]}),n.label&&e.jsxs("div",{children:[e.jsx("dt",{children:s("chat.failureReferenceMetaLabel","Label")}),e.jsx("dd",{children:n.label})]})]})]})]})}function Oa(n,s,r){if(!n||n.length===0)return null;const l=(S,k)=>{const E=mi(S);if(E){const T=r?.isAwaitingAnswer===!0;return e.jsx(wi,{parsed:E,answered:!T,submittedAnswer:r?.submittedAnswer,disabled:!T,onSubmit:(X,z)=>r?.onQuestionSubmit?.(X,z)},`${S.toolName}-${k}`)}const C=S.status==="running",O=S.status==="completed"&&S.isError,b=zi(S.args),W=Bi(S.result),U=C?b:W?`${s("chat.toolCallResultPrefix","result")}: ${W}`:b?`${s("chat.toolCallArgsPrefix","args")}: ${b}`:null,re=C?s("chat.toolCallStatusRunning","running"):O?s("chat.toolCallStatusError","error"):s("chat.toolCallStatusCompleted","completed");return e.jsxs("details",{className:`chat-tool-call${C?" chat-tool-call--running":""}${O?" chat-tool-call--error":""}`,open:C,children:[e.jsxs("summary",{children:[e.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),e.jsx("span",{className:"chat-tool-call-name",title:S.toolName,children:S.toolName}),U&&e.jsx("span",{className:"chat-tool-call-preview",title:U,children:U}),e.jsx("span",{className:"chat-tool-call-status-text",children:re})]}),e.jsxs("div",{className:"chat-tool-call-content",children:[b&&e.jsxs("div",{className:"chat-tool-call-row",children:[e.jsx("span",{className:"chat-tool-call-label",children:s("chat.toolCallArgsPrefix","args")}),e.jsx("span",{className:"chat-tool-call-value",children:b})]}),W&&e.jsxs("div",{className:`chat-tool-call-row${O?" chat-tool-call-row--error":""}`,children:[e.jsx("span",{className:"chat-tool-call-label",children:s("chat.toolCallResultPrefix","result")}),e.jsx("span",{className:"chat-tool-call-value",children:W})]})]})]},`${S.toolName}-${k}`)},c="chat-tool-calls";if(n.length===1)return e.jsxs("div",{className:c,"data-testid":"chat-tool-calls",children:[e.jsxs("div",{className:"chat-tool-calls-header",children:[e.jsx(ia,{size:12,"aria-hidden":"true"}),e.jsx("span",{children:s("chat.toolCallsHeader","Tool calls")})]}),l(n[0],0)]});const d=n.filter(S=>S.status==="running").length,f=n.filter(S=>S.status==="completed"&&S.isError).length,i=d>0,u=Array.from(new Set(n.map(S=>S.toolName))),_=u.slice(0,5),j=Math.max(0,u.length-_.length),R=j>0?`${_.join(", ")}, +${j} more`:_.join(", "),p=i?`(${d} ${s("chat.toolCallStatusRunning","running")})`:f>0?`(${f} ${f===1?s("chat.toolCallStatusError","error"):s("chat.toolCallStatusErrors","errors")})`:null;return e.jsx("div",{className:c,"data-testid":"chat-tool-calls",children:e.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:i,children:[e.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[e.jsx(ia,{size:12,"aria-hidden":"true"}),e.jsx("span",{className:"chat-tool-calls-count",children:s("chat.toolCallsCount","{{count}} tool calls",{count:n.length})}),e.jsx("span",{className:"chat-tool-calls-names",title:R,children:R}),p&&e.jsx("span",{className:"chat-tool-calls-group-status",children:p})]}),n.map((S,k)=>l(S,k))]})})}const za={p:({children:n,...s})=>e.jsx("p",{...s,children:sa(n)}),li:({children:n,...s})=>e.jsx("li",{...s,children:sa(n)}),pre:({children:n,...s})=>e.jsx("pre",{...s,className:"chat-markdown-pre",children:n}),code:({children:n,...s})=>{const r=typeof n=="string"?n:lr.Children.toArray(n).join(""),l=Sn(r);return l.length===1&&typeof l[0]=="string"?e.jsx("code",{...s,children:n}):e.jsx("code",{...s,children:l})},table:({children:n,...s})=>e.jsx("table",{...s,className:"chat-markdown-table",children:n})},St="__fn_agent__",qi=280,gn=180,pn=500,Sa="fusion:chat-sidebar-width",ss="fusion:chat-scope",Ki="fusion:chat-draft:";function ka(n,s){return s?`${Ki}${n}:${s}`:null}function Na(n){if(!n)return"";try{return localStorage.getItem(n)??""}catch{return""}}const Gi=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function Ma(n){const s=/(^|[\s])\/([^\s]*)$/.exec(n);if(!s)return null;const r=s[1]??"",l=s[2]??"",c=s.index+r.length;return{filter:l,start:c,end:n.length}}function Vi(n,s){const r=n.slice(0,s),l=/(^|[\s\n])@([\w-]*)$/.exec(r);if(!l)return null;const c=l[2]??"",d=r.length-c.length-1;return{filter:c,start:d,end:s}}function Qi(n){const s=n?.runtimeConfig;if(!s||typeof s!="object")return null;const r=Reflect.get(s,"modelProvider"),l=Reflect.get(s,"modelId");return typeof r!="string"||r.trim().length===0||typeof l!="string"||l.trim().length===0?null:{provider:r,modelId:l}}function Ra(n,s,r){if(n?.modelProvider&&n?.modelId)return{provider:n.modelProvider,modelId:n.modelId};const l=Qi(s??void 0);return l||(r.provider&&r.modelId?{provider:r.provider,modelId:r.modelId}:null)}function Wi({projectId:n,defaultModel:s,onClose:r,onCreate:l}){const{t:c}=De("app"),[d,f]=a.useState("agent"),{agents:i,loading:u}=us(n),[_,j]=a.useState(""),{models:R,favoriteProviders:p,favoriteModels:S,loading:k,refresh:E}=Ea(),C=s.provider&&s.modelId?`${s.provider}/${s.modelId}`:"",[O,b]=a.useState(C),[W,U]=a.useState(p),[re,T]=a.useState(S);a.useEffect(()=>{U(p)},[p]),a.useEffect(()=>{T(S)},[S]),a.useEffect(()=>{C&&b(y=>y||C)},[C]);const X=a.useCallback(async y=>{const L=W,Y=L.includes(y)?L.filter(N=>N!==y):[y,...L];U(Y);try{await aa({favoriteProviders:Y,favoriteModels:re}),await E()}catch{U(L)}},[W,re,E]),z=a.useCallback(async y=>{const L=re,Y=L.includes(y)?L.filter(N=>N!==y):[y,...L];T(Y);try{await aa({favoriteProviders:W,favoriteModels:Y}),await E()}catch{T(L)}},[re,W,E]),H=O||C,F=y=>{if(y.preventDefault(),d==="agent"){if(!_)return;l({agentId:_});return}if(!H)return;const L=H.indexOf("/");if(L<=0)return;const P=H.slice(0,L),Y=H.slice(L+1);l({agentId:St,modelProvider:P,modelId:Y})},G=d==="agent"?!_:!H;return e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:y=>y.stopPropagation(),children:[e.jsx("h3",{children:c("chat.newChatTitle","New Chat")}),e.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{f("agent")},children:c("chat.newChatModeAgent","Agent")}),e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{f("model"),j(""),b(y=>y||C)},children:c("chat.newChatModeModel","Model")})]}),e.jsxs("form",{onSubmit:F,children:[d==="agent"&&e.jsxs("label",{className:"chat-new-dialog-model-label",children:[c("chat.newChatModeAgent","Agent"),u?e.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingAgents","Loading agents...")}):i.length===0?e.jsx("div",{className:"chat-new-dialog-empty",children:c("chat.noAgentsAvailable","No agents available")}):e.jsx("div",{className:"chat-new-dialog-agent-list",children:i.map(y=>e.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${_===y.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>j(y.id),"data-testid":`agent-option-${y.id}`,children:[e.jsx(Ot,{size:16}),e.jsx("span",{className:"chat-new-dialog-agent-name",children:y.name}),e.jsx("span",{className:"chat-new-dialog-agent-role",children:y.role})]},y.id))})]}),d==="model"&&e.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:k?e.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingModels","Loading models...")}):e.jsx(Qr,{models:R,value:O,onChange:b,label:c("chat.newChatModeModel","Model"),placeholder:c("chat.selectModel","Select a model"),favoriteProviders:W,onToggleFavorite:X,favoriteModels:re,onToggleModelFavorite:z})}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:c("chat.cancel","Cancel")}),e.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:G,children:c("chat.create","Create")})]})]})]})})}function Aa(n,s){return n.slice(s+1).find(r=>r.role==="user")?.content}const as=a.memo(function({message:s,forcePlain:r,agentName:l,hideAssistantIdentity:c,showAssistantModelTag:d,activeModelTag:f,activeModelProvider:i,activeSessionId:u,mentionAgentsByName:_,roomContext:j,copyAction:R,onScrollToTop:p,isAwaitingQuestionAnswer:S,submittedQuestionAnswer:k,onQuestionSubmit:E}){const{t:C}=De("app"),O=s.role==="assistant",b=O?s.failureInfo:void 0,W=O&&(!c||!!b),U=a.useMemo(()=>{if(O)return null;const X=s.content,z=/@([\w-]+)/g,H=[];let F=0,G=z.exec(X);for(;G;){const[y,L=""]=G,P=G.index;P>F&&H.push(X.slice(F,P));const Y=L.replace(/_/g," ").toLowerCase(),N=_.get(Y);if(N){const $=!!(j&&!j.memberIds.has(N.id)),w=$?C("chat.mentionNonMember","Not a member of {{roomName}}",{roomName:j?.roomName}):void 0;H.push(e.jsxs("span",{className:`chat-mention-chip${$?" chat-mention-chip--non-member":""}`,title:w,"aria-label":w,children:["@",N.name.replace(/\s+/g,"_")]},`${N.id}-${P}`))}else H.push(y);F=P+y.length,G=z.exec(X)}return F<X.length&&H.push(X.slice(F)),H.length===0?X:H},[O,s.content,_,j]),re=a.useMemo(()=>{const X=s.attachments;if(!X||X.length===0)return null;const z=s.roomId?`/api/chat/rooms/${encodeURIComponent(s.roomId)}/attachments/`:u?`/api/chat/sessions/${encodeURIComponent(u)}/attachments/`:null;return z?e.jsx("div",{className:"chat-message-attachments",children:X.map(H=>{const F=H.mimeType.startsWith("image/"),G=H.id||H.filename,y=`${z}${encodeURIComponent(H.filename)}`;return F?e.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:e.jsx("img",{className:"chat-message-attachment",src:y,alt:H.originalName})},G):e.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:[e.jsx(Ta,{size:14}),e.jsx("span",{children:H.originalName})]},G)})}):null},[s.attachments,s.roomId,u]),T=a.useMemo(()=>O?b?e.jsxs("div",{className:"chat-message-content chat-message-content--failure",children:[e.jsxs("div",{className:"chat-message-failure-summary-row",children:[e.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),e.jsx("span",{className:"chat-message-failure-label",children:C("chat.responseFailed","Response failed")})]}),e.jsx("div",{className:"chat-message-failure-summary",children:b.summary}),(b.errorClass||b.code)&&e.jsxs("div",{className:"chat-message-failure-badges",children:[b.errorClass&&e.jsx("span",{className:"chat-message-failure-badge",children:b.errorClass}),b.code&&e.jsx("span",{className:"chat-message-failure-badge",children:b.code})]}),(b.detail||b.reference)&&e.jsxs("details",{className:"chat-message-failure-details",children:[e.jsxs("summary",{children:[e.jsx(Gr,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:C("chat.failureDetails","Failure details")})]}),b.detail&&e.jsx("pre",{className:"chat-message-failure-detail",children:Sn(b.detail)}),Ui(b.reference,C)]})]}):r?e.jsx("div",{className:"chat-message-content chat-message-content--plain",children:s.content}):e.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:e.jsx(_a,{remarkPlugins:[$a],components:za,children:s.content})}):null,[b,r,O,s.content]);return e.jsxs("div",{className:`chat-message chat-message--${s.role}${b?" chat-message--failure":""}`,"data-testid":`chat-message-${s.id}`,"data-message-id":s.id,children:[W&&e.jsxs("div",{className:"chat-message-avatar",children:[i?e.jsx(It,{provider:i,size:"sm"}):e.jsx(Ot,{size:14}),e.jsx("span",{children:l}),d&&f&&e.jsx("span",{className:"chat-model-tag",children:f})]}),O?T:e.jsx("div",{className:"chat-message-content",children:U}),O&&!b&&(R||p)&&e.jsxs("div",{className:"chat-message-actions",children:[R,p&&e.jsx("button",{type:"button",className:"btn-icon chat-message-scroll-to-top-action","aria-label":C("chat.scrollMessageToTop","Scroll message to top"),"data-testid":`chat-message-scroll-to-top-${s.id}`,onClick:()=>p(s.id),children:e.jsx(Xr,{size:14})})]}),Oa(s.toolCalls,C,{isAwaitingAnswer:S,submittedAnswer:k,onQuestionSubmit:E}),s.thinkingOutput&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:C("chat.thinking","Thinking")}),e.jsx("pre",{className:"chat-message-thinking-content",children:Sn(s.thinkingOutput)})]}),re,e.jsx("div",{className:"chat-message-time",children:Ia(s.createdAt,C)})]})});function ao({projectId:n,addToast:s,floating:r=!1,onPopOut:l,onMaximize:c,onMinimize:d,onClose:f}){const{t:i}=De("app");a.useEffect(()=>(zt({view:"ChatView",trigger:ns?"route-active":"remount",projectId:n,replayAttempted:!1}),ns=!1,()=>{ns=!0,zt({view:"ChatView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{activeSession:u,sessionsLoading:_,messages:j,messagesLoading:R,isStreaming:p,streamingText:S,streamingThinking:k,streamingToolCalls:E,selectSession:C,createSession:O,archiveSession:b,renameSession:W,deleteSession:U,sendMessage:re,stopStreaming:T,pendingMessages:X,clearPendingMessage:z,loadMoreMessages:H,hasMoreMessages:F,searchQuery:G,setSearchQuery:y,filteredSessions:L,agentsMap:P}=ai(n,s),[Y,N]=a.useState(!1),$=!0,[w,v]=a.useState(()=>{try{if(localStorage.getItem(ss)==="rooms"&&$)return"rooms"}catch{}return"direct"}),g=oi(n,s),{isUnread:D,markRead:Q}=ci(n),[I,ue]=a.useState(()=>{const t=ka(w,w==="rooms"?g.activeRoom?.id:u?.id);return Na(t)}),[me,xe]=a.useState(null),[le,ve]=a.useState(null),[we,qe]=a.useState(""),[et,ge]=a.useState(null),[tt,rt]=a.useState(null),[fe,Ee]=a.useState(!0),[he,Ke]=a.useState(qi),[kn,it]=a.useState(!1),{agentsMap:Bt}=us(n),Te=a.useMemo(()=>P.size>0?P:Bt,[Bt,P]),{models:Ht,defaultProvider:Ut,defaultModelId:Mt}=Ea(),ot=a.useMemo(()=>({provider:Ut,modelId:Mt}),[Mt,Ut]),{skills:ct,loading:qt}=Fi(n),[Ge,h]=a.useState(!1),[x,A]=a.useState(""),[K,se]=a.useState(0),[q,J]=a.useState(""),[V,te]=a.useState(!1),[oe,ne]=a.useState(0),[ee,de]=a.useState(-1),[pe,Ve]=a.useState(!1),[Re,Nn]=a.useState([]),[fs,lt]=a.useState(!1),[gs,Kt]=a.useState(!1),[ut,ps]=a.useState({}),[Gt,Qe]=a.useState(!1),[Vt,Rt]=a.useState(!1),{pushNav:bs}=$r(),[,Qt]=a.useState(!1),[Ba,Ha]=a.useState({top:0,left:0}),ce=_i({projectId:n}),Mn=a.useCallback(t=>{if(!t||!ce.mentionActive)return;const o=t.getBoundingClientRect();Ha({top:o.top-260,left:o.left+8})},[ce.mentionActive]),vs=a.useRef(null),ys=a.useRef(null),xs=a.useRef(null),ws=a.useRef(null),ke=a.useRef(!1),Wt=a.useRef(null),Cs=a.useRef(null),We=a.useRef(null),Xt=a.useRef(0),Rn=a.useRef(null),At=a.useRef(null),Fe=a.useRef(null),Ne=a.useRef(null),An=a.useRef(null),Yt=a.useRef(!1),Le=a.useRef(null),Pe=a.useRef(null),Se=a.useRef(null),Jt=a.useRef(null),Ss=a.useRef([]),dt=a.useRef(0),jt=a.useRef(new Map),jn=a.useRef(!1),Zt=a.useRef(!1),Ie=a.useRef(null),Tn=a.useRef(!1),en=Dr(),nt=en==="mobile",En=en==="tablet",ks=a.useRef(null),[Ua,Ns]=a.useState(!1);a.useLayoutEffect(()=>{if(!r){Ns(!1);return}const t=ks.current;if(!t||typeof ResizeObserver>"u")return;const o=()=>{Ns(t.getBoundingClientRect().width<=768)};o();const m=new ResizeObserver(o);return m.observe(t),()=>m.disconnect()},[r]);const ae=nt||Ua;a.useEffect(()=>{u?.id&&Q("direct",u.id,u.lastMessageAt??u.updatedAt)},[u?.id,u?.lastMessageAt,u?.updatedAt,Q]),a.useEffect(()=>{g.activeRoom?.id&&Q("room",g.activeRoom.id,g.activeRoom.updatedAt)},[g.activeRoom?.id,g.activeRoom?.updatedAt,Q]),a.useEffect(()=>{if(!u?.id||j.length===0)return;const t=j[j.length-1];Q("direct",u.id,t?.createdAt??u.lastMessageAt??u.updatedAt)},[u?.id,u?.lastMessageAt,u?.updatedAt,Q,j]),a.useEffect(()=>{if(!g.activeRoom?.id||g.messages.length===0)return;const t=g.messages[g.messages.length-1];Q("room",g.activeRoom.id,t?.createdAt??g.activeRoom.updatedAt)},[Q,g.activeRoom?.id,g.activeRoom?.updatedAt,g.messages]),a.useEffect(()=>{try{const t=localStorage.getItem(Sa);if(!t)return;const o=Number.parseInt(t,10);if(Number.isNaN(o))return;const m=Math.max(gn,Math.min(pn,o));Ke(m)}catch{}},[]),a.useEffect(()=>{try{const t=localStorage.getItem(ss);if(t==="direct"){v("direct");return}t==="rooms"&&$&&v("rooms")}catch{}},[$]),a.useEffect(()=>{try{localStorage.setItem(ss,w)}catch{}},[$,w]);const Me=ka(w,w==="rooms"?g.activeRoom?.id:u?.id),_n=a.useRef(Me);a.useEffect(()=>{Me!==_n.current&&(_n.current=Me,ue(Na(Me)))},[Me]),a.useEffect(()=>{if(!(!Me||_n.current!==Me))try{if(I){localStorage.setItem(Me,I);return}localStorage.removeItem(Me)}catch{}},[Me,I]);const be=w==="rooms"&&!!g.activeRoom,{keyboardOverlap:Ms,keyboardOpen:tn}=Fr({enabled:(ae||En)&&(!!u||be),allowNonMobileViewport:En}),Tt=En&&tn,Ae=a.useMemo(()=>{const t=x.trim().toLowerCase();return(t?ct.filter(m=>m.name.toLowerCase().includes(t)):ct).slice(0,10)},[ct,x]),mt=a.useMemo(()=>Array.from(Te.values()),[Te]),Oe=a.useMemo(()=>w!=="rooms"||!g.activeRoom?null:{roomId:g.activeRoom.id,roomName:g.activeRoom.name,memberIds:new Set(g.activeRoomMembers.map(t=>t.agentId))},[$,w,g.activeRoom,g.activeRoomMembers]),st=a.useMemo(()=>{const t=mt.filter(M=>Pa(M.name,q));if(!Oe)return t;const o=t.filter(M=>Oe.memberIds.has(M.id));if(q.trim().length===0)return o;const m=t.filter(M=>!Oe.memberIds.has(M.id));return[...o,...m]},[mt,q,Oe]),$n=a.useMemo(()=>{const t=new Map;for(const o of mt)t.set(o.name.toLowerCase(),o);return t},[mt]),qa=a.useMemo(()=>Ae.map(t=>t.id).join("\0"),[Ae]);a.useEffect(()=>{se(0)},[qa]),a.useEffect(()=>{ne(0)},[q,V]),a.useEffect(()=>()=>{Fe.current!==null&&window.clearTimeout(Fe.current)},[]),a.useEffect(()=>{const t=ys.current;if(!t||!F||R)return;const o=new IntersectionObserver(m=>{m[0].isIntersecting&&H()},{threshold:.1});return o.observe(t),()=>o.disconnect()},[F,R,H]);const ht=a.useCallback(()=>be?g.activeRoom?.id??null:u?.id??null,[be,g.activeRoom?.id,u?.id]),Rs=a.useCallback((t,o)=>typeof CSS<"u"&&typeof CSS.escape=="function"?t.querySelector(`.chat-message[data-message-id="${CSS.escape(o)}"]`):t.querySelector(`.chat-message[data-message-id="${o.replace(/"/g,'\\"')}"]`),[]),nn=a.useCallback(()=>{const t=Ne.current,o=ht();if(!t||!o)return;const m=t.scrollTop,M=t.querySelectorAll(".chat-message[data-message-id]"),B=Array.from(M).find(ye=>ye.offsetTop+ye.offsetHeight>=m)??M[0]??null,Z=B?.getAttribute("data-message-id")??null,Ce=B?B.offsetTop-m:0;At.current={threadId:o,scrollTop:m,scrollHeight:t.scrollHeight,clientHeight:t.clientHeight,anchorMessageId:Z,anchorOffset:Ce,wasPinnedBefore:!ke.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[ht]),As=a.useCallback(()=>{const t=Ne.current;if(!t)return;const m=t.scrollTop+t.clientHeight>=t.scrollHeight-50;Kt(!m),ke.current=!m,nn()},[nn]),ze=a.useCallback((t,o)=>{if(!t.isConnected||!o?.force&&ke.current)return;let m=0,M=0,B=-1;const Z=6,Ce=()=>{if(t.isConnected&&!(!o?.force&&ke.current)){if(t.scrollTop=t.scrollHeight,t.scrollHeight===B?M+=1:(M=0,B=t.scrollHeight),m+=1,m>=Z||M>=2){Kt(!1),ke.current=!1;return}window.requestAnimationFrame(Ce)}};Ce()},[]),Et=be?g.messages:j;a.useLayoutEffect(()=>{const t=Ne.current,o=ht(),m=At.current;if(!t||!o||!m||m.threadId!==o||m.wasPinnedBefore)return;const M=(typeof performance<"u"?performance.now():Date.now())-m.capturedAtMs,B=t.scrollHeight>t.clientHeight,Z=M>3e3,Ce=m.scrollTop<=0&&m.anchorOffset<=0&&B;if(!ke.current||Z||Ce){At.current=null;return}let ye=m.scrollTop;if(m.anchorMessageId){const He=Rs(t,m.anchorMessageId);He?ye=He.offsetTop-m.anchorOffset:ye=m.scrollTop+(t.scrollHeight-m.scrollHeight)}else ye=m.scrollTop+(t.scrollHeight-m.scrollHeight);t.scrollTop=Math.max(0,ye),ke.current=!0,Kt(!0),At.current=null},[Et,ht,Rs]);const Dn=a.useCallback(t=>{},[Et.length,be]),_e=a.useCallback(t=>{Dn(t);const o=Ne.current;o&&(At.current=null,ke.current=!1,ze(o))},[ze,Dn]);a.useLayoutEffect(()=>{We.current!==null&&(window.clearTimeout(We.current),We.current=null);const t=be?g.activeRoom?.id??null:u?.id??null;if(!t){Wt.current=null;return}const o={threadId:t,loaded:be?!g.messagesLoading:!R,hasMessages:be?g.messages.length>0:j.length>0},m=Wt.current,M=m?.threadId!==t,B=m?.threadId===t&&!m.loaded&&o.loaded,Z=m?.threadId===t&&!m.hasMessages&&o.hasMessages;if(!(m===null||M||B||Z))return;const ye=Ne.current;if(ye)return Dn(M?"thread-change":B?"finished-loading":Z?"first-messages":"mount"),ze(ye,{force:!0}),be||(We.current=window.setTimeout(()=>{if(We.current=null,ke.current)return;const He=Ne.current;He&&ze(He)},250)),Wt.current=o,()=>{We.current!==null&&(window.clearTimeout(We.current),We.current=null)}},[be,g.activeRoom?.id,g.messages.length,g.messagesLoading,u?.id,j.length,R,ze]),a.useEffect(()=>{!p||ke.current||_e("streaming")},[p,S,k,_e]),a.useEffect(()=>{const t=ht();if(!t){Xt.current=0,Rn.current=null;return}if(Rn.current!==t){Rn.current=t,Xt.current=Et.length;return}const o=Xt.current,m=Et.length,M=m>o,B=!ke.current;Xt.current=m,M&&B&&_e("new-message")},[Et,ht,_e]),a.useEffect(()=>{Ms<=0||!Ne.current||_e("keyboard")},[Ms,_e]),Lr(nt&&tn),a.useLayoutEffect(()=>{if(!nt||!u&&!be||typeof window>"u")return;const t=An.current,o=window.visualViewport;if(!t||!o)return;const m=B=>{if(!(B instanceof HTMLElement))return!1;if(B.tagName==="TEXTAREA")return!0;if(B.tagName!=="INPUT")return!1;const Z=B.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(Z)},M=()=>{if(Yt.current){t.classList.remove("chat-thread--keyboard-active"),t.style.transform="",t.style.willChange="";return}const B=Math.max(0,window.innerHeight-o.offsetTop-o.height),Z=o.offsetTop||0;t.style.setProperty("--vv-height",`${o.height}px`),t.style.setProperty("--vv-offset-top",`${Z}px`),t.style.setProperty("--keyboard-overlap",`${B}px`);const Ce=(B>0||Z>0)&&m(document.activeElement);t.classList.toggle("chat-thread--keyboard-active",Ce),Ce&&Z>0?(t.style.transform=`translateY(${Z}px)`,t.style.willChange="transform"):(t.style.transform="",t.style.willChange="")};return M(),o.addEventListener("resize",M),o.addEventListener("scroll",M),document.addEventListener("focusin",M),document.addEventListener("focusout",M),window.addEventListener("pageshow",M),document.addEventListener("visibilitychange",M),()=>{o.removeEventListener("resize",M),o.removeEventListener("scroll",M),document.removeEventListener("focusin",M),document.removeEventListener("focusout",M),window.removeEventListener("pageshow",M),document.removeEventListener("visibilitychange",M),t.classList.remove("chat-thread--keyboard-active"),t.style.transform="",t.style.willChange=""}},[u,nt,be]),a.useEffect(()=>{const t=()=>xe(null);if(me)return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[me]),a.useEffect(()=>{if(!nt||!tn)return;const t=o=>{o.target?.closest(".chat-messages")||o.preventDefault()};return document.addEventListener("touchmove",t,{passive:!1}),()=>{document.removeEventListener("touchmove",t)}},[nt,tn]),a.useEffect(()=>{const t=Cs.current;if(Cs.current=w,w==="rooms"&&!g.activeRoom){Wt.current=null;return}if(!(w==="direct"&&(t===null||t==="rooms"))&&!(w==="rooms"&&(t===null||t==="direct")))return;const M=Ne.current;M&&(ze(M,{force:!0}),ke.current=!1,Kt(!1))},[w,g.activeRoom,ze]),a.useEffect(()=>{if(!u&&!be||be&&!ae)return;const t=()=>{const m=!ke.current;nn(),m&&ae&&Ne.current&&_e("visibility-restore")},o=()=>{document.visibilityState==="visible"&&t()};return document.addEventListener("visibilitychange",o),window.addEventListener("pageshow",t),()=>{document.removeEventListener("visibilitychange",o),window.removeEventListener("pageshow",t)}},[ae,nt,u,be,nn,_e]),a.useEffect(()=>{if(be||typeof ResizeObserver>"u")return;const t=Ne.current;if(!t)return;const o=new ResizeObserver(()=>{ke.current||ze(t)});return o.observe(t),()=>{o.disconnect()}},[be,ze,u?.id,w]),a.useEffect(()=>{Ss.current=Re},[Re]),a.useEffect(()=>()=>{for(const t of Ss.current)t.previewUrl&&URL.revokeObjectURL(t.previewUrl);for(const t of jt.current.values())window.clearTimeout(t);jt.current.clear()},[]);const ft=a.useCallback(t=>{if(!t||t.length===0)return;const o=[];for(const m of Array.from(t)){if(!Gi.includes(m.type))continue;const M=m.type.startsWith("image/");o.push({file:m,previewUrl:M?URL.createObjectURL(m):""})}o.length>0&&Nn(m=>[...m,...o])},[]),js=a.useCallback(t=>{Nn(o=>{const m=o[t];return m?.previewUrl&&URL.revokeObjectURL(m.previewUrl),o.filter((M,B)=>B!==t)})},[]),Ts=a.useCallback(t=>{const o=t.clipboardData?.files;if(!o||o.length===0)return;const m=Array.from(o).filter(M=>M.type.startsWith("image/"));m.length!==0&&ft(m)},[ft]),Ka=a.useCallback(async t=>{try{await O(t),N(!1),ae&&Ee(!1)}catch{s(i("chat.failedToCreateSession","Failed to create chat session"),"error")}},[O,s,ae]),je=a.useCallback(t=>{const o=t??Se.current;if(!o)return;const m=en==="tablet"?Pi:hs;o.style.height="auto",o.style.height=`${Oi(o.scrollHeight,m)}px`,o.style.overflowY=Ii(o.scrollHeight,m)},[en]),Es=a.useCallback(t=>{Se.current=t,t&&je(t)},[je]);a.useLayoutEffect(()=>{je()},[w,I,u?.id,g.activeRoom?.id,je]);const gt=a.useCallback(()=>{if(ue(""),Me)try{localStorage.removeItem(Me)}catch{}h(!1),A(""),te(!1),J(""),de(-1),Nn(t=>{for(const o of t)o.previewUrl&&URL.revokeObjectURL(o.previewUrl);return[]})},[Me]),pt=a.useCallback(()=>{Zt.current=!0,Ie.current!=null&&clearTimeout(Ie.current),Ie.current=window.setTimeout(()=>{Zt.current=!1,Ie.current=null},700)},[]),bt=a.useCallback(()=>Tn.current?!1:(Tn.current=!0,window.setTimeout(()=>{Tn.current=!1},0),!0),[]),Fn=a.useCallback(()=>Zt.current?(Zt.current=!1,Ie.current!=null&&(clearTimeout(Ie.current),Ie.current=null),!0):!1,[]);a.useEffect(()=>()=>{Ie.current!=null&&clearTimeout(Ie.current)},[]);const _t=a.useCallback(()=>{const t=I.trim(),o=Re.map(m=>m.file);if(!(!t&&o.length===0||!u)){if(t==="/clear"||t==="/new"){gt(),z(),T(),O({agentId:u.agentId,modelProvider:u.modelProvider??void 0,modelId:u.modelId??void 0}).catch(()=>{s(i("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}gt(),re(t,o)}},[I,Re,u,gt,T,z,O,s,re]),$t=a.useCallback(async()=>{const t=I.trim(),o=Re.map(m=>m.file);if(!(!t&&o.length===0)){if(w==="rooms"){if(!g.activeRoom)return;if(t==="/clear"||t==="/new"){gt();try{await g.clearRoom(g.activeRoom.id)}catch{s(i("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(jn.current)return;jn.current=!0;const m=I;gt();try{await g.sendRoomMessage(t,{files:o})}catch(M){if(M instanceof Fa){const Z=M.message.trim()?M.message:i("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");s(i("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:Z}),"error");return}ue(m);const B=M instanceof Error&&M.message.trim()?M.message:i("chat.failedToSendRoomMessage","Failed to send room message");s(B,"error")}finally{jn.current=!1}return}_t()}},[I,Re,$,w,g,g.clearRoom,gt,s,_t]),sn=a.useCallback(async t=>{if(w==="rooms"){if(!g.activeRoom)return;try{await g.sendRoomMessage(t)}catch(o){const m=o instanceof Error&&o.message.trim()?o.message:i("chat.failedToSendRoomMessage","Failed to send room message");s(m,"error")}return}u&&re(t)},[u,s,$,w,g,re,i]),Ln=a.useCallback(t=>{ue(o=>{const m=Ma(o);if(!m)return o;const M=`/skill:${t.name} `,B=o.slice(0,m.start)+M+o.slice(m.end);return window.requestAnimationFrame(()=>{Se.current&&(je(Se.current),Se.current.focus())}),B}),h(!1),A(""),se(0)},[je]),an=a.useCallback(t=>{const o=Se.current;if(!o||ee<0)return;const m=o.selectionStart??dt.current,M=o.selectionEnd??m,B=Math.max(m,M),Z=Math.min(ee,B),ye=`${`@${t.name.replace(/\s+/g,"_")}`} `,He=I.slice(0,Z)+ye+I.slice(B),vt=Z+ye.length;ue(He),te(!1),J(""),ne(0),de(-1),window.requestAnimationFrame(()=>{Se.current&&(je(Se.current),Se.current.focus(),Se.current.setSelectionRange(vt,vt))})},[ee,I,je]),Dt=a.useCallback((t,o)=>{const M=Se.current?.selectionStart??dt.current,B=I.lastIndexOf("#",M),Z=B>=0?B+o.length:t.length;ue(t),ce.dismissMention(),Qt(!1),window.requestAnimationFrame(()=>{Se.current&&(je(Se.current),Se.current.focus(),Se.current.setSelectionRange(Z,Z))})},[ce,I,je]),_s=a.useCallback(t=>{if(dt.current=t.currentTarget.selectionStart??dt.current,ce.mentionActive&&ce.combinedItems.length>0){if(ce.handleKeyDown(t,I),t.key==="Enter"||t.key==="Tab"){const o=ce.combinedItems[ce.selectedIndex];o?.kind==="task"?Dt(ce.selectTask(o.task,I),`#${o.task.id}`):o?.kind==="file"&&Dt(ce.selectFile(o.file,I),`#${o.file.path}`)}return}if(V&&t.key==="ArrowDown"){t.preventDefault(),st.length>0&&ne(o=>(o+1)%st.length);return}if(V&&t.key==="ArrowUp"){t.preventDefault(),st.length>0&&ne(o=>o===0?st.length-1:o-1);return}if(V&&t.key==="Enter"){t.preventDefault();const o=st[oe]??st[0];o&&an(o);return}if(V&&t.key==="Escape"){t.preventDefault(),te(!1),J(""),de(-1);return}if(Ge&&t.key==="ArrowDown"){t.preventDefault(),Ae.length>0&&se(o=>(o+1)%Ae.length);return}if(Ge&&t.key==="ArrowUp"){t.preventDefault(),Ae.length>0&&se(o=>o===0?Ae.length-1:o-1);return}if(Ge&&(t.key==="Enter"||t.key==="Tab")&&Ae.length>0){t.preventDefault();const o=Ae[K]??Ae[0];o&&Ln(o);return}if(Ge&&t.key==="Escape"){t.preventDefault(),h(!1);return}t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),$t())},[V,st,oe,an,Ge,Ae,K,Ln,$t,ce,Dt,I]),rn=a.useCallback((t,o)=>{const m=Vi(t,o);if(m){te(!0),J(m.filter),de(m.start);return}te(!1),J(""),de(-1)},[]),$s=a.useCallback(t=>{const o=t.target,m=o.value,M=o.selectionStart??m.length;je(o),dt.current=M,ue(m);const B=Ma(m);B?(h(!0),A(B.filter)):(h(!1),A("")),rn(m,M),ce.detectMention(m,M),Qt(ce.mentionActive),ce.mentionActive&&Mn(o)},[rn,je]),on=a.useCallback(t=>{const o=t.currentTarget,m=o.selectionStart??o.value.length;dt.current=m,rn(o.value,m),ce.detectMention(o.value,m),Qt(ce.mentionActive),ce.mentionActive&&Mn(o)},[rn,ce,Mn]),Ds=a.useCallback(t=>{t.key!=="Escape"&&on(t)},[on]),Fs=a.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(Yt.current=!0,Le.current!==null&&window.clearTimeout(Le.current),Le.current=window.setTimeout(()=>{Yt.current=!1,Le.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),Pe.current!==null&&window.clearTimeout(Pe.current),Pe.current=window.setTimeout(()=>{Pe.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Fe.current!==null&&window.clearTimeout(Fe.current),Fe.current=window.setTimeout(()=>{h(!1),te(!1),J(""),de(-1),Qt(!1),ce.dismissMention(),Fe.current=null},120)},[ce]),Ls=a.useCallback(()=>{Yt.current=!1,Le.current!==null&&(window.clearTimeout(Le.current),Le.current=null),Fe.current!==null&&(window.clearTimeout(Fe.current),Fe.current=null),Pe.current!==null&&(window.clearTimeout(Pe.current),Pe.current=null)},[]);a.useEffect(()=>()=>{Le.current!==null&&window.clearTimeout(Le.current),Pe.current!==null&&window.clearTimeout(Pe.current)},[]);const Ga=a.useCallback(async t=>{xe(null);try{await b(t),s(i("chat.conversationArchived","Conversation archived"),"success")}catch{s(i("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[b,s]),Ps=a.useCallback(t=>{const o=L.find(m=>m.id===t)??(u?.id===t?u:null);xe(null),Qe(!1),qe(o?.title??""),ve({sessionId:t,title:o?.title??""})},[u,L]),Is=a.useCallback(async()=>{if(le)try{await W(le.sessionId,we),ve(null),qe(""),s(i("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[s,le,W,we,i]),Va=a.useCallback(async t=>{ge(null),xe(null);try{await U(t),s(i("chat.conversationDeleted","Conversation deleted"),"success")}catch{s(i("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[U,s]),Ft=a.useCallback(t=>{try{localStorage.setItem(Sa,String(t))}catch{}},[]),Qa=a.useCallback(t=>{if(ae||Tt)return;t.preventDefault(),t.stopPropagation();const o=t.currentTarget;typeof o.setPointerCapture=="function"&&o.setPointerCapture(t.pointerId);const m=t.clientX,M=he;let B=M;document.body.style.userSelect="none";const Z=ye=>{const He=ye.clientX-m,vt=Math.max(gn,Math.min(pn,M+He));B=vt,Ke(vt),Ft(vt)},Ce=ye=>{typeof o.releasePointerCapture=="function"&&o.releasePointerCapture(ye.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",Z),document.removeEventListener("pointerup",Ce),Ft(B)};document.addEventListener("pointermove",Z),document.addEventListener("pointerup",Ce)},[ae,Ft,he,Tt]),Wa=a.useCallback(t=>{if(ae||Tt||t.key!=="ArrowLeft"&&t.key!=="ArrowRight")return;t.preventDefault();const o=t.shiftKey?50:10,m=t.key==="ArrowLeft"?-o:o,M=Math.max(gn,Math.min(pn,he+m));Ke(M),Ft(M)},[ae,Ft,he,Tt]),Os=a.useCallback(t=>{const o=L.find(m=>m.id===t);Q("direct",t,o?.lastMessageAt??o?.updatedAt),C(t),Qe(!1),ae&&Ee(!1)},[L,ae,Q,C]),Pn=a.useCallback(()=>{C(""),Ee(!0),Qe(!1)},[C]),In=a.useCallback(()=>{g.selectRoom(null),Ee(!0),Qe(!1)},[g]),Xa=()=>e.jsxs("div",{className:"chat-empty-state",children:[e.jsx(vn,{size:48,strokeWidth:1.5}),e.jsx("h2",{children:i("chat.startNewConversation","Start a new conversation")}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>N(!0),children:[e.jsx(yt,{size:16}),i("chat.newChat","New Chat")]})]}),Be=Ra(u,u?.agentId?Te.get(u.agentId)??null:null,ot),On=a.useMemo(()=>{if(!Be?.provider||!Be.modelId)return null;const t=Ht.find(o=>o.provider===Be.provider&&o.id===Be.modelId);return t?.contextWindow?t.contextWindow:null},[Be?.modelId,Be?.provider,Ht]),Ya=a.useMemo(()=>Li(j,p?S:void 0),[p,j,S]),Xe=Ca(Be?.provider,Be?.modelId),Ye=Be?.provider??null,cn=!!(u||p||j.length>0),ln=w==="rooms"?be:!!u,zs=a.useRef(ln);a.useEffect(()=>{const t=zs.current;zs.current=ln,ae&&(t||!ln||bs({type:"view",revert:w==="rooms"?In:Pn}))},[w,Pn,In,ln,ae,bs]);const zn=u?.agentId===St?Xe??"Fusion":u?.title||Te.get(u?.agentId??"")?.name||u?.agentId||"Chat",Bs=!!(Xe&&Xe!==zn),Ja=!ae&&cn&&On!==null,Hs=xa(Ya),un=On!==null?xa(On):null,Bn=un?i("chat.contextWindowAria","Estimated {{used}} of {{total}} context tokens",{used:Hs,total:un}):null,Za=ae&&w==="direct"&&!!u,Hn=Te.get(u?.agentId??"")?.name||(u?.agentId===St?Xe??"Fusion":u?.agentId?.slice(0,30)??"Fusion"),Un=!1,qn=u?.agentId===St,er=t=>t.length>50?`${t.slice(0,50)}…`:t,tr=a.useCallback(()=>{Ve(t=>!t)},[]);a.useEffect(()=>{if(!Gt)return;const t=o=>{xs.current?.contains(o.target)||Qe(!1)};return document.addEventListener("mousedown",t),()=>{document.removeEventListener("mousedown",t)}},[Gt]),a.useEffect(()=>{if(!Vt)return;const t=m=>{ws.current?.contains(m.target)||Rt(!1)},o=m=>{m.key==="Escape"&&Rt(!1)};return document.addEventListener("mousedown",t),document.addEventListener("keydown",o),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("keydown",o)}},[Vt]),a.useEffect(()=>{(!ae||w!=="direct"||fe)&&Qe(!1)},[ae,w,fe]),a.useEffect(()=>{Rt(!1)},[g.activeRoom?.id]);const Kn=a.useCallback((t,o)=>{const m=jt.current.get(t);m&&window.clearTimeout(m),ps(B=>({...B,[t]:o}));const M=window.setTimeout(()=>{ps(B=>{const{[t]:Z,...Ce}=B;return Ce}),jt.current.delete(t)},2e3);jt.current.set(t,M)},[]),Us=a.useCallback(async(t,o)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(o),Kn(t,"success")}catch{Kn(t,"error")}},[Kn]),nr=a.useCallback((t,o=!1)=>o?e.jsx("div",{className:"chat-message-content chat-message-content--plain",children:t}):e.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:e.jsx(_a,{remarkPlugins:[$a],components:za,children:t})}),[]),Gn=u?.agentId===St,Vn=a.useCallback((t,o,m)=>e.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${ut[t]==="success"?" chat-message-copy-action--success":""}${ut[t]==="error"?" chat-message-copy-action--error":""}`,"data-testid":m??`chat-copy-response-${t}`,"aria-label":ut[t]==="success"?i("chat.responseCopied","Response copied"):ut[t]==="error"?i("chat.copyFailed","Copy failed"):i("chat.copyResponse","Copy response"),onClick:()=>{Us(t,o)},children:ut[t]==="success"?e.jsx(Pr,{size:14}):e.jsx(Ir,{size:14})}),[ut,Us]),Qn=a.useCallback(t=>{const o=Ne.current;if(!o)return;const m=`[data-testid="chat-message-${t}"]`,M=o.querySelector(m);if(!M)return;const B=M.getBoundingClientRect().top-o.getBoundingClientRect().top+o.scrollTop,Z=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;o.scrollTo({top:B,behavior:Z?"auto":"smooth"})},[]),qs=u?.cliExecutorAdapterId??null,sr=!!qs,ar=qs==="generic"?"generic":"hybrid",rr=u?.cliSessionFile||u?.id||"",Ks=()=>e.jsxs("div",{className:"chat-messages",ref:Ne,onScroll:As,children:[e.jsx("div",{ref:ys,className:"chat-load-more-sentinel",children:F&&R&&e.jsx("div",{className:"chat-loading-older",children:i("chat.loadingOlderMessages","Loading older messages…")})}),p?e.jsxs(e.Fragment,{children:[j.map((t,o)=>e.jsx(as,{message:t,forcePlain:pe,agentName:Hn,hideAssistantIdentity:qn,showAssistantModelTag:Un,activeModelTag:Xe,activeModelProvider:Ye,activeSessionId:u?.id??null,mentionAgentsByName:$n,roomContext:null,copyAction:Gn&&t.role==="assistant"?Vn(t.id,t.content):void 0,onScrollToTop:Qn,isAwaitingQuestionAnswer:t.role==="assistant"&&o===j.length-1&&!p,submittedQuestionAnswer:Aa(j,o),onQuestionSubmit:sn},t.id)),e.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!qn&&e.jsxs("div",{className:"chat-message-avatar",children:[Ye?e.jsx(It,{provider:Ye,size:"sm"}):e.jsx(Ot,{size:14}),e.jsx("span",{children:Hn}),Un]}),S?nr(S,pe):e.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:k?i("chat.thinkingStatus","Thinking…"):i("chat.workingStatus","Working…")}),Gn&&S&&Vn("__streaming__",S,"chat-copy-response-streaming"),Oa(E,i,{isAwaitingAnswer:!0,onQuestionSubmit:sn}),k&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:i("chat.thinking","Thinking")}),e.jsx("pre",{className:"chat-message-thinking-content",children:Sn(k)})]}),e.jsxs("div",{className:"chat-typing-indicator",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})]})]}):R?e.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):j.length===0&&!u?Xa():j.length===0&&u?e.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):e.jsx(e.Fragment,{children:j.map((t,o)=>e.jsx(as,{message:t,forcePlain:pe,agentName:Hn,hideAssistantIdentity:qn,showAssistantModelTag:Un,activeModelTag:Xe,activeModelProvider:Ye,activeSessionId:u?.id??null,mentionAgentsByName:$n,roomContext:null,copyAction:Gn&&t.role==="assistant"?Vn(t.id,t.content):void 0,onScrollToTop:Qn,isAwaitingQuestionAnswer:t.role==="assistant"&&o===j.length-1&&!p,submittedQuestionAnswer:Aa(j,o),onQuestionSubmit:sn},t.id))}),e.jsx("div",{ref:vs})]}),Gs=()=>e.jsxs("div",{className:"chat-input-area",children:[e.jsx("input",{ref:Jt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:t=>{ft(t.target.files),t.target.value=""}}),Ge&&e.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":i("chat.skillSuggestions","Skill suggestions"),children:qt?e.jsx("div",{className:"chat-skill-menu-empty",children:i("chat.loadingSkills","Loading skills…")}):Ae.length===0?e.jsx("div",{className:"chat-skill-menu-empty",children:x?i("chat.noSkillsFound","No skills found"):i("chat.noSkillsAvailable","No skills available")}):Ae.map((t,o)=>e.jsxs("button",{type:"button",role:"option","aria-selected":o===K,className:`chat-skill-menu-item${o===K?" chat-skill-menu-item--highlighted":""}`,onMouseDown:m=>m.preventDefault(),onMouseEnter:()=>se(o),onClick:()=>Ln(t),children:[e.jsx("span",{className:"chat-skill-menu-item-name",children:t.name}),e.jsx("span",{className:"chat-skill-menu-item-description",title:t.relativePath,children:t.relativePath})]},t.id))}),Re.length>0&&e.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Re.map((t,o)=>e.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${o}`,children:[t.previewUrl?e.jsx("img",{src:t.previewUrl,alt:t.file.name}):e.jsx("span",{className:"chat-attachment-preview-name",children:t.file.name}),e.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>js(o),"data-testid":`chat-attachment-remove-${o}`,"aria-label":`Remove ${t.file.name}`,children:"×"})]},t.previewUrl||`${t.file.name}-${o}`))}),X.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"chat-pending-stack","data-testid":"chat-pending-stack",children:X.map((t,o)=>e.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[e.jsx("span",{children:i("chat.queuedMessage","Queued: {{preview}}",{preview:er(t)})}),e.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":i("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":`chat-pending-dismiss-${o}`,onClick:()=>z(o),children:"×"})]},`${o}-${t}`))}),e.jsx("div",{className:"chat-pending-divider","aria-hidden":"true"})]}),e.jsxs("div",{className:"chat-input-row",children:[e.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>Jt.current?.click(),children:e.jsx(ea,{size:16})}),e.jsxs("div",{className:`chat-input-wrapper${fs?" chat-input-wrapper--dragover":""}`,onDragOver:t=>{t.preventDefault(),lt(!0)},onDragLeave:()=>lt(!1),onDrop:t=>{t.preventDefault(),lt(!1),ft(t.dataTransfer.files)},children:[e.jsx("textarea",{ref:Es,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:I,onChange:$s,onKeyDown:_s,onKeyUp:Ds,onClick:on,onBlur:Fs,onFocus:Ls,onPaste:Ts,onTouchStart:t=>{typeof window>"u"||window.innerWidth>768||ta()&&(document.activeElement,t.currentTarget)},rows:1,"data-testid":"chat-input"}),e.jsx(pa,{agents:mt,filter:q,highlightedIndex:oe,visible:V,onSelect:an,position:"below",roomMemberIds:Oe?.memberIds,roomName:Oe?.roomName}),e.jsx(Ni,{visible:ce.mentionActive&&!V,position:Ba,tasks:ce.tasks,files:ce.files,selectedIndex:ce.selectedIndex,onSelectTask:t=>{Dt(ce.selectTask(t,I),`#${t.id}`)},onSelectFile:t=>{Dt(ce.selectFile(t,I),`#${t.path}`)},loading:ce.loading})]}),p?e.jsx("button",{className:"chat-input-stop",onPointerDown:t=>{if(t.pointerType&&t.pointerType!=="mouse"){if(t.preventDefault(),!bt())return;pt(),T()}},onTouchStart:t=>{t.preventDefault(),bt()&&(pt(),T())},onMouseDown:t=>{t.preventDefault()},onClick:()=>{Fn()||T()},"aria-label":i("chat.stopGeneration","Stop generation"),"data-testid":"chat-stop-btn",children:e.jsx(Vr,{size:14})}):e.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:t=>{if(t.pointerType&&t.pointerType!=="mouse"){if(t.preventDefault(),!bt())return;pt(),_t()}},onTouchStart:t=>{t.preventDefault(),bt()&&(pt(),_t())},onMouseDown:t=>{t.preventDefault()},onClick:()=>{Fn()||_t()},disabled:!I.trim()&&Re.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:e.jsx(na,{size:16})})]})]}),ir=ae?void 0:{width:`${he}px`},or=e.jsxs("div",{className:"chat-sidebar-scope-toggle chat-view-header-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[e.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${w==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":w==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>v("direct"),children:[e.jsx(vn,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:i("chat.scopeDirect","Direct")})]}),e.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${w==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":w==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>v("rooms"),children:[e.jsx(Da,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:i("chat.scopeRooms","Rooms")})]})]});return e.jsxs("div",{ref:ks,className:`chat-view${r?" chat-view--floating":""}${ae?" chat-view--narrow":""}`,children:[e.jsx(Or,{icon:vn,title:i("chat.title","Chat"),actions:e.jsxs(e.Fragment,{children:[or,ae?null:e.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:()=>N(!0),"data-testid":"chat-new-btn",children:[e.jsx(yt,{size:14}),i("chat.newChat","New Chat")]}),!r&&l?e.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:l,"aria-label":i("chat.popOut","Pop out chat"),title:i("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:e.jsx(Ys,{size:16})}):null,r&&c?e.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:c,"aria-label":i("chat.maximizeToChatView","Open in Chat view"),title:i("chat.maximizeToChatView","Open in Chat view"),"data-testid":"chat-modal-maximize",children:e.jsx(Ys,{size:16})}):null,r&&d?e.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:d,"aria-label":i("chat.minimizeToQuickChat","Minimize to quick chat"),title:i("chat.minimizeToQuickChat","Minimize to quick chat"),"data-testid":"chat-modal-minimize",children:e.jsx(zr,{size:16})}):null,r&&f?e.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:f,"aria-label":i("chat.closeChat","Close chat"),title:i("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:e.jsx(Br,{size:16})}):null]})}),e.jsxs("div",{className:"chat-view__body",children:[e.jsxs("div",{className:`chat-sidebar${fe?"":" chat-sidebar--hidden"}`,style:ir,children:[w==="direct"?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"chat-sidebar-search-container",children:e.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[e.jsx(Hr,{size:14,className:"chat-sidebar-search-icon"}),e.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:i("chat.searchConversations","Search conversations..."),value:G,onChange:t=>y(t.target.value),"data-testid":"chat-search-input"})]})}),e.jsx("div",{className:"chat-session-list chat-sidebar-list",children:_?e.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.loadingConversations","Loading...")}):L.length===0?e.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.noConversationsYet","No conversations yet")}):L.map(t=>{const o=u?.id===t.id,m=!o&&D("direct",t.id,t.lastMessageAt??t.updatedAt),M=Ra(t,Te.get(t.agentId)??null,ot),B=Ca(M?.provider,M?.modelId)??"Fusion";return e.jsxs("div",{className:`chat-session-item${o?" chat-session-item--active":""}`,onClick:()=>Os(t.id),onContextMenu:Z=>{Z.preventDefault(),xe({sessionId:t.id,x:Z.clientX,y:Z.clientY})},"data-testid":`chat-session-${t.id}`,children:[e.jsx("button",{className:"chat-session-delete-btn",onClick:Z=>{Z.stopPropagation(),ge(t.id)},"data-testid":"chat-session-delete-btn","aria-label":i("chat.deleteConversation","Delete conversation"),children:e.jsx(Xn,{size:14})}),e.jsxs("div",{className:"chat-session-title",children:[t.title||i("chat.untitledSession","Untitled"),m?e.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${t.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),e.jsx("div",{className:"chat-session-preview",children:t.lastMessagePreview||i("chat.noMessages","No messages")}),e.jsxs("div",{className:"chat-session-meta",children:[e.jsxs("span",{className:"chat-session-meta-model",children:[M?.provider?e.jsx(It,{provider:M.provider,size:"sm"}):null,e.jsx("span",{children:Te.get(t.agentId)?.name||(t.agentId===St?B:t.agentId.slice(0,30))})]}),e.jsx("span",{children:t.updatedAt?Ia(t.updatedAt,i):""})]})]},t.id)})})]}):e.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!ae&&e.jsx("div",{className:"chat-sidebar-rooms-header","data-testid":"chat-sidebar-rooms-header",children:e.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>it(!0),children:[e.jsx(yt,{size:14}),i("chat.createRoom","Create room")]})}),g.rooms.length===0?e.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:i("chat.noRoomsYet","No rooms yet.")}):e.jsx("div",{className:"chat-session-list chat-sidebar-list",children:g.rooms.map(t=>{const o=g.activeRoom?.id===t.id,m=!o&&D("room",t.id,t.updatedAt);return e.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${o?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${t.slug}`,onClick:()=>{Q("room",t.id,t.updatedAt),g.selectRoom(t.id),ae&&Ee(!1)},onKeyDown:M=>{(M.key==="Enter"||M.key===" ")&&(M.preventDefault(),Q("room",t.id,t.updatedAt),g.selectRoom(t.id),ae&&Ee(!1))},children:[e.jsxs("span",{className:"chat-room-item-details",children:[e.jsxs("span",{className:"chat-room-item-name-row",children:[e.jsxs("span",{className:"chat-room-item-name",children:["#",t.name]}),m?e.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${t.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),o?e.jsx("span",{className:"chat-room-item-meta",children:i("chat.roomMemberCount","{{count}} member",{count:g.activeRoomMembers.length,defaultValue_one:"{{count}} member",defaultValue_other:"{{count}} members"})}):null]}),e.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${t.slug}`,"aria-label":i("chat.deleteRoom","Delete room {{name}}",{name:t.name}),onClick:M=>{M.stopPropagation(),rt(t.id)},children:e.jsx(Xn,{size:14})})]},t.id)})})]}),w==="rooms"?ae?e.jsx("div",{className:"chat-sidebar-footer",children:e.jsxs("button",{type:"button",className:"btn btn-sm btn-primary chat-sidebar-footer-btn","data-testid":"chat-create-room-btn",onClick:()=>it(!0),children:[e.jsx(yt,{size:14}),i("chat.createRoom","Create room")]})}):null:ae?e.jsx("div",{className:"chat-sidebar-footer",children:e.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>N(!0),"data-testid":"chat-new-btn",children:[e.jsx(yt,{size:14}),i("chat.newChat","New Chat")]})}):null]}),!ae&&fe&&!Tt&&e.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":gn,"aria-valuemax":pn,"aria-valuenow":he,"aria-label":i("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:Qa,onKeyDown:Wa}),me&&e.jsxs("div",{className:"chat-session-context-menu",style:{top:me.y,left:me.x},onClick:t=>t.stopPropagation(),children:[e.jsxs("button",{onClick:()=>Ps(me.sessionId),"data-testid":"chat-context-rename",children:[e.jsx(Js,{size:14}),i("chat.rename","Rename")]}),e.jsxs("button",{onClick:()=>Ga(me.sessionId),"data-testid":"chat-context-archive",children:[e.jsx(Ur,{size:14}),i("chat.archive","Archive")]}),e.jsxs("button",{onClick:()=>{xe(null),ge(me.sessionId)},"data-testid":"chat-context-delete",children:[e.jsx(Xn,{size:14}),i("chat.delete","Delete")]})]}),le&&e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>ve(null),children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:i("chat.renameConversationTitle","Rename Conversation")}),e.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.")}),e.jsx("label",{className:"chat-rename-label",htmlFor:"chat-rename-input",children:i("chat.conversationName","Conversation name")}),e.jsx("input",{id:"chat-rename-input",className:"input chat-rename-input",type:"text",value:we,placeholder:i("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:t=>qe(t.target.value),onKeyDown:t=>{t.key==="Enter"&&(t.preventDefault(),Is())},autoFocus:!0}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>ve(null),children:i("chat.cancel","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Is(),"data-testid":"chat-rename-save",children:i("chat.save","Save")})]})]})}),et&&e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>ge(null),children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:i("chat.deleteConversationTitle","Delete Conversation?")}),e.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.")}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>ge(null),children:i("chat.cancel","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Va(et),children:i("chat.delete","Delete")})]})]})}),tt&&e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>rt(null),children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:i("chat.deleteRoomTitle","Delete Room?")}),e.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.")}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>rt(null),children:i("chat.cancel","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await g.deleteRoom(tt),rt(null)}catch{s(i("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:i("chat.delete","Delete")})]})]})}),w==="rooms"?e.jsxs("div",{ref:An,className:"chat-thread",children:[g.activeRoom?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"chat-room-thread-header",children:[ae&&e.jsx("button",{className:"btn-icon",onClick:In,"data-testid":"chat-back-btn",children:e.jsx(Zs,{size:16})}),e.jsxs("div",{className:"chat-room-switcher-menu",ref:ws,children:[e.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":Vt,onClick:()=>Rt(t=>!t),children:[e.jsxs("span",{className:"chat-thread-header-title",children:["#",g.activeRoom.name]}),e.jsx(dn,{size:16,"aria-hidden":"true"})]}),Vt&&e.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:g.rooms.map(t=>e.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${t.id===g.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${t.id}`,onClick:()=>{Q("room",t.id,t.updatedAt),g.selectRoom(t.id),Rt(!1)},children:["#",t.name]},t.id))})]}),e.jsx("div",{className:"chat-room-thread-members",children:g.activeRoomMembers.map(t=>e.jsx(Cn,{agent:Te.get(t.agentId)??{id:t.agentId,name:t.agentId.slice(0,30)}},t.agentId))})]}),e.jsxs("div",{className:"chat-messages",ref:Ne,onScroll:As,children:[g.messagesLoading?e.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):g.messages.filter(t=>t.content.trim()!==wa).length===0?e.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):g.messages.filter(t=>t.content.trim()!==wa).map(t=>{const o=t.senderAgentId?Te.get(t.senderAgentId)?.name??t.senderAgentId.slice(0,30):i("chat.you","You"),m={id:t.id,sessionId:t.roomId,role:t.role,content:t.content,thinkingOutput:t.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:t.attachments,createdAt:t.createdAt};return e.jsx(as,{message:m,forcePlain:pe,agentName:o,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:g.activeRoom?.id??null,mentionAgentsByName:$n,roomContext:Oe,onScrollToTop:Qn,isAwaitingQuestionAnswer:!1,onQuestionSubmit:sn},t.id)}),e.jsx("div",{ref:vs})]}),g.activeRoom&&gs&&e.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>_e("fab-click"),children:[e.jsx(dn,{size:14}),i("chat.latest","Latest")]})]}):e.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:i("chat.selectRoomOrCreate","Select a room or create one")}),g.activeRoom&&e.jsxs("div",{className:"chat-input-area",children:[e.jsx("input",{ref:Jt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:t=>{ft(t.target.files),t.target.value=""}}),Re.length>0&&e.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Re.map((t,o)=>e.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${o}`,children:[t.previewUrl?e.jsx("img",{src:t.previewUrl,alt:t.file.name}):e.jsx("span",{className:"chat-attachment-preview-name",children:t.file.name}),e.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>js(o),"data-testid":`chat-attachment-remove-${o}`,"aria-label":`Remove ${t.file.name}`,children:"×"})]},t.previewUrl||`${t.file.name}-${o}`))}),e.jsxs("div",{className:"chat-input-row",children:[e.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>Jt.current?.click(),children:e.jsx(ea,{size:16})}),e.jsxs("div",{className:`chat-input-wrapper${fs?" chat-input-wrapper--dragover":""}`,onDragOver:t=>{t.preventDefault(),lt(!0)},onDragLeave:()=>lt(!1),onDrop:t=>{t.preventDefault(),lt(!1),ft(t.dataTransfer.files)},children:[e.jsx("textarea",{ref:Es,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:I,onChange:$s,onKeyDown:_s,onKeyUp:Ds,onClick:on,onBlur:Fs,onFocus:Ls,onPaste:Ts,onTouchStart:t=>{typeof window>"u"||window.innerWidth>768||ta()&&(document.activeElement,t.currentTarget)},rows:1,"data-testid":"chat-input"}),e.jsx(pa,{agents:mt,filter:q,highlightedIndex:oe,visible:V,onSelect:an,position:"below",roomMemberIds:Oe?.memberIds,roomName:Oe?.roomName})]}),e.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:t=>{if(t.pointerType&&t.pointerType!=="mouse"){if(t.preventDefault(),!bt())return;pt(),$t()}},onTouchStart:t=>{t.preventDefault(),bt()&&(pt(),$t())},onMouseDown:t=>{t.preventDefault()},onClick:()=>{Fn()||$t()},disabled:!I.trim()&&Re.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:e.jsx(na,{size:16})})]})]})]}):e.jsxs("div",{ref:An,className:"chat-thread",children:[(cn||!ae)&&e.jsxs("div",{className:"chat-thread-header",children:[ae&&cn&&e.jsx("button",{className:"btn-icon",onClick:Pn,"data-testid":"chat-back-btn",children:e.jsx(Zs,{size:16})}),e.jsx("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:Za?e.jsxs("div",{className:"chat-mobile-session-menu",ref:xs,children:[e.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":Gt,onClick:()=>Qe(t=>!t),children:[Ye?e.jsx(It,{provider:Ye,size:"md"}):e.jsx(Ot,{size:16}),e.jsx("span",{className:"chat-thread-header-title",children:zn}),Bs&&e.jsx("span",{className:"chat-model-tag",children:Xe}),e.jsx(dn,{size:16,"aria-hidden":"true"})]}),Gt&&e.jsxs("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:[L.map(t=>e.jsxs("div",{className:`chat-mobile-session-option-row${u?.id===t.id?" chat-mobile-session-option-row--active":""}`,role:"none",children:[e.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${u?.id===t.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${t.id}`,onClick:()=>Os(t.id),children:e.jsx("span",{className:"chat-mobile-session-option-title",children:t.title||i("chat.untitledSession","Untitled")})}),e.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-rename","data-testid":`chat-mobile-session-rename-${t.id}`,"aria-label":i("chat.renameConversationAria","Rename conversation {{title}}",{title:t.title||i("chat.untitledSession","Untitled")}),onClick:()=>Ps(t.id),children:e.jsx(Js,{size:14})})]},t.id)),e.jsxs("button",{type:"button",role:"menuitem",className:"chat-mobile-session-new","data-testid":"chat-mobile-session-new",onClick:()=>{Qe(!1),N(!0)},children:[e.jsx(yt,{size:16,"aria-hidden":"true"}),e.jsx("span",{children:i("chat.newChat","New Chat")})]})]})]}):e.jsxs(e.Fragment,{children:[Ye?e.jsx(It,{provider:Ye,size:"md"}):e.jsx(Ot,{size:16}),e.jsx("span",{className:"chat-thread-header-title",children:zn}),Bs&&e.jsx("span",{className:"chat-model-tag",children:Xe}),Ja&&un&&Bn?e.jsxs("span",{className:"chat-thread-header-context","data-testid":"chat-thread-context-window",title:Bn,"aria-label":Bn,children:[Hs," / ",un]}):null]})}),cn&&e.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${pe?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":pe?i("chat.showRenderedMarkdown","Show all messages as rendered Markdown"):i("chat.showPlainText","Show all messages as plain text"),onClick:tr,children:pe?e.jsx(qr,{size:14}):e.jsx(Kr,{size:14})})]}),sr?e.jsx(Ai,{cliSessionId:rr,tier:ar,projectId:n,renderTranscript:Ks,renderComposer:()=>u?Gs():null}):e.jsxs(e.Fragment,{children:[Ks(),gs&&e.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>_e("fab-click"),children:[e.jsx(dn,{size:14}),i("chat.latest","Latest")]}),u&&Gs()]})]}),e.jsx(Ri,{isOpen:kn,onClose:()=>it(!1),projectId:n,existingRoomNames:g.rooms.map(t=>t.name),onCreate:async t=>{await g.createRoom({name:t.name,memberAgentIds:t.memberAgentIds}),w!=="rooms"&&v("rooms"),it(!1),ae&&Ee(!1)}})]}),Y&&e.jsx(Wi,{projectId:n,defaultModel:ot,onClose:()=>N(!1),onCreate:Ka})]})}export{ao as ChatView,Oi as clampChatInputHeight,Ii as resolveChatInputOverflowY,Ra as resolveSessionProvider};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.chat-question-response{display:flex;flex-direction:column;gap:var(--space-md);margin-block:var(--space-sm);padding:var(--space-md);border:thin solid color-mix(in srgb,var(--accent) 28%,var(--border));border-radius:var(--radius-lg);background:color-mix(in srgb,var(--accent) 6%,var(--bg-secondary));color:var(--text)}.chat-question-response--compact{gap:var(--space-sm);padding:var(--space-sm);border-radius:var(--radius-md)}.chat-question-response__header,.chat-question-response__actions{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.chat-question-response__eyebrow,.chat-question-response__answered-label,.chat-question-response__submitted-label{font-size:.75rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted)}.chat-question-response__answered-label{color:var(--color-success)}.chat-question-response__questions{display:flex;flex-direction:column;gap:var(--space-md)}.chat-question-response__question{display:flex;flex-direction:column;gap:var(--space-xs)}.chat-question-response__question-header{margin:0;font-size:.875rem;font-weight:600;color:var(--text-muted)}.chat-question-response__question-text{margin:0;font-size:1rem;line-height:1.3;color:var(--text)}.chat-question-response--compact .chat-question-response__question-text{font-size:.875rem}.chat-question-response__description,.chat-question-response__hint{margin:0;font-size:.875rem;line-height:1.45;color:var(--text-muted)}.chat-question-response__options,.chat-question-response__confirm-group{display:flex;flex-direction:column;gap:var(--space-xs);margin-block-start:var(--space-xs)}.chat-question-response__confirm-group{flex-direction:row;flex-wrap:wrap}.chat-question-response__option{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-sm);border:thin solid var(--border);border-radius:var(--radius-md);background:var(--card);cursor:pointer;transition:border-color var(--transition-fast),background-color var(--transition-fast),color var(--transition-fast)}.chat-question-response__option:hover,.chat-question-response__option--selected,.chat-question-response__confirm--selected{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,var(--card))}.chat-question-response__option input{margin:calc(var(--space-xs) / 2) 0 0;accent-color:var(--accent)}.chat-question-response__option-content{display:flex;flex-direction:column;gap:calc(var(--space-xs) / 2);min-width:0}.chat-question-response__option-label{font-size:.875rem;font-weight:600;color:var(--text)}.chat-question-response__option-description{font-size:.875rem;line-height:1.45;color:var(--text-muted)}.chat-question-response__textarea{width:100%;min-height:calc(var(--space-xl) * 3);margin-block-start:var(--space-xs);resize:vertical;line-height:1.45}.chat-question-response__submit{flex:0 0 auto}.chat-question-response__submitted{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border:thin solid var(--border);border-radius:var(--radius-md);background:var(--card)}.chat-question-response__submitted pre{margin:0;white-space:pre-wrap;font-family:var(--font-mono);font-size:.875rem;line-height:1.45;color:var(--text)}.chat-question-response--compact .chat-question-response__actions{align-items:stretch;flex-direction:column}.chat-question-response--compact .chat-question-response__submit{width:100%}@media(max-width:768px){.chat-question-response{padding:var(--space-sm);border-radius:var(--radius-md)}.chat-question-response__header,.chat-question-response__actions{align-items:stretch;flex-direction:column}.chat-question-response__confirm-group{flex-direction:column}.chat-question-response__submit{width:100%}}.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%}}
|