@runfusion/fusion 0.74.0-beta.0 → 0.74.0-beta.2

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.
Files changed (105) hide show
  1. package/dist/bin.js +9855 -8554
  2. package/dist/child-process-worker.js +619 -47
  3. package/dist/client/.vite/manifest.json +265 -265
  4. package/dist/client/assets/{AgentDetailView-CUXS0Odh.js → AgentDetailView-DH4Cn5iG.js} +1 -1
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-CzjHjB5r.js → AgentPermissionPolicyEditor-BycC7HhP.js} +1 -1
  6. package/dist/client/assets/{AgentsView-B5stgI5m.js → AgentsView-Dkij8Sm8.js} +3 -3
  7. package/dist/client/assets/ChatView-DAsZY1We.js +13 -0
  8. package/dist/client/assets/{CommandCenter-BdEQ_ZOX.js → CommandCenter-jTzBo-pg.js} +1 -1
  9. package/dist/client/assets/{DevServerView-BHgAmF3y.js → DevServerView-CxlacYJp.js} +1 -1
  10. package/dist/client/assets/{DirectoryPicker-BQXVc5YW.js → DirectoryPicker-DsCk3Nsw.js} +1 -1
  11. package/dist/client/assets/{DocumentsView-CxN0Ptrj.js → DocumentsView-8EI6KNBY.js} +1 -1
  12. package/dist/client/assets/{EvalsView-DAgJtpO5.js → EvalsView-kYnaIk11.js} +1 -1
  13. package/dist/client/assets/{ExperimentalAgentOnboardingModal-NZcXkGrN.js → ExperimentalAgentOnboardingModal-ce6DROKD.js} +1 -1
  14. package/dist/client/assets/{GoalsView-Dwq7NW4j.js → GoalsView-BVlTtw-u.js} +1 -1
  15. package/dist/client/assets/{InsightsView-CUlL5NSC.js → InsightsView-BKQeROkb.js} +1 -1
  16. package/dist/client/assets/{MemoryView-WfHzJflp.js → MemoryView-DCzTnxsV.js} +1 -1
  17. package/dist/client/assets/{PiExtensionsManager-BS1dkauB.js → PiExtensionsManager-C94HwDz5.js} +1 -1
  18. package/dist/client/assets/{PluginManager-B1oLb0pn.js → PluginManager-C3DegklW.js} +1 -1
  19. package/dist/client/assets/{PullRequestView-Cdp662lx.js → PullRequestView-CrE89UL7.js} +1 -1
  20. package/dist/client/assets/{ReportModal-C92wQO-k.js → ReportModal-BD1ZUDdV.js} +1 -1
  21. package/dist/client/assets/{ResearchView-4-SoxmQv.js → ResearchView-eMiRw1EM.js} +1 -1
  22. package/dist/client/assets/{SecretsView-C5UQ1Mms.js → SecretsView-6qK8Idb7.js} +1 -1
  23. package/dist/client/assets/{SessionTerminal-BTjX9p3a.js → SessionTerminal-DtFLyUaK.js} +1 -1
  24. package/dist/client/assets/{SettingsModal-B37HBcKT.css → SettingsModal-BF1KzZ0q.css} +1 -1
  25. package/dist/client/assets/SettingsModal-BTfZlghk.css +1 -0
  26. package/dist/client/assets/{SettingsModal-BfHAE14s.js → SettingsModal-BkOSlfyr.js} +1 -1
  27. package/dist/client/assets/SettingsModal-DSq-_qwo.js +21 -0
  28. package/dist/client/assets/{SettingsTextareaRow-C2JqzQdD.js → SettingsTextareaRow-Btyx5kaR.js} +1 -1
  29. package/dist/client/assets/{SetupWizardModal-C1KmMVfU.js → SetupWizardModal-Blhx-dRt.js} +2 -2
  30. package/dist/client/assets/{SkillsView-DyLNdfDy.js → SkillsView-DGE5kYc3.js} +1 -1
  31. package/dist/client/assets/{TodoView-DyrniX19.js → TodoView-YSGI7ATd.js} +1 -1
  32. package/dist/client/assets/{WorkflowNodeEditor-Bh-Hn1Kx.js → WorkflowNodeEditor-CZiEThu2.js} +1 -1
  33. package/dist/client/assets/{agent-import-generation-C5pyefIj.js → agent-import-generation-DQeNZMAm.js} +1 -1
  34. package/dist/client/assets/{app-YM47G7Ks.js → app-DJIiVHdA.js} +1 -1
  35. package/dist/client/assets/{app-DNrauoYS.js → app-DMZ_RusZ.js} +3 -3
  36. package/dist/client/assets/{app-Bl764LdY.js → app-DaikOPcV.js} +3 -3
  37. package/dist/client/assets/{app-QmIotwFZ.js → app-Dn1u7zJ9.js} +3 -3
  38. package/dist/client/assets/{app-DdCnRHSe.js → app-DxTbBEMH.js} +3 -3
  39. package/dist/client/assets/{app-oUEtzFOj.js → app-hQw_x2KJ.js} +3 -3
  40. package/dist/client/assets/{architectureDiagram-3BPJPVTR-B6axGlaS.js → architectureDiagram-3BPJPVTR-DhaJNKa4.js} +1 -1
  41. package/dist/client/assets/{blockDiagram-GPEHLZMM-BENjJaZD.js → blockDiagram-GPEHLZMM-pKpg7gJU.js} +1 -1
  42. package/dist/client/assets/{c4Diagram-AAUBKEIU-Cl2qKhuO.js → c4Diagram-AAUBKEIU-DVPXKJnr.js} +1 -1
  43. package/dist/client/assets/channel-xFBfK0sX.js +1 -0
  44. package/dist/client/assets/{chunk-2J33WTMH-BWo7R8T7.js → chunk-2J33WTMH-CHt90T5z.js} +1 -1
  45. package/dist/client/assets/{chunk-4BX2VUAB-DiRoI7pq.js → chunk-4BX2VUAB-DsWFYy0a.js} +1 -1
  46. package/dist/client/assets/{chunk-55IACEB6-DPtv1GVO.js → chunk-55IACEB6-D8XiXEo8.js} +1 -1
  47. package/dist/client/assets/{chunk-727SXJPM-BVcm5ITs.js → chunk-727SXJPM-DlUYBn_Y.js} +1 -1
  48. package/dist/client/assets/{chunk-AQP2D5EJ-CFT4bmXK.js → chunk-AQP2D5EJ-BSdPOr9q.js} +1 -1
  49. package/dist/client/assets/{chunk-FMBD7UC4-BDcEHQ0o.js → chunk-FMBD7UC4-B9IAeBld.js} +1 -1
  50. package/dist/client/assets/{chunk-ND2GUHAM-CYlDBFdI.js → chunk-ND2GUHAM-CmxnYQrR.js} +1 -1
  51. package/dist/client/assets/{chunk-QZHKN3VN-3Wv3WxYt.js → chunk-QZHKN3VN-Dxp6Po_j.js} +1 -1
  52. package/dist/client/assets/classDiagram-4FO5ZUOK-BFBVD968.js +1 -0
  53. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BFBVD968.js +1 -0
  54. package/dist/client/assets/{cose-bilkent-S5V4N54A-BuMkKBMC.js → cose-bilkent-S5V4N54A-BNl3bhpS.js} +1 -1
  55. package/dist/client/assets/{dagre-BM42HDAG-D1P4z_OM.js → dagre-BM42HDAG-DFs7WCcz.js} +1 -1
  56. package/dist/client/assets/{dashboard-view-BgQBLynI.js → dashboard-view-DnoTcnIo.js} +1 -1
  57. package/dist/client/assets/{dashboard-view-DaRKU5oU.js → dashboard-view-ZGxLEL9r.js} +1 -1
  58. package/dist/client/assets/{dashboard-view-CcK2sH0v.js → dashboard-view-vc8kgLMs.js} +1 -1
  59. package/dist/client/assets/{diagram-2AECGRRQ-hmY-reWF.js → diagram-2AECGRRQ-C2PVozvu.js} +1 -1
  60. package/dist/client/assets/{diagram-5GNKFQAL-CGfRqm_0.js → diagram-5GNKFQAL-DFJ5b9H8.js} +1 -1
  61. package/dist/client/assets/{diagram-KO2AKTUF-BfKo4Jd4.js → diagram-KO2AKTUF-D335CW-c.js} +1 -1
  62. package/dist/client/assets/{diagram-LMA3HP47-BZqpNemd.js → diagram-LMA3HP47-DSfhroAW.js} +1 -1
  63. package/dist/client/assets/{diagram-OG6HWLK6-CxLTV4DH.js → diagram-OG6HWLK6-8iGveM-Z.js} +1 -1
  64. package/dist/client/assets/{erDiagram-TEJ5UH35-vw3tx2tK.js → erDiagram-TEJ5UH35-Xc56MEEi.js} +1 -1
  65. package/dist/client/assets/{flowDiagram-I6XJVG4X-OEm-Us2U.js → flowDiagram-I6XJVG4X-DjCU9WbD.js} +1 -1
  66. package/dist/client/assets/{folder-open-D_zgZHWi.js → folder-open-BRrB44UX.js} +1 -1
  67. package/dist/client/assets/{ganttDiagram-6RSMTGT7-C5bc1DG1.js → ganttDiagram-6RSMTGT7-CXQE1bea.js} +1 -1
  68. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DEvcWRBq.js → gitGraphDiagram-PVQCEYII--mrSABLC.js} +1 -1
  69. package/dist/client/assets/index-C2xsZoNG.js +2671 -0
  70. package/dist/client/assets/index-Dv-95s50.css +1 -0
  71. package/dist/client/assets/{infoDiagram-5YYISTIA-kFOE9wxd.js → infoDiagram-5YYISTIA-CTS_nljP.js} +1 -1
  72. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DvLbzHmR.js → ishikawaDiagram-YF4QCWOH-CpV5x3gk.js} +1 -1
  73. package/dist/client/assets/{journeyDiagram-JHISSGLW-ov6Tbcuz.js → journeyDiagram-JHISSGLW-BK2QCMnt.js} +1 -1
  74. package/dist/client/assets/{kanban-definition-UN3LZRKU-Dr0foW2M.js → kanban-definition-UN3LZRKU-B4srpspY.js} +1 -1
  75. package/dist/client/assets/{mermaid.core-CM55309V.js → mermaid.core-B8DVAt21.js} +4 -4
  76. package/dist/client/assets/{mindmap-definition-RKZ34NQL-xNyB6Z6o.js → mindmap-definition-RKZ34NQL-CsmmiPpA.js} +1 -1
  77. package/dist/client/assets/{pieDiagram-4H26LBE5-DlS5Kpga.js → pieDiagram-4H26LBE5-BahLDqf4.js} +1 -1
  78. package/dist/client/assets/{puzzle-BrEvi5DH.js → puzzle-BFPQsuIa.js} +1 -1
  79. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-D4z2CHAA.js → quadrantDiagram-W4KKPZXB-Bo3u0wTU.js} +1 -1
  80. package/dist/client/assets/{requirementDiagram-4Y6WPE33-Bcwt6-p9.js → requirementDiagram-4Y6WPE33-DYkYsz7d.js} +1 -1
  81. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C54N76yk.js → sankeyDiagram-5OEKKPKP-BCbh0BSY.js} +1 -1
  82. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DtqryztE.js → sequenceDiagram-3UESZ5HK-C2AP9GlE.js} +1 -1
  83. package/dist/client/assets/{shield-alert-DhxKVKek.js → shield-alert-tlZOi02c.js} +1 -1
  84. package/dist/client/assets/{standing-instructions-template-CdHJwmLI.js → standing-instructions-template-C0Rzv9Mr.js} +1 -1
  85. package/dist/client/assets/{stateDiagram-AJRCARHV-DQAvSrHw.js → stateDiagram-AJRCARHV-CARkH0ug.js} +1 -1
  86. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BzIGKq7y.js → stateDiagram-v2-BHNVJYJU-C2He043y.js} +1 -1
  87. package/dist/client/assets/{timeline-definition-PNZ67QCA-GDj_48Um.js → timeline-definition-PNZ67QCA-MvbYneEM.js} +1 -1
  88. package/dist/client/assets/{upload-B7GKZiF1.js → upload-DWK0F17Z.js} +1 -1
  89. package/dist/client/assets/{users-CBtvFVLM.js → users-1AkDfM14.js} +1 -1
  90. package/dist/client/assets/{vennDiagram-CIIHVFJN-PQDmLFbj.js → vennDiagram-CIIHVFJN-DOjzzLqc.js} +1 -1
  91. package/dist/client/assets/{wardley-L42UT6IY-GmGtXctI.js → wardley-L42UT6IY-Di70vhu2.js} +1 -1
  92. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Bv6slmsW.js → wardleyDiagram-YWT4CUSO-nK6ARhDv.js} +1 -1
  93. package/dist/client/assets/{xychartDiagram-2RQKCTM6-CK1RJHwB.js → xychartDiagram-2RQKCTM6-C7_y76B7.js} +1 -1
  94. package/dist/client/index.html +2 -2
  95. package/dist/client/version.json +1 -1
  96. package/dist/extension.js +6835 -5653
  97. package/package.json +1 -1
  98. package/dist/client/assets/ChatView-CpoOgZ4X.js +0 -13
  99. package/dist/client/assets/SettingsModal-BcnOOo9g.js +0 -21
  100. package/dist/client/assets/SettingsModal-CMLHZBhX.css +0 -1
  101. package/dist/client/assets/channel-CktWdAhK.js +0 -1
  102. package/dist/client/assets/classDiagram-4FO5ZUOK-CrUS4gHO.js +0 -1
  103. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CrUS4gHO.js +0 -1
  104. package/dist/client/assets/index-BinRUCFV.js +0 -2661
  105. package/dist/client/assets/index-DGmuyTtv.css +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runfusion/fusion",
3
- "version": "0.74.0-beta.0",
3
+ "version": "0.74.0-beta.2",
4
4
  "license": "MIT",
5
5
  "description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
6
6
  "homepage": "https://github.com/Runfusion/Fusion#readme",
@@ -1,13 +0,0 @@
1
- import{r as a,j as t,b as Ii}from"./vendor-react-SZ_qB27O.js";import{c as Qs,aq as Et,ao as bt,ap as xa,bx as Ss,dr as Li,ds as Pi,dt as ra,au as X,du as Fi,bw as Dt,dv as At,bq as wa,dw as $i,dx as _i,dy as Bi,dz as zi,dA as Oi,dB as Ui,bc as Hi,cN as ya,dC as ye,aX as Ki,bL as Zs,bv as bn,dD as Vi,al as xn,dE as Wi,dF as Xi,dG as qi,bo as Gi,aI as Yi,b1 as pn,W as Qi,cW as Zi,dH as Ji,dI as eo,f as to,aV as no,dJ as ao,dK as Js,dL as ei,dM as so,df as io,J as oo,dN as ro,dO as co,dP as lo,dQ as uo,dR as Ms,y as mo,q as ho,u as fo,dd as ca,C as dn,dS as un,dT as Ns,v as la,P as gt,V as go,bt as Rs,cZ as js,cY as po,X as As,aH as vo,dU as bo,x as da,bK as xo,dV as ua,dW as Ts,dX as ma,dY as Es,dZ as Ds,d_ as wo,d$ as yo,bI as Is}from"./index-BinRUCFV.js";import{u as Be}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as Ls}from"./SessionTerminal-BTjX9p3a.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";import"./shield-alert-DhxKVKek.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 ko=[["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"}]],ti=Qs("hash",ko);/**
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 Co=[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]],So=Qs("tag",Co);function mn(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function Mo(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function ha(i,r){const u=Mo(),g=r?.warm===!0,d=mn(),h=new Map;let C=!1,S=!1;return{mark(R){C||S||!u||h.has(R)||h.set(R,mn())},complete:R=>{if(!u||C||S){C=!0;return}C=!0,h.set("complete",mn());const E=Array.from(h.entries()).sort((T,b)=>T[1]-b[1]);let s=d;const M={};for(const[T,b]of E)M[T]=Math.max(0,b-s),s=b;const k=Math.max(0,mn()-d);try{console.debug("[room-open]",{roomId:i,warm:g,totalMs:k,phases:M,...R??{}})}catch{}},cancel(){S=!0,C=!0}}}const _e="fusion:chat-active-room";class ni extends Error{roomId;constructor(r,u){super(r),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=u}}function ka(i){return[...i].sort((r,u)=>new Date(u.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function Xe(i,r){const u=i.findIndex(d=>d.id===r.id);if(u===-1)return ka([r,...i]);const g=[...i];return g[u]=r,ka(g)}function Ee(i){try{return JSON.parse(i.data)}catch{return null}}function fa(i){return i.slice().reverse()}function No(i,r,u){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:i,role:"user",content:r,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...u?.length?{attachments:u}:{},createdAt:new Date().toISOString()}}function Ps(i,r,u){if(i.some(d=>d.id===r.id))return i;const g=u?i.findIndex(d=>d.id===u):-1;if(g>=0){const d=[...i];return d[g]=r,d}if(r.role==="user"){const d=i.findIndex(h=>h.role==="user"&&h.id.startsWith("temp-")&&h.content.trim()===r.content.trim());if(d>=0){const h=[...i];return h[d]=r,h}}return[...i,r]}function Ro(i,r){const{t:u}=Be("app"),g=`${Et.CHAT_ROOMS}:${i??"global"}`,d=`${Et.ACTIVE_CHAT_ROOM_ID}:${i??"global"}`,h=a.useCallback(c=>`${Et.CHAT_ROOM_MESSAGES_PREFIX}${i??"global"}:${c}`,[i]),C=a.useCallback(c=>`${Et.CHAT_ROOM_MEMBERS_PREFIX}${i??"global"}:${c}`,[i]),[S,x]=a.useState(()=>{const c=bt(g,{maxAgeMs:xa});return Array.isArray(c)?c:[]}),[R,E]=a.useState(()=>S.length===0),[s,M]=a.useState(null),[k,T]=a.useState(()=>{const c=bt(d,{maxAgeMs:Ss});return c?S.find(p=>p.id===c)??null:null}),[b,l]=a.useState([]),[z,N]=a.useState([]),[W,$]=a.useState(!1),K=a.useRef(S),I=a.useRef(k),Z=a.useRef(0),Y=a.useRef(i);K.current=S,I.current=k,Y.current!==i&&(Y.current=i,Z.current+=1);const q=a.useCallback(async c=>{if(!c){l([]),N([]),$(!1);return}const p=ha(c.id,{warm:!1});p.mark("select");const y=bt(h(c.id),{maxAgeMs:Li}),f=bt(C(c.id),{maxAgeMs:xa}),j=Array.isArray(y)&&y.length>0,F=Array.isArray(f)&&f.length>0;j||F?(p.mark("cache-hit"),j&&(N(y),p.mark("hydrate")),F&&l(f),$(!1)):(N([]),$(!0));try{const[J,ge]=await Promise.all([Pi(c.id,i),ra(c.id,{limit:100,order:"desc"},i)]);p.mark("members-fetch"),p.mark("messages-fetch"),X(C(c.id),J.members,{maxBytes:5e5});const ne=fa(ge.messages);X(h(c.id),ne,{maxBytes:5e5}),I.current?.id===c.id&&(l(J.members),N(ne),p.mark("hydrate"))}catch{!j&&!F&&(l([]),N([]))}finally{$(!1),p.complete({warm:j,membersCached:F})}},[C,h,i]),D=a.useCallback(async()=>{K.current.length===0&&E(!0);try{const c=await Fi({},i),p=ka(c.rooms);x(p),X(g,p,{maxBytes:5e5}),M(null);const y=bt(d,{maxAgeMs:Ss})??Dt(_e,i);if(y){const f=p.find(j=>j.id===y)??null;f?(T(f),q(f)):(At(_e,i),X(d,"",{maxBytes:5e5}))}}catch(c){const p=c instanceof Error?c.message:u("chatRooms.error.failedToLoad","Failed to load chat rooms");M(p),r?.(p,"error")}finally{E(!1)}},[d,r,q,i,g]),_=a.useCallback(c=>{if(!c){I.current=null,T(null),At(_e,i),X(d,"",{maxBytes:5e5}),q(null);return}const p=K.current.find(y=>y.id===c)??null;I.current=p,T(p),p&&(wa(_e,p.id,i),X(d,p.id,{maxBytes:5e5}),q(p))},[d,q,i]),G=a.useCallback(async c=>{const y=(await $i({name:c.name,memberAgentIds:c.memberAgentIds},i)).room;return x(f=>Xe(f,y)),I.current=y,T(y),wa(_e,y.id,i),X(d,y.id,{maxBytes:5e5}),await q(y),y},[d,q,i]),O=a.useCallback(async(c,p)=>{const f=(await _i(c,p,i)).room;return x(j=>Xe(j,f)),I.current?.id===f.id&&(I.current=f,T(f)),f},[i]),A=a.useCallback(async c=>{await Bi(c,i),x(p=>p.filter(y=>y.id!==c)),X(h(c),[],{maxBytes:5e5}),X(C(c),[],{maxBytes:5e5}),I.current?.id===c&&(I.current=null,T(null),l([]),N([]),At(_e,i),X(d,"",{maxBytes:5e5}))},[d,C,h,i]),H=a.useCallback(async(c,p)=>{const y=I.current,f=y?.id;if(!f)throw new Error(u("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const j=ha(f,{warm:!1}),F=p?.files?.map(ne=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:ne.name,originalName:ne.name,mimeType:ne.type||"application/octet-stream",size:ne.size,createdAt:new Date().toISOString()})),J=No(f,c,F?.length?F:p?.attachments);I.current?.id===f&&N(ne=>{const le=[...ne,J];return X(h(f),le,{maxBytes:5e5}),le});let ge=!1;try{const ne=[];if(p?.files?.length)for(const pe of p.files)try{const qe=await zi(f,pe,i);ne.push(qe.attachment)}catch{throw new Error(u("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:pe.name}))}const le=[...p?.attachments??[],...ne],De=await Oi(f,{content:c,...le.length?{attachments:le}:{}},i);ge=!0,De.message?.createdAt&&y&&x(pe=>Xe(pe,{...y,updatedAt:De.message.createdAt})),I.current?.id===f&&N(pe=>{const qe=Ps(pe,De.message,J.id);return X(h(f),qe,{maxBytes:5e5}),qe});const de=await ra(f,{limit:100,order:"desc"},i),Ie=fa(de.messages);if(X(h(f),Ie,{maxBytes:5e5}),I.current?.id!==f)return;N(Ie),j.mark("hydrate")}catch(ne){let le=null;try{const de=await ra(f,{limit:100,order:"desc"},i);le=fa(de.messages),X(h(f),le,{maxBytes:5e5}),I.current?.id===f&&(N(le),j.mark("hydrate"))}catch{!ge&&I.current?.id===f&&N(de=>{const Ie=de.filter(pe=>pe.id!==J.id);return X(h(f),Ie,{maxBytes:5e5}),Ie})}const De=le?.some(de=>de.role==="user"&&de.content.trim()===J.content.trim());if(ge||De){const de=ne instanceof Error&&ne.message.trim()?ne.message:u("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new ni(de,f)}throw ne}finally{j.complete({source:"send-room-message"})}},[h,i]),ce=a.useCallback(async c=>{!c||!K.current.some(p=>p.id===c)||(await Ui(c,i),X(h(c),[],{maxBytes:5e5}),I.current?.id===c&&N([]))},[h,i]);return a.useEffect(()=>{D()},[D]),a.useEffect(()=>{const c=Z.current,p=i?`/api/events?projectId=${encodeURIComponent(i)}`:"/api/events";return Hi(p,{onReconnect:()=>{ya({view:"useChatRooms",trigger:"sse-reconnect",projectId:i,replayAttempted:!1});const y=I.current?.id;if(y){const f=ha(y,{warm:!0});f.mark("sse-reconnect-refresh"),D().finally(()=>f.complete({source:"sse-reconnect"}));return}D()},events:{"chat:room:created":y=>{if(Z.current!==c)return;const f=Ee(y);f&&x(j=>Xe(j,f))},"chat:room:updated":y=>{if(Z.current!==c)return;const f=Ee(y);f&&(x(j=>Xe(j,f)),I.current?.id===f.id&&(I.current=f,T(f)))},"chat:room:deleted":y=>{if(Z.current!==c)return;const f=Ee(y);f?.id&&(x(j=>j.filter(F=>F.id!==f.id)),X(h(f.id),[],{maxBytes:5e5}),X(C(f.id),[],{maxBytes:5e5}),I.current?.id===f.id&&(I.current=null,T(null),l([]),N([]),At(_e,i),X(d,"",{maxBytes:5e5})))},"chat:room:member:added":y=>{if(Z.current!==c)return;const f=Ee(y);!f||I.current?.id!==f.roomId||l(j=>{if(j.some(J=>J.agentId===f.agentId))return j;const F=[...j,f];return X(C(f.roomId),F,{maxBytes:5e5}),F})},"chat:room:member:removed":y=>{if(Z.current!==c)return;const f=Ee(y);!f||I.current?.id!==f.roomId||l(j=>{const F=j.filter(J=>J.agentId!==f.agentId);return X(C(f.roomId),F,{maxBytes:5e5}),F})},"chat:room:message:added":y=>{if(Z.current!==c)return;const f=Ee(y);f&&(x(j=>{const F=j.find(J=>J.id===f.roomId);return F?Xe(j,{...F,updatedAt:f.createdAt}):j}),I.current?.id===f.roomId&&N(j=>{const F=Ps(j,f);return F===j?j:(X(h(f.roomId),F,{maxBytes:5e5}),F)}))},"chat:room:message:updated":y=>{if(Z.current!==c)return;const f=Ee(y);!f||I.current?.id!==f.roomId||N(j=>{const F=j.map(J=>J.id===f.id?f:J);return X(h(f.roomId),F,{maxBytes:5e5}),F})},"chat:room:message:deleted":y=>{if(Z.current!==c)return;const f=Ee(y);f?.id&&N(j=>{const F=j.filter(ge=>ge.id!==f.id),J=I.current?.id;return J&&X(h(J),F,{maxBytes:5e5}),F})},"chat:room:messages:cleared":y=>{if(Z.current!==c)return;const f=Ee(y);f?.roomId&&(X(h(f.roomId),[],{maxBytes:5e5}),I.current?.id===f.roomId&&N([]),x(j=>{const F=j.find(J=>J.id===f.roomId);return F?Xe(j,{...F,updatedAt:new Date().toISOString()}):j}))}}})},[d,C,h,i,D]),a.useEffect(()=>{k&&(S.some(c=>c.id===k.id)||(I.current=null,T(null),l([]),N([]),At(_e,i),X(d,"",{maxBytes:5e5})))},[k,d,i,S]),{rooms:S,roomsLoading:R,roomsError:s,activeRoom:k,activeRoomMembers:b,messages:z,messagesLoading:W,selectRoom:_,createRoom:G,updateRoomSettings:O,deleteRoom:A,sendRoomMessage:H,clearRoom:ce,refreshRooms:D}}const Tt={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},Fs=200;function Ca(i){if(!i)return null;const r=new Date(i).getTime();return Number.isFinite(r)?r:null}function ai(i){const r=Object.entries(i);if(r.length<=Fs)return i;const u=r.map(([g,d])=>({id:g,timestamp:d,value:Ca(d)??0})).sort((g,d)=>d.value-g.value).slice(0,Fs);return Object.fromEntries(u.map(({id:g,timestamp:d})=>[g,d]))}function hn(i){if(!i)return{};try{const r=JSON.parse(i);if(!r||typeof r!="object")return{};const u={};for(const[g,d]of Object.entries(r))typeof g=="string"&&typeof d=="string"&&(u[g]=d);return ai(u)}catch{return{}}}function jo(i){const[r,u]=a.useState(()=>{try{return hn(Dt(Tt.direct,i))}catch{return{}}}),[g,d]=a.useState(()=>{try{return hn(Dt(Tt.room,i))}catch{return{}}});a.useEffect(()=>{try{u(hn(Dt(Tt.direct,i)))}catch{u({})}try{d(hn(Dt(Tt.room,i)))}catch{d({})}},[i]);const h=a.useMemo(()=>({direct:r,room:g}),[r,g]),C=a.useCallback((s,M)=>{const k=ai(M);try{wa(Tt[s],JSON.stringify(k),i)}catch{}return k},[i]),S=a.useCallback((s,M)=>{if(s==="direct"){u(k=>C(s,M(k)));return}d(k=>C(s,M(k)))},[C]),x=a.useCallback((s,M,k)=>{const T=Ca(k);if(T===null)return!1;const b=h[s][M],l=Ca(b);return l===null?!0:T>l},[h]),R=a.useCallback((s,M,k)=>{if(!M)return;const T=k??new Date().toISOString();S(s,b=>({...b,[M]:T}))},[S]),E=a.useCallback((s,M)=>{M.length!==0&&S(s,k=>{const T={...k};for(const b of M)b.id&&(T[b.id]=b.lastActivityAt??new Date().toISOString());return T})},[S]);return{isUnread:x,markRead:R,markAllRead:E}}const Ao=["",...Vi];function $s({level:i,onChange:r,defaultThinkingLevel:u="off",showTargetSection:g=!0,models:d=[],favoriteProviders:h=[],favoriteModels:C=[],agents:S=[],agentId:x,modelProvider:R,modelId:E,onChangeModel:s,disabled:M=!1}){const{t:k}=Be("app"),[T,b]=a.useState(!1),[l,z]=a.useState(()=>x&&x!==ye?"agent":"model"),N=a.useRef(null),W=i??"",$=R&&E?`${R}/${E}`:"",K=x&&x!==ye?x:"",I=W!==""||g&&(!!$||!!K),Z="chat-thinking-level-listbox";a.useEffect(()=>{if(!T)return;const c=p=>{const y=p.target;if(!(y instanceof Node))return;const f=N.current?.contains(y),j=y instanceof Element&&!!y.closest(".model-combobox-dropdown--portal");!f&&!j&&b(!1)};return document.addEventListener("pointerdown",c),()=>document.removeEventListener("pointerdown",c)},[T]),a.useEffect(()=>{b(!1),z(K?"agent":"model")},[W,K,$]);const Y=a.useMemo(()=>S.find(c=>c.id===K),[S,K]),q=c=>c===""?k("modelSelection.thinkingDefault","Default ({{level}})",{level:u??"off"}):k(`models.options.${c}`,c==="xhigh"?"Very High":c.charAt(0).toUpperCase()+c.slice(1)),D=c=>{b(!1),r(c)},_=c=>{const p=c.indexOf("/");p<=0||(b(!1),s?.({modelProvider:c.slice(0,p),modelId:c.slice(p+1)}))},G=c=>{c&&(b(!1),s?.({agentId:c}))},O=c=>{z(c)},A=c=>{c.key==="Escape"&&b(!1)},H=(c,p)=>{if(c.key==="Escape"){c.preventDefault(),b(!1);return}(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),D(p))},ce=(c,p)=>{if(c.key==="Escape"){c.preventDefault(),b(!1);return}(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),G(p))};return t.jsxs("div",{className:"chat-thinking-level-root",ref:N,children:[t.jsx("button",{type:"button",className:`btn-icon chat-thinking-btn${I?" chat-thinking-btn--active":""}`,"data-testid":"chat-thinking-btn","aria-haspopup":"dialog","aria-expanded":T,"aria-controls":Z,"aria-label":k("chat.thinkingLevelButton","Thinking level"),title:k("chat.thinkingLevelButton","Thinking level"),disabled:M,onClick:()=>b(c=>!c),onKeyDown:A,children:t.jsx(Ki,{size:16})}),T?t.jsxs("div",{className:"chat-thinking-popover",role:"presentation","data-testid":"chat-thinking-popover",children:[g?t.jsxs("section",{className:"chat-thinking-target-section","aria-label":k("chat.modelAgentSection","Model / Agent"),children:[t.jsx("div",{className:"chat-thinking-section-title",children:k("chat.modelAgentSection","Model / Agent")}),t.jsxs("div",{className:"chat-thinking-mode-toggle","data-testid":"chat-thinking-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-thinking-mode-btn${l==="model"?" chat-thinking-mode-btn--active":""}`,"data-testid":"chat-thinking-mode-model","aria-pressed":l==="model",onPointerDown:c=>{c.button===0&&O("model")},onClick:c=>{c.detail===0&&O("model")},children:k("chat.newChatModeModel","Model")}),t.jsx("button",{type:"button",className:`chat-thinking-mode-btn${l==="agent"?" chat-thinking-mode-btn--active":""}`,"data-testid":"chat-thinking-mode-agent","aria-pressed":l==="agent",onPointerDown:c=>{c.button===0&&O("agent")},onClick:c=>{c.detail===0&&O("agent")},children:k("chat.newChatModeAgent","Agent")})]}),l==="model"?t.jsxs("div",{className:"chat-thinking-model-picker","data-testid":"chat-thinking-model-picker",children:[t.jsx(Zs,{models:d,value:$,onChange:_,label:k("chat.newChatModeModel","Model"),placeholder:k("chat.selectModel","Select a model"),disabled:!s||d.length===0,favoriteProviders:h,favoriteModels:C,menuWidth:"readable"}),d.length===0?t.jsx("div",{className:"chat-thinking-empty","data-testid":"chat-thinking-model-empty",children:k("chat.noModelsAvailable","No models available")}):null]}):t.jsx("div",{className:"chat-thinking-agent-list","data-testid":"chat-thinking-agent-list",children:S.length===0?t.jsx("div",{className:"chat-thinking-empty","data-testid":"chat-thinking-agent-empty",children:k("chat.noAgentsAvailable","No agents available")}):S.map(c=>{const p=K===c.id;return t.jsxs("button",{type:"button",className:`chat-thinking-agent-item${p?" chat-thinking-agent-item--selected":""}`,"data-testid":`chat-thinking-agent-${c.id}`,"aria-pressed":p,disabled:!s,onClick:()=>G(c.id),onKeyDown:y=>ce(y,c.id),children:[t.jsx(bn,{size:16}),t.jsx("span",{className:"chat-thinking-agent-name",children:c.name||c.id}),c.role?t.jsx("span",{className:"chat-thinking-agent-role",children:c.role}):null]},c.id)})}),Y?t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-agent",children:k("chat.currentAgentTarget","Current agent: {{name}}",{name:Y.name||Y.id})}):$?t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-model",children:k("chat.currentModelTarget","Current model: {{model}}",{model:$})}):t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-default",children:k("chat.currentDefaultTarget","Using the default chat target")})]}):null,t.jsxs("section",{className:"chat-thinking-level-section","aria-label":k("chat.thinkingLevelButton","Thinking level"),children:[t.jsx("div",{className:"chat-thinking-section-title",children:k("chat.thinkingLevelSection","Thinking level")}),t.jsx("div",{id:Z,className:"chat-thinking-popover-list",role:"listbox","aria-label":k("chat.thinkingLevelButton","Thinking level"),children:Ao.map(c=>{const p=W===c;return t.jsx("button",{type:"button",role:"option","aria-selected":p,className:`chat-thinking-popover-option${p?" active":""}`,"data-testid":`chat-thinking-option-${c||"default"}`,onClick:()=>D(c),onKeyDown:y=>H(y,c),children:q(c)},c||"default")})})]})]}):null]})}function _s(i){return i.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function si(i,r){const u=r.trim();if(!u)return!0;const g=_s(u);return _s(i).includes(g)||i.toLowerCase().includes(u.toLowerCase())}function Bs({agents:i,filter:r,highlightedIndex:u,visible:g,onSelect:d,position:h="below",roomMemberIds:C,roomName:S}){const{t:x}=Be("app"),R=a.useMemo(()=>i.filter(b=>si(b.name,r)),[i,r]),E=!!C,s=E&&r.trim().length>0,M=a.useMemo(()=>E?R.filter(b=>C?.has(b.id)):R,[R,C,E]),k=a.useMemo(()=>E?R.filter(b=>!C?.has(b.id)):[],[R,C,E]),T=s?[...M,...k]:M;return g?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${h}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":x("agentMention.suggestionsLabel","Agent mention suggestions"),children:T.length===0?t.jsx("div",{className:"agent-mention-empty",children:x("agentMention.noAgentsFound","No agents found")}):t.jsxs(t.Fragment,{children:[E&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:S?x("agentMention.membersOf","Members of #{{roomName}}",{roomName:S}):x("agentMention.roomMembers","Room members")}),M.map((b,l)=>t.jsxs("button",{type:"button",className:`agent-mention-item${l===u?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${b.id}`,onMouseDown:z=>z.preventDefault(),onClick:()=>d(b),role:"option","aria-selected":l===u,children:[t.jsx(xn,{agent:b,size:20}),E&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":x("agentMention.roomMemberBadge","Room member")}),t.jsx("span",{className:"agent-mention-name",children:b.name}),t.jsx("span",{className:"agent-mention-role",children:b.role})]},b.id)),E&&!s&&k.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:x("agentMention.typeToSearch","Type to search other agents")}),E&&s&&k.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:x("agentMention.otherAgents","Other agents")}),k.map((b,l)=>{const z=M.length+l;return t.jsxs("button",{type:"button",className:`agent-mention-item${z===u?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${b.id}`,onMouseDown:N=>N.preventDefault(),onClick:()=>d(b),role:"option","aria-selected":z===u,children:[t.jsx(xn,{agent:b,size:20}),t.jsx("span",{className:"agent-mention-name",children:b.name}),t.jsx("span",{className:"agent-mention-role",children:b.role})]},b.id)})]})]})}):null}function To(i,r){return i+r}function Eo({visible:i,position:r,tasks:u,files:g,selectedIndex:d,onSelectTask:h,onSelectFile:C,loading:S}){const{t:x}=Be("app");if(!i)return null;const R=u.length>0,E=g.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:r.top,left:r.left},"data-testid":"file-mention-popup",onMouseDown:s=>{s.preventDefault()},children:[S&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!S&&!R&&!E&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:x("fileMention.empty","No tasks or files found")}),!S&&(R||E)&&t.jsxs("div",{className:"file-mention-popup-groups",children:[R&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:x("fileMention.taskHeader","Tasks")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":x("fileMention.taskMatches","Task matches"),children:u.map((s,M)=>{const k=M;return t.jsxs("li",{className:`file-mention-popup-item${k===d?" file-mention-popup-item--selected":""}`,onClick:()=>h(s),role:"option","aria-selected":k===d,"data-testid":`task-mention-item-${k}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(ti,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsxs("div",{className:"file-mention-popup-task-row",children:[t.jsx("span",{className:"file-mention-popup-task-id",children:s.id}),t.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${s.column}`,children:s.column})]}),t.jsx("span",{className:"file-mention-popup-item-path",children:s.title})]})]},s.id)})})]}),E&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:x("fileMention.fileHeader","Files")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":x("fileMention.fileMatches","File matches"),children:g.map((s,M)=>{const k=To(u.length,M),T=Wi(s.path);return t.jsxs("li",{className:`file-mention-popup-item${k===d?" file-mention-popup-item--selected":""}`,onClick:()=>C(s),role:"option","aria-selected":k===d,"data-testid":`file-mention-item-${k}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Xi,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:s.name}),T&&t.jsx("span",{className:"file-mention-popup-item-path",children:T})]})]},s.path)})})]})]})]})}function Do(i,r=[],u){const g=i.trim().replace(/^#/,""),d=(C,S)=>u?u(C,S):S;if(!g)return{ok:!1,error:d("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(g))return{ok:!1,error:d("createRoom.lowercase","Use lowercase letters only.")};const h=g.toLowerCase();return h.length>80?{ok:!1,error:d("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(h)?/^[-_]|[-_]$/.test(h)?{ok:!1,error:d("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:r.some(C=>C.toLowerCase()===h)?{ok:!1,error:d("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:h}:{ok:!1,error:d("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function Io({isOpen:i,onClose:r,onCreate:u,projectId:g,existingRoomNames:d=[]}){const{t:h}=Be("app"),[C,S]=a.useState(""),[x,R]=a.useState([]),[E,s]=a.useState(""),[M,k]=a.useState([]),[T,b]=a.useState(!1),[l,z]=a.useState(null),[N,W]=a.useState(!1),$=a.useRef(null),K=a.useRef(null),[I,Z]=a.useState(void 0);a.useLayoutEffect(()=>{i&&Z(qi())},[i]),a.useEffect(()=>{i&&(K.current=document.activeElement instanceof HTMLElement?document.activeElement:null,b(!0),z(null),Gi(void 0,g).then(A=>R(A)).catch(()=>{R([]),z(h("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>b(!1)))},[i,g]),a.useEffect(()=>{if(!i){S(""),s(""),k([]),z(null),W(!1);return}const A=window.requestAnimationFrame(()=>$.current?.focus());return()=>window.cancelAnimationFrame(A)},[i]),a.useEffect(()=>{if(!i)return;const A=H=>{H.key==="Escape"&&r()};return document.addEventListener("keydown",A),()=>document.removeEventListener("keydown",A)},[i,r]),a.useEffect(()=>{i||K.current?.focus()},[i]);const Y=a.useMemo(()=>Do(C,d,h),[C,d,h]),q=a.useMemo(()=>{const A=E.trim().toLowerCase();return A?x.filter(H=>H.name.toLowerCase().includes(A)):x},[x,E]),D=a.useMemo(()=>x.filter(A=>M.includes(A.id)),[x,M]),_=Y.ok&&M.length>0&&!N&&!T;if(!i)return null;const G=A=>{N||k(H=>H.includes(A)?H.filter(ce=>ce!==A):[...H,A])},O=async()=>{if(!Y.ok){z(Y.error);return}if(M.length===0){z(h("createRoom.selectMember","Select at least one member."));return}z(null),W(!0);try{await u({name:Y.name,displayName:`#${Y.name}`,memberAgentIds:M}),r()}catch(A){z(A instanceof Error?A.message:h("createRoom.failedCreate","Failed to create room."))}finally{W(!1)}};return Ii.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:A=>A.target===A.currentTarget&&r(),style:I?{zIndex:I}:void 0,children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":h("createRoom.title","Create room"),onClick:A=>A.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:h("createRoom.title","Create room")}),t.jsx("button",{type:"button",className:"modal-close","aria-label":h("actions.close","Close"),onClick:r,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:h("createRoom.nameLabel","Room name")}),t.jsxs("div",{className:"create-room-modal-name-field",children:[t.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),t.jsx("input",{ref:$,id:"create-room-name",className:"input",value:C,disabled:N,onChange:A=>{const H=A.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();S(H)}})]}),!Y.ok&&t.jsx("div",{className:"form-error",children:Y.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:h("createRoom.members","Members")}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:h("createRoom.searchAgents","Search agents"),value:E,disabled:N,onChange:A=>s(A.target.value)})]}),D.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:D.map(A=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>G(A.id),disabled:N,children:[A.name," ×"]},A.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:T?t.jsx("div",{className:"create-room-modal-empty",children:t.jsx(Yi,{label:h("createRoom.loadingAgents","Loading agents...")})}):q.length===0?t.jsx("div",{className:"create-room-modal-empty",children:x.length===0?h("createRoom.noAgents","No agents in this project yet."):h("createRoom.noMatch","No agents match your search.")}):q.map(A=>{const H=M.includes(A.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${H?" create-room-modal-member-row--selected":""}`,onClick:()=>G(A.id),disabled:N,children:[t.jsx(xn,{agent:A,size:20}),t.jsx("span",{children:A.name}),t.jsx("span",{className:"create-room-modal-member-role",children:A.role})]},A.id)})}),l&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:l})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:N,children:h("actions.cancel","Cancel")}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void O(),disabled:!_,children:N?h("createRoom.creating","Creating..."):h("createRoom.create","Create room")})]})]})}),document.body)}function Lo({cliSessionId:i,tier:r,projectId:u,renderTranscript:g,renderComposer:d,queuedCount:h=0,terminalProps:C}){const{t:S}=Be("app"),x=r==="generic",[R,E]=a.useState(x?"terminal":"transcript");if(x)return t.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:t.jsx(Ls,{sessionId:i,projectId:u,...C})});const s=R==="terminal";return t.jsxs("div",{className:"cli-chat-surface","data-tier":r,"data-view":R,children:[t.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":S("cliChat.viewToggleLabel","Chat view"),children:[t.jsxs("button",{type:"button",role:"tab","aria-selected":!s,className:`cli-chat-surface__tab${s?"":" is-active"}`,onClick:()=>E("transcript"),children:[t.jsx(pn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:S("cliChat.transcriptTab","Transcript")})]}),t.jsxs("button",{type:"button",role:"tab","aria-selected":s,className:`cli-chat-surface__tab${s?" is-active":""}`,onClick:()=>E("terminal"),children:[t.jsx(Qi,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:S("cliChat.terminalTab","Terminal")})]})]}),t.jsx("div",{className:"cli-chat-surface__body",children:s?t.jsx(Ls,{sessionId:i,projectId:u,...C}):g()}),!s&&t.jsxs("div",{className:"cli-chat-surface__composer",children:[h>0&&t.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:S("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:h})}),d()]})]})}const Po=200,Fo=8,$o=8;function zs(){return new DOMException("The operation was aborted.","AbortError")}function Os(i,r){return r.aborted?Promise.reject(zs()):new Promise((u,g)=>{const d=()=>g(zs());r.addEventListener("abort",d,{once:!0}),i.then(h=>{r.removeEventListener("abort",d),u(h)},h=>{r.removeEventListener("abort",d),g(h)})})}function Us(i,r,u){const g=i.slice(0,r),d=i.slice(r+1),h=d.match(/[\s]|$/),C=h?h.index??d.length:d.length,S=d.slice(C);return`${g}${u}${S}`}function _o(i={}){const{projectId:r,workspace:u="project"}=i,[g,d]=a.useState(!1),[h,C]=a.useState(""),[S,x]=a.useState(-1),[R,E]=a.useState([]),[s,M]=a.useState([]),[k,T]=a.useState(!1),[b,l]=a.useState(0),z=a.useRef(null),N=a.useRef(null),W=[...R.map(D=>({kind:"task",task:D})),...s.map(D=>({kind:"file",file:D}))];a.useEffect(()=>()=>{z.current&&clearTimeout(z.current),N.current?.abort()},[]);const $=a.useCallback((D,_)=>{if(_<0||_>D.length){d(!1);return}const G=O=>/[a-zA-Z0-9/_.-]/.test(O);for(let O=_-1;O>=0;O--){if(D[O]==="#"){if(O===0){const H=D.slice(O+1,_);x(O),C(H),l(0),d(!0);return}const A=D[O-1];if(/[\s,.;:!?'"()[\]{}]/.test(A)){const H=D.slice(O+1,_);x(O),C(H),l(0),d(!0);return}d(!1);return}if(!G(D[O])){d(!1);return}}d(!1)},[]),K=a.useCallback(()=>{N.current?.abort(),d(!1),C(""),x(-1),E([]),M([]),l(0),T(!1)},[]),I=a.useCallback(async D=>{if(!D.trim()){E([]),M([]),T(!1);return}N.current?.abort();const _=new AbortController;N.current=_;try{T(!0);const[G,O]=await Promise.allSettled([Os(Zi(20,0,r,D),_.signal),Os(Ji(D,u,r),_.signal)]);if(_.signal.aborted)return;const A=G.status==="fulfilled"?G.value.slice(0,Fo).map(ce=>({id:ce.id,title:ce.title??"",column:ce.column})):[],H=O.status==="fulfilled"?O.value.files.slice(0,$o):[];E(A),M(H),l(0)}catch(G){G.name!=="AbortError"&&(E([]),M([]))}finally{_.signal.aborted||T(!1)}},[u,r]);a.useEffect(()=>{if(g)return z.current&&clearTimeout(z.current),z.current=setTimeout(()=>{I(h)},Po),()=>{z.current&&clearTimeout(z.current)}},[h,g,I]);const Z=a.useCallback((D,_)=>!g||S<0?_:Us(_,S,`#${D.id}`),[g,S]),Y=a.useCallback((D,_)=>!g||S<0?_:Us(_,S,`#${D.path}`),[g,S]),q=a.useCallback((D,_)=>{if(!g||W.length===0)return!1;switch(D.key){case"ArrowDown":return D.preventDefault(),l(G=>Math.min(G+1,W.length-1)),!0;case"ArrowUp":return D.preventDefault(),l(G=>Math.max(G-1,0)),!0;case"Enter":case"Tab":return W[b]?(D.preventDefault(),!0):!1;case"Escape":return D.preventDefault(),K(),!0;default:return!1}},[g,W,b,K]);return{mentionActive:g,tasks:R,files:s,combinedItems:W,loading:k,mentionQuery:h,selectedIndex:b,setSelectedIndex:l,detectMention:$,selectTask:Z,selectFile:Y,dismissMention:K,handleKeyDown:q}}const ga=new Map,vn=new Map;function Ma(i){return i??"global"}function Sa(i){return`${Et.DISCOVERED_SKILLS_PREFIX}${Ma(i)}`}function pt(i){return bt(Sa(i),{maxAgeMs:xa})}function Bo(i,r){for(const u of vn.get(i)??[])u(r)}async function zo(i){const r=Ma(i),u=ga.get(r);if(u)return u;const g=to(i).finally(()=>{ga.delete(r)});return ga.set(r,g),g}function Oo(i){const[r,u]=a.useState(()=>pt(i)??[]),[g,d]=a.useState(()=>pt(i)===null),h=a.useRef(pt(i)!==null),C=Ma(i);a.useEffect(()=>{const R=pt(i)??[];u(R),d(pt(i)===null),h.current=pt(i)!==null},[i]),a.useEffect(()=>{const R=vn.get(C)??new Set;return R.add(u),vn.set(C,R),()=>{R.delete(u),R.size===0&&vn.delete(C)}},[C]);const S=a.useCallback(async()=>{try{const R=await zo(i);h.current=!0,X(Sa(i),R,{maxBytes:5e5}),Bo(C,R)}catch{h.current||eo(Sa(i))}finally{d(!1)}},[i,C]);a.useEffect(()=>{S()},[S]);const x=a.useCallback(async()=>{d(!0),await S()},[S]);return{skills:r,loading:g,refresh:x}}function Uo(i,r){const u=i.reduce((g,d)=>g+(d.content?.length??0),0)+(r?.length??0);return Math.ceil(u/4)}function Hs(i){if(!Number.isFinite(i)||i<=0)return"0";if(i<1e3)return String(Math.round(i));const r=i/1e3;return r<10?`~${Number(r.toFixed(1))}k`:`${Math.round(r)}k`}const Na=640,Ho=200,Ko=200,vt=8;function lr(i){const r=i.trim();return r?`${r}
12
-
13
- `:""}function Vo(i,r,u,g,d,h,C){const S=Math.max(vt,h-g-vt),x=Math.max(vt,C-d-vt),R=u?i-g:i;return{x:Math.min(Math.max(vt,R),S),y:Math.min(Math.max(vt,r),x)}}const Ks="__SKIP__";let pa=!1;function Wo(i,r=Na){return i>r?"auto":"hidden"}function Xo(i,r=Na){return Math.max(40,Math.min(i,r))}function qo(i,r){const u=new Date(i),d=new Date().getTime()-u.getTime(),h=Math.floor(d/1e3),C=Math.floor(h/60),S=Math.floor(C/60),x=Math.floor(S/24);return h<60?r("chat.relativeTimeJustNow","just now"):C<60?r("chat.relativeTimeMinutes","{{count}}m ago",{count:C}):S<24?r("chat.relativeTimeHours","{{count}}h ago",{count:S}):x<7?r("chat.relativeTimeDays","{{count}}d ago",{count:x}):u.toLocaleDateString()}const Go=280,fn=180,gn=500,Vs="fusion:chat-sidebar-width",va="fusion:chat-scope",Yo="fusion:chat-draft:";function Ws(i,r){return i.slice(r+1).find(u=>u.role==="user")?.content}function Xs(i,r){return r?`${Yo}${i}:${r}`:null}function qs(i){if(!i)return"";try{return localStorage.getItem(i)??""}catch{return""}}const Qo=["image/png","image/jpeg","image/gif","image/webp","video/mp4","video/webm","video/quicktime","text/plain","text/markdown","application/json","text/yaml","text/x-toml","text/csv","application/xml"],Gs="image/png,image/jpeg,image/gif,image/webp,video/mp4,video/webm,video/quicktime,.txt,.md,.json,.yaml,.yml,.toml,.csv,.xml",ba=wo;function Zo(i,r){const u=i.slice(0,r),g=/(^|[\s\n])@([\w-]*)$/.exec(u);if(!g)return null;const d=g[2]??"",h=u.length-d.length-1;return{filter:d,start:h,end:r}}function Jo(i){const r=i?.runtimeConfig;if(!r||typeof r!="object")return null;const u=Reflect.get(r,"modelProvider"),g=Reflect.get(r,"modelId");return typeof u!="string"||u.trim().length===0||typeof g!="string"||g.trim().length===0?null:{provider:u,modelId:g}}function Ys(i,r,u){if(i?.modelProvider&&i?.modelId)return{provider:i.modelProvider,modelId:i.modelId};const g=Jo(r??void 0);return g||(u.provider&&u.modelId?{provider:u.provider,modelId:u.modelId}:null)}function er({projectId:i,defaultModel:r,defaultKind:u,defaultAgentId:g,defaultThinkingLevel:d,defaultSelectedThinkingLevel:h,onClose:C,onCreate:S}){const{t:x}=Be("app"),[R,E]=a.useState(u??"agent"),{agents:s,loading:M}=Js(i),[k,T]=a.useState(g??""),{models:b,favoriteProviders:l,favoriteModels:z,loading:N,refresh:W}=ei(),$=r.provider&&r.modelId?`${r.provider}/${r.modelId}`:"",[K,I]=a.useState($),[Z,Y]=a.useState(h??""),[q,D]=a.useState(l),[_,G]=a.useState(z);a.useEffect(()=>{D(l)},[l]),a.useEffect(()=>{G(z)},[z]),a.useEffect(()=>{u&&E(u)},[u]),a.useEffect(()=>{g&&T(p=>p||g)},[g]),a.useEffect(()=>{$&&I(p=>p||$)},[$]),a.useEffect(()=>{h&&Y(p=>p||h)},[h]);const O=a.useCallback(async p=>{const y=q,j=y.includes(p)?y.filter(F=>F!==p):[p,...y];D(j);try{await Is({favoriteProviders:j,favoriteModels:_}),await W()}catch{D(y)}},[q,_,W]),A=a.useCallback(async p=>{const y=_,j=y.includes(p)?y.filter(F=>F!==p):[p,...y];G(j);try{await Is({favoriteProviders:q,favoriteModels:j}),await W()}catch{G(y)}},[_,q,W]),H=K||$,ce=p=>{if(p.preventDefault(),R==="agent"){if(!k)return;S({agentId:k});return}if(!H)return;const y=H.indexOf("/");if(y<=0)return;const f=H.slice(0,y),j=H.slice(y+1);S({agentId:ye,modelProvider:f,modelId:j,thinkingLevel:Z||void 0})},c=R==="agent"?!k:!H;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:C,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:p=>p.stopPropagation(),children:[t.jsx("h3",{children:x("chat.newChatTitle","New Chat")}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${R==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{E("agent")},children:x("chat.newChatModeAgent","Agent")}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${R==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{E("model"),T(""),I(p=>p||$)},children:x("chat.newChatModeModel","Model")})]}),t.jsxs("form",{onSubmit:ce,children:[R==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:[x("chat.newChatModeAgent","Agent"),M?t.jsx("div",{className:"chat-new-dialog-loading",children:x("chat.loadingAgents","Loading agents...")}):s.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:x("chat.noAgentsAvailable","No agents available")}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:s.map(p=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${k===p.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>T(p.id),"data-testid":`agent-option-${p.id}`,children:[t.jsx(bn,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:p.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:p.role})]},p.id))})]}),R==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:N?t.jsx("div",{className:"chat-new-dialog-loading",children:x("chat.loadingModels","Loading models...")}):t.jsx(Zs,{models:b,value:K,onChange:I,label:x("chat.newChatModeModel","Model"),placeholder:x("chat.selectModel","Select a model"),favoriteProviders:q,onToggleFavorite:O,favoriteModels:_,onToggleModelFavorite:A,showThinkingLevel:!0,thinkingLevel:Z,onThinkingLevelChange:Y,defaultThinkingLevel:d??"off"})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:C,children:x("chat.cancel","Cancel")}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:c,children:x("chat.create","Create")})]})]})]})})}function dr({projectId:i,addToast:r,floating:u=!1,compactLayout:g=!1,onPopOut:d,onMaximize:h,onMinimize:C,onClose:S,chatCommandContext:x,initialComposerDraft:R,initialComposerDraftNonce:E}){const{t:s}=Be("app");a.useEffect(()=>(ya({view:"ChatView",trigger:pa?"route-active":"remount",projectId:i,replayAttempted:!1}),pa=!1,()=>{pa=!0,ya({view:"ChatView",trigger:"route-inactive",projectId:i,replayAttempted:!1})}),[i]);const[M,k]=a.useState(null);a.useEffect(()=>{let e=!1;return k(null),no(i).then(n=>{e||k(n)}).catch(()=>{e||k(null)}),()=>{e=!0}},[i]);const T=M?.defaultThinkingLevel??"off",b=a.useMemo(()=>M?.chatDefaultKind==="agent"&&M.chatDefaultAgentId?{kind:"agent",agentId:M.chatDefaultAgentId}:M?.chatDefaultKind==="model"&&M.chatDefaultModelProvider&&M.chatDefaultModelId?{kind:"model",modelProvider:M.chatDefaultModelProvider,modelId:M.chatDefaultModelId,thinkingLevel:M.chatDefaultThinkingLevel}:null,[M]),{activeSession:l,sessionsLoading:z,messages:N,messagesLoading:W,isStreaming:$,streamingText:K,streamingThinking:I,streamingToolCalls:Z,selectSession:Y,createSession:q,archiveSession:D,renameSession:_,pinSession:G,pinnedCount:O,setSessionModel:A,setSessionThinkingLevel:H,deleteSession:ce,tags:c=[],selectedTagId:p,setSelectedTagId:y,createTag:f,renameTag:j,deleteTag:F,setSessionTags:J,sendMessage:ge,editMessageAndResend:ne,stopStreaming:le,pendingMessages:De,clearPendingMessage:de,loadMoreMessages:Ie,hasMoreMessages:pe,searchQuery:qe,setSearchQuery:ii,filteredSessions:Le,agentsMap:wn}=ao(i,r),[oi,yn]=a.useState(!1),ze=!0,[P,Ge]=a.useState(()=>{try{if(localStorage.getItem(va)==="rooms"&&ze)return"rooms"}catch{}return"direct"}),w=Ro(i,r),{isUnread:Ra,markRead:me}=jo(i),[Q,he]=a.useState(()=>{const e=Xs(P,P==="rooms"?w.activeRoom?.id:l?.id);return qs(e)}),[ee,ke]=a.useState(null),kn=a.useRef(null),ja=(e,n,o,m)=>{typeof window>"u"||ke({sessionId:e,anchorX:n,anchorY:o,anchorRight:m?.anchorRight??!1,x:n,y:o})};a.useLayoutEffect(()=>{if(!ee||!kn.current||typeof window>"u")return;const e=kn.current,n=e.getBoundingClientRect(),o=n.width||e.offsetWidth||Ko,m=n.height||e.offsetHeight,v=Vo(ee.anchorX,ee.anchorY,ee.anchorRight,o,m,window.innerWidth,window.innerHeight);(v.x!==ee.x||v.y!==ee.y)&&ke({...ee,...v})},[ee]);const[It,Lt]=a.useState(null),[Cn,Sn]=a.useState(""),[Aa,Pt]=a.useState(null),[Ta,Ft]=a.useState(null),[Mn,Nn]=a.useState(""),[Rn,xt]=a.useState(null),[jn,Ea]=a.useState(""),[Da,$t]=a.useState(null),[wt,Oe]=a.useState(!0),[Ye,An]=a.useState(Go),[ri,_t]=a.useState(!1),{agentsMap:Ia}=Js(i),be=a.useMemo(()=>wn.size>0?wn:Ia,[Ia,wn]),{models:Tn,favoriteProviders:ci,favoriteModels:li,defaultProvider:La,defaultModelId:Pa}=ei(),Bt=a.useMemo(()=>({provider:La,modelId:Pa}),[Pa,La]),di=a.useMemo(()=>b?.kind==="model"?{provider:b.modelProvider,modelId:b.modelId}:Bt,[b,Bt]),{skills:En,loading:ui}=Oo(i),[Qe,Ue]=a.useState(!1),[yt,kt]=a.useState(""),[Ze,He]=a.useState(0),[Je,et]=a.useState(""),[Ce,tt]=a.useState(!1),[zt,Ot]=a.useState(0),[Dn,nt]=a.useState(-1),[ve,at]=a.useState([]),[Fa,st]=a.useState(!1),[$a,Ut]=a.useState(!1),[it,_a]=a.useState({}),[Ht,Se]=a.useState(!1),[Kt,Ct]=a.useState(!1),{pushNav:Ba}=so(),[,Vt]=a.useState(!1),[mi,hi]=a.useState({top:0,left:0}),V=_o({projectId:i}),In=a.useCallback(e=>{if(!e||!V.mentionActive)return;const n=e.getBoundingClientRect();hi({top:n.top-260,left:n.left+8})},[V.mentionActive]),za=a.useRef(null),Oa=a.useRef(null),Ua=a.useRef(null),Ha=a.useRef(null),ue=a.useRef(!1),Wt=a.useRef(null),Ka=a.useRef(null),Pe=a.useRef(null),Xt=a.useRef(0),Ln=a.useRef(null),St=a.useRef(null),Me=a.useRef(null),oe=a.useRef(null),Pn=a.useRef(null),ot=a.useRef(null),[Fn,fi]=a.useState(()=>new Set),qt=a.useRef(!1),Ne=a.useRef(null),Re=a.useRef(null),ae=a.useRef(null),Va=a.useRef(void 0),$n=a.useRef(!1),Gt=a.useRef(null),Wa=a.useRef([]),rt=a.useRef(0),Mt=a.useRef(new Map),_n=a.useRef(!1),Yt=io(),Ke=Yt==="mobile",Bn=Yt==="tablet",Xa=a.useRef(null),[gi,qa]=a.useState(!1);a.useLayoutEffect(()=>{if(!u){qa(!1);return}const e=Xa.current;if(!e||typeof ResizeObserver>"u")return;const n=()=>{qa(e.getBoundingClientRect().width<=768)};n();const o=new ResizeObserver(n);return o.observe(e),()=>o.disconnect()},[u]);const B=Ke||gi||g;a.useEffect(()=>{l?.id&&me("direct",l.id,l.lastMessageAt??l.updatedAt)},[l?.id,l?.lastMessageAt,l?.updatedAt,me]),a.useEffect(()=>{w.activeRoom?.id&&me("room",w.activeRoom.id,w.activeRoom.updatedAt)},[w.activeRoom?.id,w.activeRoom?.updatedAt,me]),a.useEffect(()=>{if(!l?.id||N.length===0)return;const e=N[N.length-1];me("direct",l.id,e?.createdAt??l.lastMessageAt??l.updatedAt)},[l?.id,l?.lastMessageAt,l?.updatedAt,me,N]),a.useEffect(()=>{if(!w.activeRoom?.id||w.messages.length===0)return;const e=w.messages[w.messages.length-1];me("room",w.activeRoom.id,e?.createdAt??w.activeRoom.updatedAt)},[me,w.activeRoom?.id,w.activeRoom?.updatedAt,w.messages]),a.useEffect(()=>{try{const e=localStorage.getItem(Vs);if(!e)return;const n=Number.parseInt(e,10);if(Number.isNaN(n))return;const o=Math.max(fn,Math.min(gn,n));An(o)}catch{}},[]),a.useEffect(()=>{try{const e=localStorage.getItem(va);if(e==="direct"){Ge("direct");return}e==="rooms"&&ze&&Ge("rooms")}catch{}},[ze]),a.useEffect(()=>{try{localStorage.setItem(va,P)}catch{}},[ze,P]);const fe=Xs(P,P==="rooms"?w.activeRoom?.id:l?.id),zn=a.useRef(fe),On=a.useRef(!1);a.useEffect(()=>{if(fe!==zn.current){if(zn.current=fe,On.current){On.current=!1;return}he(qs(fe))}},[fe]),a.useEffect(()=>{if(!(!fe||zn.current!==fe))try{if(Q){localStorage.setItem(fe,Q);return}localStorage.removeItem(fe)}catch{}},[fe,Q]);const se=P==="rooms"&&!!w.activeRoom,{keyboardOverlap:Ga,keyboardOpen:Qt}=oo({enabled:(B||Bn)&&(!!l||se),allowNonMobileViewport:Bn}),Nt=Bn&&Qt,Zt=a.useMemo(()=>{const e=yt.trim().toLowerCase();return(e?En.filter(o=>o.name.toLowerCase().includes(e)):En).slice(0,10)},[En,yt]),Un=a.useMemo(()=>x?ro(yt,Ds):[],[x,yt]),xe=a.useMemo(()=>{const e=Un.map(o=>({kind:"command",command:o,disabled:!x?.agentRunning})),n=Zt.map(o=>({kind:"skill",skill:o}));return[...e,...n]},[Un,Zt,x]),ct=a.useMemo(()=>Array.from(be.values()),[be]),je=a.useMemo(()=>P!=="rooms"||!w.activeRoom?null:{roomId:w.activeRoom.id,roomName:w.activeRoom.name,memberIds:new Set(w.activeRoomMembers.map(e=>e.agentId))},[ze,P,w.activeRoom,w.activeRoomMembers]),Ve=a.useMemo(()=>{const e=ct.filter(m=>si(m.name,Je));if(!je)return e;const n=e.filter(m=>je.memberIds.has(m.id));if(Je.trim().length===0)return n;const o=e.filter(m=>!je.memberIds.has(m.id));return[...n,...o]},[ct,Je,je]),Hn=a.useMemo(()=>{const e=new Map;for(const n of ct)e.set(n.name.toLowerCase(),n);return e},[ct]),pi=a.useMemo(()=>Zt.map(e=>e.id).join("\0"),[Zt]);a.useEffect(()=>{He(0)},[pi]),a.useEffect(()=>{Ot(0)},[Je,Ce]),a.useEffect(()=>()=>{Me.current!==null&&window.clearTimeout(Me.current)},[]),a.useEffect(()=>{const e=Oa.current;if(!e||!pe||W)return;const n=new IntersectionObserver(o=>{o[0].isIntersecting&&Ie()},{threshold:.1});return n.observe(e),()=>n.disconnect()},[pe,W,Ie]);const lt=a.useCallback(()=>se?w.activeRoom?.id??null:l?.id??null,[se,w.activeRoom?.id,l?.id]),Ya=a.useCallback((e,n)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(n)}"]`):e.querySelector(`.chat-message[data-message-id="${n.replace(/"/g,'\\"')}"]`),[]),Qa=a.useCallback(()=>{const e=oe.current;if(!e)return;const n=e.getBoundingClientRect().top,o=new Set;e.querySelectorAll(".chat-message--assistant:not(.chat-message--failure)[data-message-id]").forEach(m=>{const v=m.getAttribute("data-message-id");v&&m.getBoundingClientRect().top<n&&o.add(v)}),fi(m=>m.size===o.size&&Array.from(m).every(v=>o.has(v))?m:o)},[]),Jt=a.useCallback(()=>{!oe.current||ot.current!==null||(ot.current=window.requestAnimationFrame(()=>{ot.current=null,Qa()}))},[Qa]),en=a.useCallback(()=>{const e=oe.current,n=lt();if(!e||!n)return;const o=e.scrollTop,m=e.querySelectorAll(".chat-message[data-message-id]"),v=Array.from(m).find(U=>U.offsetTop+U.offsetHeight>=o)??m[0]??null,L=v?.getAttribute("data-message-id")??null,te=v?v.offsetTop-o:0;St.current={threadId:n,scrollTop:o,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:L,anchorOffset:te,wasPinnedBefore:!ue.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[lt]),Za=a.useCallback(()=>{const e=oe.current;if(!e)return;const o=e.scrollTop+e.clientHeight>=e.scrollHeight-50;Ut(!o),ue.current=!o,en(),Jt()},[en,Jt]),Ae=a.useCallback((e,n)=>{if(!e.isConnected||!n?.force&&ue.current)return;let o=0,m=0,v=-1;const L=6,te=()=>{if(e.isConnected&&!(!n?.force&&ue.current)){if(e.scrollTop=e.scrollHeight,e.scrollHeight===v?m+=1:(m=0,v=e.scrollHeight),o+=1,o>=L||m>=2){Ut(!1),ue.current=!1;return}window.requestAnimationFrame(te)}};te()},[]),dt=se?w.messages:N;a.useLayoutEffect(()=>(Jt(),()=>{ot.current!==null&&(window.cancelAnimationFrame(ot.current),ot.current=null)}),[dt,Jt]),a.useLayoutEffect(()=>{const e=oe.current,n=lt(),o=St.current;if(!e||!n||!o||o.threadId!==n||o.wasPinnedBefore)return;const m=(typeof performance<"u"?performance.now():Date.now())-o.capturedAtMs,v=e.scrollHeight>e.clientHeight,L=m>3e3,te=o.scrollTop<=0&&o.anchorOffset<=0&&v;if(!ue.current||L||te){St.current=null;return}let U=o.scrollTop;if(o.anchorMessageId){const ie=Ya(e,o.anchorMessageId);ie?U=ie.offsetTop-o.anchorOffset:U=o.scrollTop+(e.scrollHeight-o.scrollHeight)}else U=o.scrollTop+(e.scrollHeight-o.scrollHeight);e.scrollTop=Math.max(0,U),ue.current=!0,Ut(!0),St.current=null},[dt,lt,Ya]);const Kn=a.useCallback(e=>{},[dt.length,se]),we=a.useCallback(e=>{Kn(e);const n=oe.current;n&&(St.current=null,ue.current=!1,Ae(n))},[Ae,Kn]);a.useLayoutEffect(()=>{Pe.current!==null&&(window.clearTimeout(Pe.current),Pe.current=null);const e=se?w.activeRoom?.id??null:l?.id??null;if(!e){Wt.current=null;return}const n={threadId:e,loaded:se?!w.messagesLoading:!W,hasMessages:se?w.messages.length>0:N.length>0},o=Wt.current,m=o?.threadId!==e,v=o?.threadId===e&&!o.loaded&&n.loaded,L=o?.threadId===e&&!o.hasMessages&&n.hasMessages;if(!(o===null||m||v||L))return;const U=oe.current;if(U)return Kn(m?"thread-change":v?"finished-loading":L?"first-messages":"mount"),Ae(U,{force:!0}),se||(Pe.current=window.setTimeout(()=>{if(Pe.current=null,ue.current)return;const ie=oe.current;ie&&Ae(ie)},250)),Wt.current=n,()=>{Pe.current!==null&&(window.clearTimeout(Pe.current),Pe.current=null)}},[se,w.activeRoom?.id,w.messages.length,w.messagesLoading,l?.id,N.length,W,Ae]),a.useEffect(()=>{!$||ue.current||we("streaming")},[$,K,I,we]),a.useEffect(()=>{const e=lt();if(!e){Xt.current=0,Ln.current=null;return}if(Ln.current!==e){Ln.current=e,Xt.current=dt.length;return}const n=Xt.current,o=dt.length,m=o>n,v=!ue.current;Xt.current=o,m&&v&&we("new-message")},[dt,lt,we]),a.useEffect(()=>{Ga<=0||!oe.current||we("keyboard")},[Ga,we]),co(Ke&&Qt),a.useLayoutEffect(()=>{if(!Ke||!l&&!se||typeof window>"u")return;const e=Pn.current,n=window.visualViewport;if(!e||!n)return;const o=v=>{if(!(v instanceof HTMLElement))return!1;if(v.tagName==="TEXTAREA")return!0;if(v.tagName!=="INPUT")return!1;const L=v.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(L)},m=()=>{if(qt.current){e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange="";return}const v=Math.max(0,window.innerHeight-n.offsetTop-n.height),L=n.offsetTop||0;e.style.setProperty("--vv-height",`${n.height}px`),e.style.setProperty("--vv-offset-top",`${L}px`),e.style.setProperty("--keyboard-overlap",`${v}px`);const te=(v>0||L>0)&&o(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",te),e.style.setProperty("--chat-keyboard-accessory-clearance",te&&ma()?"calc(var(--space-2xl) + var(--space-md))":"0px"),te&&L>0?(e.style.transform=`translateY(${L}px)`,e.style.willChange="transform"):(e.style.transform="",e.style.willChange="")};return m(),n.addEventListener("resize",m),n.addEventListener("scroll",m),document.addEventListener("focusin",m),document.addEventListener("focusout",m),window.addEventListener("pageshow",m),document.addEventListener("visibilitychange",m),()=>{n.removeEventListener("resize",m),n.removeEventListener("scroll",m),document.removeEventListener("focusin",m),document.removeEventListener("focusout",m),window.removeEventListener("pageshow",m),document.removeEventListener("visibilitychange",m),e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange=""}},[l,Ke,se]),a.useEffect(()=>{const e=()=>ke(null);if(ee)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[ee]),a.useEffect(()=>{if(!Ke||!Qt)return;const e=n=>{n.target?.closest(".chat-messages")||n.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[Ke,Qt]),a.useEffect(()=>{const e=Ka.current;if(Ka.current=P,P==="rooms"&&!w.activeRoom){Wt.current=null;return}if(!(P==="direct"&&(e===null||e==="rooms"))&&!(P==="rooms"&&(e===null||e==="direct")))return;const m=oe.current;m&&(Ae(m,{force:!0}),ue.current=!1,Ut(!1))},[P,w.activeRoom,Ae]),a.useEffect(()=>{if(!l&&!se||se&&!B)return;const e=()=>{const o=!ue.current;en(),o&&B&&oe.current&&we("visibility-restore")},n=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",n),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",n),window.removeEventListener("pageshow",e)}},[B,Ke,l,se,en,we]),a.useEffect(()=>{if(se||typeof ResizeObserver>"u")return;const e=oe.current;if(!e)return;const n=new ResizeObserver(()=>{ue.current||Ae(e)});return n.observe(e),()=>{n.disconnect()}},[se,Ae,l?.id,P]),a.useEffect(()=>{Wa.current=ve},[ve]),a.useEffect(()=>()=>{for(const e of Wa.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of Mt.current.values())window.clearTimeout(e);Mt.current.clear()},[]);const ut=a.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const o of Array.from(e)){if(!Qo.includes(o.type))continue;const m=o.type.startsWith("image/");n.push({file:o,previewUrl:m?URL.createObjectURL(o):""})}n.length>0&&at(o=>[...o,...n])},[]),Ja=a.useCallback(e=>{at(n=>{const o=n[e];return o?.previewUrl&&URL.revokeObjectURL(o.previewUrl),n.filter((m,v)=>v!==e)})},[]),es=a.useCallback(e=>{ut(e.clipboardData?.files)},[ut]),mt=a.useCallback(async e=>{try{return await q(e),yn(!1),B&&Oe(!1),!0}catch{return r(s("chat.failedToCreateSession","Failed to create chat session"),"error"),!1}},[q,r,B,s]),tn=a.useCallback(()=>{if(M?.chatNewSessionMode==="always-default"&&b){if(b.kind==="agent"){mt({agentId:b.agentId});return}mt({agentId:ye,modelProvider:b.modelProvider,modelId:b.modelId,thinkingLevel:b.thinkingLevel});return}yn(!0)},[b,M?.chatNewSessionMode,mt]),re=a.useCallback(e=>{const n=e??ae.current;if(!n)return;const o=Yt==="tablet"?Ho:Na;n.style.height="auto",n.style.height=`${Xo(n.scrollHeight,o)}px`,n.style.overflowY=Wo(n.scrollHeight,o)},[Yt]),ts=a.useCallback(e=>{ae.current=e,e&&re(e)},[re]);a.useLayoutEffect(()=>{re(),$n.current&&($n.current=!1,ae.current?.focus())},[P,Q,l?.id,w.activeRoom?.id,re]),a.useEffect(()=>{if(E===void 0||E===Va.current||!R?.trim())return;Va.current=E;const e=n=>{n&&(On.current=!0),Ge("direct"),$n.current=!0,he(R)};if(!$&&M?.chatNewSessionMode==="always-default"&&b){const n=b.kind==="agent"?{agentId:b.agentId}:{agentId:ye,modelProvider:b.modelProvider,modelId:b.modelId,thinkingLevel:b.thinkingLevel};mt(n).then(o=>e(o||P!=="direct"));return}e(P!=="direct")},[b,P,M?.chatNewSessionMode,mt,R,E,$,re]);const ht=a.useCallback(()=>{if(he(""),fe)try{localStorage.removeItem(fe)}catch{}Ue(!1),kt(""),tt(!1),et(""),nt(-1),at(e=>{for(const n of e)n.previewUrl&&URL.revokeObjectURL(n.previewUrl);return[]})},[fe]),Vn=a.useCallback(()=>{const e=Q.trim(),n=ve.map(m=>m.file);if(!e&&n.length===0||!l)return;if(x){const m=lo(e,Ds);if(m){if(!x.agentRunning){r(s("chat.commandNoRunningAgent","No running agent to steer"),"warning");return}if(n.length>0){r(s("chat.commandNoAttachments","Attachments aren't supported with commands — remove them before sending"),"warning");return}ht(),m.command.run({taskId:x.taskId,projectId:x.projectId,remainder:m.remainder}).then(()=>{r(s("chat.commandSteerSuccess","Sent to the running agent"),"success")}).catch(v=>{const L=v instanceof Error&&v.message.trim()?v.message:s("chat.commandSteerFailed","Failed to send to the running agent");r(L,"error")});return}}if(e==="/clear"||e==="/new"){if(l.agentId.startsWith(uo)){ht(),r(s("chat.newNotAllowedForTaskChat","This chat is tied to a task — /new and /clear can't clear it"),"warning");return}ht(),de(),le(),q({agentId:l.agentId,modelProvider:l.modelProvider??void 0,modelId:l.modelId??void 0,thinkingLevel:l.thinkingLevel??void 0}).catch(()=>{r(s("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}const o=new Set(n);he("");try{ge(e,n,{onDelivered:()=>{at(m=>{for(const v of m)o.has(v.file)&&v.previewUrl&&URL.revokeObjectURL(v.previewUrl);return m.filter(v=>!o.has(v.file))})},onFailed:()=>{he(m=>m||e)}})}catch{he(e)}},[Q,ve,l,ht,le,de,q,r,ge,x,s]),Wn=a.useCallback(async()=>{const e=Q.trim(),n=ve.map(o=>o.file);if(!(!e&&n.length===0)){if(P==="rooms"){if(!w.activeRoom)return;if(e==="/clear"||e==="/new"){ht();try{await w.clearRoom(w.activeRoom.id)}catch{r(s("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(_n.current)return;_n.current=!0;const o=Q,m=new Set(n);he("");try{await w.sendRoomMessage(e,{files:n}),at(v=>{for(const L of v)m.has(L.file)&&L.previewUrl&&URL.revokeObjectURL(L.previewUrl);return v.filter(L=>!m.has(L.file))})}catch(v){if(v instanceof ni){at(U=>{for(const ie of U)m.has(ie.file)&&ie.previewUrl&&URL.revokeObjectURL(ie.previewUrl);return U.filter(ie=>!m.has(ie.file))});const te=v.message.trim()?v.message:s("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");r(s("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:te}),"error");return}he(o);const L=v instanceof Error&&v.message.trim()?v.message:s("chat.failedToSendRoomMessage","Failed to send room message");r(L,"error")}finally{_n.current=!1}return}Vn()}},[Q,ve,ze,P,w,w.clearRoom,ht,r,Vn]),nn=a.useCallback(async e=>{if(P==="rooms"){if(!w.activeRoom)return;try{await w.sendRoomMessage(e)}catch(n){const o=n instanceof Error&&n.message.trim()?n.message:s("chat.failedToSendRoomMessage","Failed to send room message");r(o,"error")}return}l&&ge(e)},[l,r,ze,P,w,ge,s]),Xn=a.useCallback(e=>{he(n=>{const o=ba(n);if(!o)return n;const m=`/skill:${e.name} `,v=n.slice(0,o.start)+m+n.slice(o.end);return window.requestAnimationFrame(()=>{ae.current&&(re(ae.current),ae.current.focus())}),v}),Ue(!1),kt(""),He(0)},[re]),qn=a.useCallback((e,n)=>{if(n){r(s("chat.commandNoRunningAgent","No running agent to steer"),"warning");return}he(o=>{const m=ba(o);if(!m)return o;const v=`${e.trigger} `,L=o.slice(0,m.start)+v+o.slice(m.end);return window.requestAnimationFrame(()=>{ae.current&&(re(ae.current),ae.current.focus())}),L}),Ue(!1),kt(""),He(0)},[re,r,s]),an=a.useCallback(e=>{const n=ae.current;if(!n||Dn<0)return;const o=n.selectionStart??rt.current,m=n.selectionEnd??o,v=Math.max(o,m),L=Math.min(Dn,v),U=`${`@${e.name.replace(/\s+/g,"_")}`} `,ie=Q.slice(0,L)+U+Q.slice(v),ft=L+U.length;he(ie),tt(!1),et(""),Ot(0),nt(-1),window.requestAnimationFrame(()=>{ae.current&&(re(ae.current),ae.current.focus(),ae.current.setSelectionRange(ft,ft))})},[Dn,Q,re]),Rt=a.useCallback((e,n)=>{const m=ae.current?.selectionStart??rt.current,v=Q.lastIndexOf("#",m),L=v>=0?v+n.length:e.length;he(e),V.dismissMention(),Vt(!1),window.requestAnimationFrame(()=>{ae.current&&(re(ae.current),ae.current.focus(),ae.current.setSelectionRange(L,L))})},[V,Q,re]),ns=a.useCallback(e=>{if(rt.current=e.currentTarget.selectionStart??rt.current,V.mentionActive&&V.combinedItems.length>0){if(V.handleKeyDown(e,Q),e.key==="Enter"||e.key==="Tab"){const n=V.combinedItems[V.selectedIndex];n?.kind==="task"?Rt(V.selectTask(n.task,Q),`#${n.task.id}`):n?.kind==="file"&&Rt(V.selectFile(n.file,Q),`#${n.file.path}`)}return}if(Ce&&e.key==="ArrowDown"){e.preventDefault(),Ve.length>0&&Ot(n=>(n+1)%Ve.length);return}if(Ce&&e.key==="ArrowUp"){e.preventDefault(),Ve.length>0&&Ot(n=>n===0?Ve.length-1:n-1);return}if(Ce&&e.key==="Enter"){e.preventDefault();const n=Ve[zt]??Ve[0];n&&an(n);return}if(Ce&&e.key==="Escape"){e.preventDefault(),tt(!1),et(""),nt(-1);return}if(Qe&&e.key==="ArrowDown"){e.preventDefault(),xe.length>0&&He(n=>(n+1)%xe.length);return}if(Qe&&e.key==="ArrowUp"){e.preventDefault(),xe.length>0&&He(n=>n===0?xe.length-1:n-1);return}if(Qe&&(e.key==="Enter"||e.key==="Tab")&&xe.length>0){e.preventDefault();const n=xe[Ze]??xe[0];n?.kind==="skill"?Xn(n.skill):n?.kind==="command"&&qn(n.command,n.disabled);return}if(Qe&&e.key==="Escape"){e.preventDefault(),Ue(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Wn())},[Ce,Ve,zt,an,Qe,xe,Ze,Xn,qn,Wn,V,Rt,Q]),sn=a.useCallback((e,n)=>{const o=Zo(e,n);if(o){tt(!0),et(o.filter),nt(o.start);return}tt(!1),et(""),nt(-1)},[]),as=a.useCallback(e=>{const n=e.target,o=n.value,m=n.selectionStart??o.length;re(n),rt.current=m,he(o);const v=ba(o);v?(Ue(!0),kt(v.filter)):(Ue(!1),kt("")),sn(o,m),V.detectMention(o,m),Vt(V.mentionActive),V.mentionActive&&In(n)},[sn,re]),on=a.useCallback(e=>{const n=e.currentTarget,o=n.selectionStart??n.value.length;rt.current=o,sn(n.value,o),V.detectMention(n.value,o),Vt(V.mentionActive),V.mentionActive&&In(n)},[sn,V,In]),ss=a.useCallback(e=>{e.key!=="Escape"&&on(e)},[on]),is=a.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(qt.current=!0,Ne.current!==null&&window.clearTimeout(Ne.current),Ne.current=window.setTimeout(()=>{qt.current=!1,Ne.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),Re.current!==null&&window.clearTimeout(Re.current),Re.current=window.setTimeout(()=>{Re.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Me.current!==null&&window.clearTimeout(Me.current),Me.current=window.setTimeout(()=>{Ue(!1),tt(!1),et(""),nt(-1),Vt(!1),V.dismissMention(),Me.current=null},120)},[V]),os=a.useCallback(()=>{qt.current=!1,Ne.current!==null&&(window.clearTimeout(Ne.current),Ne.current=null),Me.current!==null&&(window.clearTimeout(Me.current),Me.current=null),Re.current!==null&&(window.clearTimeout(Re.current),Re.current=null)},[]);a.useEffect(()=>()=>{Ne.current!==null&&window.clearTimeout(Ne.current),Re.current!==null&&window.clearTimeout(Re.current)},[]);const vi=a.useCallback(async e=>{ke(null);try{await D(e),r(s("chat.conversationArchived","Conversation archived"),"success")}catch{r(s("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[D,r]),rs=a.useCallback(e=>{const n=Le.find(o=>o.id===e)??(l?.id===e?l:null);ke(null),Se(!1),Sn(n?.title??""),Lt({sessionId:e,title:n?.title??""})},[l,Le]),cs=a.useCallback(async()=>{if(It)try{await _(It.sessionId,Cn),Lt(null),Sn(""),r(s("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[r,It,_,Cn,s]),ls=a.useCallback(async(e,n)=>{ke(null),Se(!1);try{await G(e,n),r(n?s("chat.conversationPinned","Conversation pinned"):s("chat.conversationUnpinned","Conversation unpinned"),"success")}catch{}},[r,G,s]),bi=a.useCallback(async e=>{Pt(null),ke(null);try{await ce(e),r(s("chat.conversationDeleted","Conversation deleted"),"success")}catch{r(s("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[ce,r]),jt=a.useCallback(e=>{try{localStorage.setItem(Vs,String(e))}catch{}},[]),xi=a.useCallback(e=>{if(B||Nt)return;e.preventDefault(),e.stopPropagation();const n=e.currentTarget;typeof n.setPointerCapture=="function"&&n.setPointerCapture(e.pointerId);const o=e.clientX,m=Ye;let v=m;document.body.style.userSelect="none";const L=U=>{const ie=U.clientX-o,ft=Math.max(fn,Math.min(gn,m+ie));v=ft,An(ft),jt(ft)},te=U=>{typeof n.releasePointerCapture=="function"&&n.releasePointerCapture(U.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",L),document.removeEventListener("pointerup",te),jt(v)};document.addEventListener("pointermove",L),document.addEventListener("pointerup",te)},[B,jt,Ye,Nt]),wi=a.useCallback(e=>{if(B||Nt||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const n=e.shiftKey?50:10,o=e.key==="ArrowLeft"?-n:n,m=Math.max(fn,Math.min(gn,Ye+o));An(m),jt(m)},[B,jt,Ye,Nt]),ds=a.useCallback(e=>{const n=Le.find(o=>o.id===e);me("direct",e,n?.lastMessageAt??n?.updatedAt),Y(e),Se(!1),B&&Oe(!1)},[Le,B,me,Y]),Gn=a.useCallback(()=>{Y(""),Oe(!0),Se(!1)},[Y]),Yn=a.useCallback(()=>{w.selectRoom(null),Oe(!0),Se(!1)},[w]),yi=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(pn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:s("chat.startNewConversation","Start a new conversation")}),t.jsxs("button",{className:"btn btn-primary",onClick:tn,children:[t.jsx(gt,{size:16}),s("chat.newChat","New Chat")]})]}),Te=Ys(l,l?.agentId?be.get(l.agentId)??null:null,Bt),Qn=a.useMemo(()=>{if(!Te?.provider||!Te.modelId)return null;const e=Tn.find(n=>n.provider===Te.provider&&n.id===Te.modelId);return e?.contextWindow?e.contextWindow:null},[Te?.modelId,Te?.provider,Tn]),ki=a.useMemo(()=>Uo(N,$?K:void 0),[$,N,K]),Fe=Ms(Te?.provider,Te?.modelId),We=Te?.provider??null,Zn=!!(l||$||N.length>0),rn=B&&!wt&&(P==="rooms"?se:Zn),cn=B?rn:P==="rooms"?se:!!l,us=a.useRef(cn);a.useEffect(()=>{const e=us.current;us.current=cn,B&&(e||!cn||Ba({type:"view",revert:P==="rooms"?Yn:Gn}))},[P,Gn,Yn,cn,B,Ba]);const ms=l?.agentId===ye?Fe??"Fusion":l?.title||be.get(l?.agentId??"")?.name||l?.agentId||"Chat",Ci=l?.title||s("chat.untitledSession","Untitled"),Si=!!(Fe&&Fe!==ms),Mi=!B&&Zn&&Qn!==null,hs=Hs(ki),ln=Qn!==null?Hs(Qn):null,Jn=ln?s("chat.contextWindowAria","Estimated {{used}} of {{total}} context tokens",{used:hs,total:ln}):null,Ni=rn&&P==="direct"&&!!l,fs=rn&&P==="direct",gs=rn&&P==="rooms",ea=be.get(l?.agentId??"")?.name||(l?.agentId===ye?Fe??"Fusion":l?.agentId?.slice(0,30)??"Fusion"),ta=!1,na=l?.agentId===ye,Ri=e=>e.length>50?`${e.slice(0,50)}…`:e;a.useEffect(()=>{if(!Ht)return;const e=n=>{Ua.current?.contains(n.target)||Se(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[Ht]),a.useEffect(()=>{if(!Kt)return;const e=o=>{Ha.current?.contains(o.target)||Ct(!1)},n=o=>{o.key==="Escape"&&Ct(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",n),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",n)}},[Kt]),a.useEffect(()=>{(!B||P!=="direct"||wt)&&Se(!1)},[B,P,wt]),a.useEffect(()=>{Ct(!1)},[w.activeRoom?.id]);const ps=a.useCallback((e,n)=>{const o=Mt.current.get(e);o&&window.clearTimeout(o),_a(v=>({...v,[e]:n}));const m=window.setTimeout(()=>{_a(v=>{const{[e]:L,...te}=v;return te}),Mt.current.delete(e)},2e3);Mt.current.set(e,m)},[]),vs=a.useCallback(async(e,n)=>{const o=await mo(n);ps(e,o?"success":"error")},[ps]),aa=l?.agentId===ye,sa=a.useCallback((e,n,o)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${it[e]==="success"?" chat-message-copy-action--success":""}${it[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":o??`chat-copy-response-${e}`,"aria-label":it[e]==="success"?s("chat.responseCopied","Response copied"):it[e]==="error"?s("chat.copyFailed","Copy failed"):s("chat.copyResponse","Copy response"),onClick:()=>{vs(e,n)},children:it[e]==="success"?t.jsx(ho,{size:14}):t.jsx(fo,{size:14})}),[it,vs]),ia=a.useCallback(e=>{const n=oe.current;if(!n)return;const o=`[data-testid="chat-message-${e}"]`,m=n.querySelector(o);if(!m)return;const v=m.getBoundingClientRect().top-n.getBoundingClientRect().top+n.scrollTop,L=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;n.scrollTo({top:v,behavior:L?"auto":"smooth"})},[]),bs=l?.cliExecutorAdapterId??null,oa=!!bs,ji=bs==="generic"?"generic":"hybrid",Ai=l?.cliSessionFile||l?.id||"",xs=!oa&&!$,ws=()=>t.jsxs("div",{className:"chat-messages",ref:oe,onScroll:Za,children:[t.jsx("div",{ref:Oa,className:"chat-load-more-sentinel",children:pe&&W&&t.jsx("div",{className:"chat-loading-older",children:s("chat.loadingOlderMessages","Loading older messages…")})}),$?t.jsxs(t.Fragment,{children:[N.map((e,n)=>t.jsx(ua,{message:e,forcePlain:!1,agentName:ea,hideAssistantIdentity:na,showAssistantModelTag:ta,activeModelTag:Fe,activeModelProvider:We,activeSessionId:l?.id??null,mentionAgentsByName:Hn,roomContext:null,copyAction:aa&&e.role==="assistant"?sa(e.id,e.content):void 0,onScrollToTop:ia,isTopClipped:Fn.has(e.id),isAwaitingQuestionAnswer:e.role==="assistant"&&n===N.length-1&&!$,submittedQuestionAnswer:Ws(N,n),onQuestionSubmit:nn,canEdit:xs,onEditMessage:ne},e.id)),t.jsx(yo,{streamingText:K,streamingThinking:I,streamingToolCalls:Z,forcePlain:!1,agentName:ea,hideAssistantIdentity:na,showAssistantModelTag:ta,activeModelTag:Fe,activeModelProvider:We,copyAction:aa&&K?sa("__streaming__",K,"chat-copy-response-streaming"):void 0,onQuestionSubmit:nn})]}):W?t.jsx("div",{className:"chat-empty-state",children:s("chat.loadingMessages","Loading messages...")}):N.length===0&&!l?yi():N.length===0&&l?t.jsx("div",{className:"chat-empty-state",children:s("chat.noMessagesYet","No messages yet. Start the conversation!")}):t.jsx(t.Fragment,{children:N.map((e,n)=>t.jsx(ua,{message:e,forcePlain:!1,agentName:ea,hideAssistantIdentity:na,showAssistantModelTag:ta,activeModelTag:Fe,activeModelProvider:We,activeSessionId:l?.id??null,mentionAgentsByName:Hn,roomContext:null,copyAction:aa&&e.role==="assistant"?sa(e.id,e.content):void 0,onScrollToTop:ia,isTopClipped:Fn.has(e.id),isAwaitingQuestionAnswer:e.role==="assistant"&&n===N.length-1&&!$,submittedQuestionAnswer:Ws(N,n),onQuestionSubmit:nn,canEdit:xs,onEditMessage:ne},e.id))}),t.jsx("div",{ref:za})]}),ys=()=>t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Gt,type:"file","data-testid":"chat-file-input",accept:Gs,multiple:!0,style:{display:"none"},onChange:e=>{ut(e.target.files),e.target.value=""}}),Qe&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":s("chat.skillSuggestions","Skill suggestions"),children:ui&&Un.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:s("chat.loadingSkills","Loading skills…")}):xe.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:yt?s("chat.noSkillsFound","No skills found"):s("chat.noSkillsAvailable","No skills available")}):xe.map((e,n)=>e.kind==="command"?t.jsxs("button",{type:"button",role:"option","aria-selected":n===Ze,"aria-disabled":e.disabled,className:`chat-skill-menu-item chat-command-menu-item${n===Ze?" chat-skill-menu-item--highlighted":""}${e.disabled?" chat-command-menu-item--disabled":""}`,onMouseDown:o=>o.preventDefault(),onMouseEnter:()=>He(n),onClick:()=>qn(e.command,e.disabled),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.command.trigger}),t.jsx("span",{className:"chat-skill-menu-item-description",children:e.disabled?s("chat.commandNoRunningAgentHint","No running agent to steer"):e.command.description})]},`command-${e.command.trigger}`):t.jsxs("button",{type:"button",role:"option","aria-selected":n===Ze,className:`chat-skill-menu-item${n===Ze?" chat-skill-menu-item--highlighted":""}`,onMouseDown:o=>o.preventDefault(),onMouseEnter:()=>He(n),onClick:()=>Xn(e.skill),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.skill.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.skill.relativePath,children:e.skill.relativePath})]},e.skill.id))}),ve.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:ve.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>Ja(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),De.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-pending-stack","data-testid":"chat-pending-stack",children:De.map((e,n)=>t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:s("chat.queuedMessage","Queued: {{preview}}",{preview:Ri(e)})}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":s("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":`chat-pending-dismiss-${n}`,onClick:()=>de(n),children:"×"})]},`${n}-${e}`))}),t.jsx("div",{className:"chat-pending-divider","aria-hidden":"true"})]}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":s("chat.attachFiles","Attach files"),onClick:()=>Gt.current?.click(),children:t.jsx(Ts,{size:16})}),!oa&&t.jsx($s,{level:l?.thinkingLevel,defaultThinkingLevel:T,models:Tn,favoriteProviders:ci,favoriteModels:li,agents:Array.from(be.values()),agentId:l?.agentId,modelProvider:l?.modelProvider,modelId:l?.modelId,onChange:e=>{l&&H(l.id,e)},onChangeModel:e=>{l&&A(l.id,e)},disabled:!l}),t.jsxs("div",{className:`chat-input-wrapper${Fa?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),st(!0)},onDragLeave:()=>st(!1),onDrop:e=>{e.preventDefault(),st(!1),ut(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:ts,className:"chat-input-textarea",placeholder:s("chat.typeMessage","Type a message..."),value:Q,onChange:as,onKeyDown:ns,onKeyUp:ss,onClick:on,onBlur:is,onFocus:os,onPaste:es,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||ma()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(Bs,{agents:ct,filter:Je,highlightedIndex:zt,visible:Ce,onSelect:an,position:"below",roomMemberIds:je?.memberIds,roomName:je?.roomName}),t.jsx(Eo,{visible:V.mentionActive&&!Ce,position:mi,tasks:V.tasks,files:V.files,selectedIndex:V.selectedIndex,onSelectTask:e=>{Rt(V.selectTask(e,Q),`#${e.id}`)},onSelectFile:e=>{Rt(V.selectFile(e,Q),`#${e.path}`)},loading:V.loading})]}),t.jsx(Es,{isStreaming:$,canSend:!!(Q.trim()||ve.length>0),onSend:Vn,onStop:le})]})]}),Ti=B?void 0:{width:`${Ye}px`},ks=Le.filter(e=>e.pinnedAt!=null),Cs=Le.filter(e=>e.pinnedAt==null),$e=ee?Le.find(e=>e.id===ee.sessionId)??(l?.id===ee.sessionId?l:void 0):void 0,Ei=Ni?t.jsxs("div",{className:"chat-mobile-session-menu",ref:Ua,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":Ht,onClick:()=>Se(e=>!e),children:[We?t.jsx(ca,{provider:We,size:"md"}):t.jsx(bn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Ci}),t.jsx(dn,{size:16,"aria-hidden":"true"})]}),Ht&&t.jsxs("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:[[{id:"pinned",label:s("chat.pinned","Pinned"),testId:"chat-mobile-pinned-divider",sessions:ks},{id:"recent",label:s("chat.recent","Recent"),testId:"chat-mobile-recent-divider",sessions:Cs}].filter(e=>e.sessions.length>0).map(e=>t.jsxs("section",{className:"chat-session-section","data-testid":`chat-mobile-session-section-${e.id}`,children:[t.jsx("div",{className:"chat-pinned-divider","data-testid":e.testId,children:e.label}),e.sessions.map(n=>t.jsxs("div",{className:`chat-mobile-session-option-row${l?.id===n.id?" chat-mobile-session-option-row--active":""}`,role:"none",children:[t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${l?.id===n.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${n.id}`,onClick:()=>ds(n.id),children:t.jsxs("span",{className:"chat-mobile-session-option-title",children:[n.title||s("chat.untitledSession","Untitled"),n.pinnedAt?t.jsx(un,{className:"chat-session-pinned-indicator",size:14,"data-testid":`chat-session-pinned-indicator-${n.id}`,"aria-label":s("chat.pinned","Pinned")}):null]})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-pin","data-testid":`chat-mobile-session-pin-${n.id}`,"aria-label":n.pinnedAt?s("chat.unpinConversationAria","Unpin conversation {{title}}",{title:n.title||s("chat.untitledSession","Untitled")}):s("chat.pinConversationAria","Pin conversation {{title}}",{title:n.title||s("chat.untitledSession","Untitled")}),title:!n.pinnedAt&&O>=3?s("chat.pinLimit","You can pin up to 3 conversations"):void 0,disabled:!n.pinnedAt&&O>=3,onClick:()=>ls(n.id,!n.pinnedAt),children:n.pinnedAt?t.jsx(Ns,{size:14}):t.jsx(un,{size:14})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-rename","data-testid":`chat-mobile-session-rename-${n.id}`,"aria-label":s("chat.renameConversationAria","Rename conversation {{title}}",{title:n.title||s("chat.untitledSession","Untitled")}),onClick:()=>rs(n.id),children:t.jsx(la,{size:14})})]},n.id))]},e.id)),t.jsxs("button",{type:"button",role:"menuitem",className:"chat-mobile-session-new","data-testid":"chat-mobile-session-new",onClick:()=>{Se(!1),tn()},children:[t.jsx(gt,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:s("chat.newChat","New Chat")})]})]})]}):null,Di=t.jsxs("div",{className:"chat-sidebar-scope-toggle chat-view-header-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${P==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":P==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>Ge("direct"),children:[t.jsx(pn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:s("chat.scopeDirect","Direct")})]}),t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${P==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":P==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>Ge("rooms"),children:[t.jsx(ti,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:s("chat.scopeRooms","Rooms")})]})]});return t.jsxs("div",{ref:Xa,className:`chat-view${u?" chat-view--floating":""}${B?" chat-view--narrow":""}${fs?" chat-view--mobile-direct-thread":""}`,children:[t.jsx(go,{icon:pn,title:s("chat.title","Chat"),actions:t.jsxs(t.Fragment,{children:[fs?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn-icon chat-back-btn",onClick:Gn,"data-testid":"chat-back-btn","aria-label":s("chat.backToConversations","Back to conversations"),children:t.jsx(Rs,{size:16})}),Ei]}):Di,B?null:t.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:tn,"data-testid":"chat-new-btn",children:[t.jsx(gt,{size:14}),s("chat.newChat","New Chat")]}),!u&&d?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:d,"aria-label":s("chat.popOut","Pop out chat"),title:s("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:t.jsx(js,{size:16})}):null,u&&h?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:h,"aria-label":s("chat.maximizeToChatView","Open in Chat view"),title:s("chat.maximizeToChatView","Open in Chat view"),"data-testid":"chat-modal-maximize",children:t.jsx(js,{size:16})}):null,u&&C?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:C,"aria-label":s("chat.minimizeToQuickChat","Minimize to quick chat"),title:s("chat.minimizeToQuickChat","Minimize to quick chat"),"data-testid":"chat-modal-minimize",children:t.jsx(po,{size:16})}):null,u&&S?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:S,"aria-label":s("chat.closeChat","Close chat"),title:s("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:t.jsx(As,{size:16})}):null]})}),t.jsxs("div",{className:"chat-view__body",children:[t.jsxs("div",{className:`chat-sidebar${wt?"":" chat-sidebar--hidden"}`,style:Ti,children:[P==="direct"?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-sidebar-search-container",children:[t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(vo,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:s("chat.searchConversations","Search conversations..."),value:qe,onChange:e=>ii(e.target.value),"data-testid":"chat-search-input"})]}),t.jsxs("label",{className:"chat-tag-filter",htmlFor:"chat-tag-filter",children:[t.jsx(So,{size:14,"aria-hidden":"true"}),t.jsxs("select",{id:"chat-tag-filter",value:p??"",onChange:e=>y(e.target.value||null),"data-testid":"chat-tag-filter","aria-label":s("chat.filterByTag","Filter conversations by tag"),children:[t.jsx("option",{value:"",children:s("chat.allTags","All tags")}),c.map(e=>t.jsx("option",{value:e.id,children:e.name},e.id))]}),p?t.jsx("button",{type:"button",className:"btn-icon","aria-label":s("chat.clearTagFilter","Clear tag filter"),onClick:()=>y(null),children:t.jsx(As,{size:14})}):null]})]}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:z?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:s("chat.loadingConversations","Loading...")}):Le.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:s("chat.noConversationsYet","No conversations yet")}):t.jsx(t.Fragment,{children:[{id:"pinned",label:s("chat.pinned","Pinned"),testId:"chat-pinned-divider",sessions:ks},{id:"recent",label:s("chat.recent","Recent"),testId:"chat-recent-divider",sessions:Cs}].filter(e=>e.sessions.length>0).map(e=>t.jsxs("section",{className:"chat-session-section","data-testid":`chat-session-section-${e.id}`,children:[t.jsx("div",{className:"chat-pinned-divider","data-testid":e.testId,children:e.label}),e.sessions.map(n=>{const o=l?.id===n.id,m=!o&&Ra("direct",n.id,n.lastMessageAt??n.updatedAt),v=Ys(n,be.get(n.agentId)??null,Bt),L=Ms(v?.provider,v?.modelId)??"Fusion",te=n.title||s("chat.untitledSession","Untitled");return t.jsxs("div",{className:`chat-session-item${o?" chat-session-item--active":""}`,onClick:()=>ds(n.id),onContextMenu:U=>{U.preventDefault(),ja(n.id,U.clientX,U.clientY)},"data-testid":`chat-session-${n.id}`,children:[t.jsx("button",{type:"button",className:"btn-icon chat-session-menu-btn","data-testid":"chat-session-menu-btn","aria-label":s("chat.conversationActionsAria","Conversation actions for {{title}}",{title:te}),"aria-haspopup":"menu","aria-expanded":ee?.sessionId===n.id,onClick:U=>{if(U.stopPropagation(),ee?.sessionId===n.id){ke(null);return}const ie=U.currentTarget.getBoundingClientRect();ja(n.id,ie.right,ie.bottom,{anchorRight:!0})},children:t.jsx(bo,{size:14})}),t.jsxs("div",{className:"chat-session-title",children:[te,n.pinnedAt?t.jsx(un,{className:"chat-session-pinned-indicator",size:14,"data-testid":`chat-session-pinned-indicator-${n.id}`,"aria-label":s("chat.pinned","Pinned")}):null,m?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${n.id}`,"aria-label":s("chat.unreadMessages","Unread messages")}):null]}),t.jsx("div",{className:"chat-session-preview",children:n.lastMessagePreview||s("chat.noMessages","No messages")}),(n.tags??[]).length>0?t.jsx("div",{className:"chat-session-tags","data-testid":`chat-session-tags-${n.id}`,children:(n.tags??[]).map(U=>t.jsx("span",{className:"chat-session-tag",children:U.name},U.id))}):null,n.matchedMessagePreview?t.jsx("div",{className:"chat-session-preview chat-session-preview--matched","data-testid":`chat-session-matched-preview-${n.id}`,children:s("chat.matchedInMessage",'Matched: "{{preview}}"',{preview:n.matchedMessagePreview})}):null,t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[v?.provider?t.jsx(ca,{provider:v.provider,size:"sm"}):null,t.jsx("span",{children:be.get(n.agentId)?.name||(n.agentId===ye?L:n.agentId.slice(0,30))})]}),t.jsx("span",{children:n.updatedAt?qo(n.updatedAt,s):""})]})]},n.id)})]},e.id))})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!B&&t.jsx("div",{className:"chat-sidebar-rooms-header","data-testid":"chat-sidebar-rooms-header",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>_t(!0),children:[t.jsx(gt,{size:14}),s("chat.createRoom","Create room")]})}),w.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:s("chat.noRoomsYet","No rooms yet.")}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:w.rooms.map(e=>{const n=w.activeRoom?.id===e.id,o=!n&&Ra("room",e.id,e.updatedAt);return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${n?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{me("room",e.id,e.updatedAt),w.selectRoom(e.id),B&&Oe(!1)},onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),me("room",e.id,e.updatedAt),w.selectRoom(e.id),B&&Oe(!1))},children:[t.jsxs("span",{className:"chat-room-item-details",children:[t.jsxs("span",{className:"chat-room-item-name-row",children:[t.jsxs("span",{className:"chat-room-item-name",children:["#",e.name]}),o?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":s("chat.unreadMessages","Unread messages")}):null]}),n?t.jsx("span",{className:"chat-room-item-meta",children:s("chat.roomMemberCount","{{count}} member",{count:w.activeRoomMembers.length,defaultValue_one:"{{count}} member",defaultValue_other:"{{count}} members"})}):null]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":s("chat.deleteRoom","Delete room {{name}}",{name:e.name}),onClick:m=>{m.stopPropagation(),Ft(e.id)},children:t.jsx(da,{size:14})})]},e.id)})})]}),P==="rooms"?B?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary chat-sidebar-footer-btn","data-testid":"chat-create-room-btn",onClick:()=>_t(!0),children:[t.jsx(gt,{size:14}),s("chat.createRoom","Create room")]})}):null:B?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:tn,"data-testid":"chat-new-btn",children:[t.jsx(gt,{size:14}),s("chat.newChat","New Chat")]})}):null]}),!B&&wt&&!Nt&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":fn,"aria-valuemax":gn,"aria-valuenow":Ye,"aria-label":s("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:xi,onKeyDown:wi}),ee&&t.jsxs("div",{className:"chat-session-context-menu",ref:kn,role:"menu",style:{top:ee.y,left:ee.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>ls(ee.sessionId,!$e?.pinnedAt),"data-testid":"chat-context-pin",title:O>=3&&!$e?.pinnedAt?s("chat.pinLimit","You can pin up to 3 conversations"):void 0,disabled:O>=3&&!$e?.pinnedAt,children:[$e?.pinnedAt?t.jsx(Ns,{size:14}):t.jsx(un,{size:14}),$e?.pinnedAt?s("chat.unpin","Unpin"):s("chat.pin","Pin")]}),t.jsxs("button",{onClick:()=>rs(ee.sessionId),"data-testid":"chat-context-rename",children:[t.jsx(la,{size:14}),s("chat.rename","Rename")]}),t.jsxs("div",{className:"chat-session-tag-menu",role:"group","aria-label":s("chat.conversationTags","Conversation tags"),children:[c.map(e=>{const n=($e?.tags??[]).some(o=>o.id===e.id);return t.jsxs("div",{className:"chat-tag-menu-item",children:[t.jsxs("button",{type:"button",role:"menuitemcheckbox","aria-checked":n,"data-testid":`chat-context-tag-${e.id}`,onClick:()=>void J(ee.sessionId,n?($e?.tags??[]).filter(o=>o.id!==e.id).map(o=>o.id):[...($e?.tags??[]).map(o=>o.id),e.id]).catch(()=>r(s("chat.failedToUpdateTags","Failed to update tags"),"error")),children:[n?"✓ ":"",e.name]}),t.jsx("button",{type:"button",className:"btn-icon","aria-label":s("chat.renameTag","Rename tag {{name}}",{name:e.name}),"data-testid":`chat-context-rename-tag-${e.id}`,onClick:o=>{o.stopPropagation(),Ea(e.name),xt(e)},children:t.jsx(la,{size:14})}),t.jsx("button",{type:"button",className:"btn-icon","aria-label":s("chat.deleteTag","Delete tag {{name}}",{name:e.name}),"data-testid":`chat-context-delete-tag-${e.id}`,onClick:o=>{o.stopPropagation(),$t(e)},children:t.jsx(da,{size:14})})]},e.id)}),t.jsxs("div",{className:"chat-tag-create-row",children:[t.jsx("input",{className:"input",value:Mn,placeholder:s("chat.newTag","New tag"),"aria-label":s("chat.newTag","New tag"),onChange:e=>Nn(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),f(Mn).then(()=>Nn("")).catch(()=>r(s("chat.failedToCreateTag","Failed to create tag"),"error")))}}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void f(Mn).then(()=>Nn("")).catch(()=>r(s("chat.failedToCreateTag","Failed to create tag"),"error")),children:s("chat.addTag","Add")})]})]}),t.jsxs("button",{onClick:()=>vi(ee.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(xo,{size:14}),s("chat.archive","Archive")]}),t.jsxs("button",{onClick:()=>{ke(null),Pt(ee.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(da,{size:14}),s("chat.delete","Delete")]})]}),It&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Lt(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"chat-rename-dialog-title",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{id:"chat-rename-dialog-title",children:s("chat.renameConversationTitle","Rename Conversation")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:s("chat.renameConversationBody","Choose a new name for this conversation. Leave it blank to show Untitled.")}),t.jsx("label",{className:"chat-rename-label",htmlFor:"chat-rename-input",children:s("chat.conversationName","Conversation name")}),t.jsx("input",{id:"chat-rename-input",className:"input chat-rename-input",type:"text",value:Cn,placeholder:s("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:e=>Sn(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),cs())},autoFocus:!0}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Lt(null),children:s("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void cs(),"data-testid":"chat-rename-save",children:s("chat.save","Save")})]})]})}),Rn&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>xt(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"chat-rename-tag-dialog-title",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{id:"chat-rename-tag-dialog-title",children:s("chat.renameTagTitle","Rename tag")}),t.jsx("label",{className:"chat-rename-label",htmlFor:"chat-rename-tag-input",children:s("chat.tagName","Tag name")}),t.jsx("input",{id:"chat-rename-tag-input",className:"input chat-rename-input",value:jn,"data-testid":"chat-rename-tag-input",onChange:e=>Ea(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),j(Rn.id,jn).then(()=>xt(null)).catch(()=>r(s("chat.failedToRenameTag","Failed to rename tag"),"error")))},autoFocus:!0}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>xt(null),children:s("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-primary","data-testid":"chat-rename-tag-save",onClick:()=>void j(Rn.id,jn).then(()=>xt(null)).catch(()=>r(s("chat.failedToRenameTag","Failed to rename tag"),"error")),children:s("chat.save","Save")})]})]})}),Da&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>$t(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"chat-delete-tag-dialog-title",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{id:"chat-delete-tag-dialog-title",children:s("chat.deleteTagTitle","Delete tag?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:s("chat.deleteTagBody","This removes the tag from all conversations, but does not delete conversations.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>$t(null),children:s("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger","data-testid":"chat-delete-tag-confirm",onClick:()=>void F(Da.id).then(()=>$t(null)).catch(()=>r(s("chat.failedToDeleteTag","Failed to delete tag"),"error")),children:s("chat.delete","Delete")})]})]})}),Aa&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Pt(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:s("chat.deleteConversationTitle","Delete Conversation?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:s("chat.deleteConversationBody","This action cannot be undone. All messages in this conversation will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Pt(null),children:s("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void bi(Aa),children:s("chat.delete","Delete")})]})]})}),Ta&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Ft(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:s("chat.deleteRoomTitle","Delete Room?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:s("chat.deleteRoomBody","This action cannot be undone. This room and all its messages will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Ft(null),children:s("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await w.deleteRoom(Ta),Ft(null)}catch{r(s("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:s("chat.delete","Delete")})]})]})}),P==="rooms"?t.jsxs("div",{ref:Pn,className:"chat-thread",children:[w.activeRoom?t.jsxs(t.Fragment,{children:[(!B||gs)&&t.jsxs("div",{className:"chat-room-thread-header",children:[gs&&t.jsx("button",{className:"btn-icon",onClick:Yn,"data-testid":"chat-back-btn",children:t.jsx(Rs,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:Ha,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":Kt,onClick:()=>Ct(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",w.activeRoom.name]}),t.jsx(dn,{size:16,"aria-hidden":"true"})]}),Kt&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:w.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===w.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{me("room",e.id,e.updatedAt),w.selectRoom(e.id),Ct(!1)},children:["#",e.name]},e.id))})]}),t.jsx("div",{className:"chat-room-thread-members",children:w.activeRoomMembers.map(e=>t.jsx(xn,{agent:be.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:oe,onScroll:Za,children:[w.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:s("chat.loadingMessages","Loading messages...")}):w.messages.filter(e=>e.content.trim()!==Ks).length===0?t.jsx("div",{className:"chat-empty-state",children:s("chat.noMessagesYet","No messages yet. Start the conversation!")}):w.messages.filter(e=>e.content.trim()!==Ks).map(e=>{const n=e.senderAgentId?be.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):s("chat.you","You"),o={id:e.id,sessionId:e.roomId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:e.attachments,createdAt:e.createdAt};return t.jsx(ua,{message:o,forcePlain:!1,agentName:n,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:w.activeRoom?.id??null,mentionAgentsByName:Hn,roomContext:je,onScrollToTop:ia,isTopClipped:Fn.has(e.id),isAwaitingQuestionAnswer:!1,onQuestionSubmit:nn},e.id)}),t.jsx("div",{ref:za})]}),w.activeRoom&&$a&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>we("fab-click"),children:[t.jsx(dn,{size:14}),s("chat.latest","Latest")]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:s("chat.selectRoomOrCreate","Select a room or create one")}),w.activeRoom&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Gt,type:"file",accept:Gs,multiple:!0,style:{display:"none"},onChange:e=>{ut(e.target.files),e.target.value=""}}),ve.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:ve.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>Ja(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":s("chat.attachFiles","Attach files"),onClick:()=>Gt.current?.click(),children:t.jsx(Ts,{size:16})}),t.jsx($s,{level:w.activeRoom.thinkingLevel,defaultThinkingLevel:T,showTargetSection:!1,onChange:e=>{w.updateRoomSettings(w.activeRoom.id,{thinkingLevel:e||null}).catch(()=>{r(s("chat.failedToUpdateRoomThinkingLevel","Failed to update room thinking effort"),"error")})}}),t.jsxs("div",{className:`chat-input-wrapper${Fa?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),st(!0)},onDragLeave:()=>st(!1),onDrop:e=>{e.preventDefault(),st(!1),ut(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:ts,className:"chat-input-textarea",placeholder:s("chat.typeMessage","Type a message..."),value:Q,onChange:as,onKeyDown:ns,onKeyUp:ss,onClick:on,onBlur:is,onFocus:os,onPaste:es,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||ma()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(Bs,{agents:ct,filter:Je,highlightedIndex:zt,visible:Ce,onSelect:an,position:"below",roomMemberIds:je?.memberIds,roomName:je?.roomName})]}),t.jsx(Es,{isStreaming:!1,canSend:!!(Q.trim()||ve.length>0),onSend:Wn})]})]})]}):t.jsxs("div",{ref:Pn,className:"chat-thread",children:[!B&&(Zn||!B)&&t.jsx("div",{className:"chat-thread-header",children:t.jsxs("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:[We?t.jsx(ca,{provider:We,size:"md"}):t.jsx(bn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:ms}),Si&&t.jsx("span",{className:"chat-model-tag",children:Fe}),Mi&&ln&&Jn?t.jsxs("span",{className:"chat-thread-header-context","data-testid":"chat-thread-context-window",title:Jn,"aria-label":Jn,children:[hs," / ",ln]}):null]})}),oa?t.jsx(Lo,{cliSessionId:Ai,tier:ji,projectId:i,renderTranscript:ws,renderComposer:()=>l?ys():null}):t.jsxs(t.Fragment,{children:[ws(),$a&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>we("fab-click"),children:[t.jsx(dn,{size:14}),s("chat.latest","Latest")]}),l&&ys()]})]}),t.jsx(Io,{isOpen:ri,onClose:()=>_t(!1),projectId:i,existingRoomNames:w.rooms.map(e=>e.name),onCreate:async e=>{await w.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),P!=="rooms"&&Ge("rooms"),_t(!1),B&&Oe(!1)}})]}),oi&&t.jsx(er,{projectId:i,defaultModel:di,defaultKind:b?.kind,defaultAgentId:b?.kind==="agent"?b.agentId:void 0,defaultThinkingLevel:T,defaultSelectedThinkingLevel:b?.kind==="model"?b.thinkingLevel:void 0,onClose:()=>yn(!1),onCreate:mt})]})}export{dr as ChatView,lr as buildIssueChatPrefill,Xo as clampChatInputHeight,Vo as resolveChatContextMenuPosition,Wo as resolveChatInputOverflowY,Ys as resolveSessionProvider};