@runfusion/fusion 0.44.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/README.md +2 -1
  2. package/dist/bin.js +6902 -2143
  3. package/dist/client/.vite/manifest.json +1115 -328
  4. package/dist/client/assets/AgentDetailView-CgbB51Iw.css +1 -0
  5. package/dist/client/assets/AgentDetailView-DJTi6hKC.js +18 -0
  6. package/dist/client/assets/{AgentPermissionPolicyEditor--YS4iMUY.js → AgentPermissionPolicyEditor-C5DR9dUS.js} +2 -2
  7. package/dist/client/assets/AgentsView-BNd90PSx.js +29 -0
  8. package/dist/client/assets/AgentsView-CzMa5Olf.css +1 -0
  9. package/dist/client/assets/ChatView-B7JaZCL_.js +19 -0
  10. package/dist/client/assets/ChatView-BtjkE0V7.css +1 -0
  11. package/dist/client/assets/CommandCenter-CHO21xEW.js +74 -0
  12. package/dist/client/assets/CommandCenter-Xs5Ftv8s.css +1 -0
  13. package/dist/client/assets/DevServerView-B_p91Mj_.css +1 -0
  14. package/dist/client/assets/DevServerView-H9OkT1ld.js +1 -0
  15. package/dist/client/assets/DirectoryPicker-DegxT8ia.js +1 -0
  16. package/dist/client/assets/DocumentsView-kVVQYISc.js +1 -0
  17. package/dist/client/assets/EvalsView-C9-iTSat.js +1 -0
  18. package/dist/client/assets/EvalsView-CTbgPUne.css +1 -0
  19. package/dist/client/assets/ExperimentalAgentOnboardingModal-3ZEFv8sr.css +1 -0
  20. package/dist/client/assets/ExperimentalAgentOnboardingModal-DjP_xNkc.js +1 -0
  21. package/dist/client/assets/GoalsView-CUh8JBnJ.css +1 -0
  22. package/dist/client/assets/GoalsView-VoIHJJ5l.js +2 -0
  23. package/dist/client/assets/InsightsView-BIZaUcpd.js +11 -0
  24. package/dist/client/assets/InsightsView-C7yRTMPn.css +1 -0
  25. package/dist/client/assets/MemoryView-7v7rv6ns.js +2 -0
  26. package/dist/client/assets/MemoryView-CBDUr2Jy.css +1 -0
  27. package/dist/client/assets/PiExtensionsManager-CB89rV4U.js +11 -0
  28. package/dist/client/assets/PluginManager-BNSuW_R4.js +1 -0
  29. package/dist/client/assets/PullRequestView-CI5jdKBL.js +6 -0
  30. package/dist/client/assets/PullRequestView-CpdE3Yo_.css +1 -0
  31. package/dist/client/assets/ResearchView-BT5dR_m8.js +1 -0
  32. package/dist/client/assets/ResearchView-DIVNQF4_.css +1 -0
  33. package/dist/client/assets/SecretsView-CvFioX7R.css +1 -0
  34. package/dist/client/assets/SecretsView-WPYI58Uo.js +1 -0
  35. package/dist/client/assets/SessionTerminal-C6gyOWLt.js +2 -0
  36. package/dist/client/assets/SessionTerminal-D4R3ScvQ.css +1 -0
  37. package/dist/client/assets/SettingsModal-BESN59Ao.css +1 -0
  38. package/dist/client/assets/SettingsModal-BZokaNyx.css +1 -0
  39. package/dist/client/assets/SettingsModal-Bq_3AbaB.js +1 -0
  40. package/dist/client/assets/SettingsModal-JHACoQJe.js +21 -0
  41. package/dist/client/assets/SetupWizardModal-CrgbnR_d.js +2 -0
  42. package/dist/client/assets/ShadcnColorPicker-1icHuwhC.js +11 -0
  43. package/dist/client/assets/ShadcnColorPicker-pqVWCC5-.css +1 -0
  44. package/dist/client/assets/SkillsView-CJ8snrma.css +1 -0
  45. package/dist/client/assets/SkillsView-byuSe3e0.js +1 -0
  46. package/dist/client/assets/TodoView-CIsL_uvQ.css +1 -0
  47. package/dist/client/assets/TodoView-CQ9GjYBg.js +6 -0
  48. package/dist/client/assets/WorkflowNodeEditor-DW7sJZUX.js +8 -0
  49. package/dist/client/assets/WorkflowNodeEditor-f_XPV5Jd.css +1 -0
  50. package/dist/client/assets/{addon-fit-SnYDEvGm.js → addon-fit-C1WQXRvu.js} +1 -1
  51. package/dist/client/assets/{addon-unicode11-s5GoZCpi.js → addon-unicode11-BVmNDUBM.js} +1 -1
  52. package/dist/client/assets/{addon-web-links-jjt2f_oV.js → addon-web-links-CkVew5xs.js} +1 -1
  53. package/dist/client/assets/{addon-webgl-Icn-RnEx.js → addon-webgl-uLc0RKcC.js} +1 -1
  54. package/dist/client/assets/agentSkills-CeytXLHF.js +1 -0
  55. package/dist/client/assets/{ExperimentalAgentOnboardingModal-CZ_jbgep.css → agentSkills-bQJ4X1gH.css} +1 -1
  56. package/dist/client/assets/agentsOrgChartLayout-BMvyuaLA.js +1 -0
  57. package/dist/client/assets/app-3wbZ08YC.js +13 -0
  58. package/dist/client/assets/app-7-5DWLtg.js +13 -0
  59. package/dist/client/assets/app-CSvE5Noc.js +13 -0
  60. package/dist/client/assets/app-CZ2LTFce.js +13 -0
  61. package/dist/client/assets/app-Cv9xEnll.js +13 -0
  62. package/dist/client/assets/app-x_yPcO5Y.js +13 -0
  63. package/dist/client/assets/arc-cxkkNsnK.js +1 -0
  64. package/dist/client/assets/architectureDiagram-3BPJPVTR-BRI0QwDf.js +36 -0
  65. package/dist/client/assets/band-CquvqAHh.js +1 -0
  66. package/dist/client/assets/blockDiagram-GPEHLZMM-BXkN8Hv_.js +132 -0
  67. package/dist/client/assets/c4Diagram-AAUBKEIU-C_Kcokep.js +10 -0
  68. package/dist/client/assets/channel-Clzpzu32.js +1 -0
  69. package/dist/client/assets/chunk-2J33WTMH-BGeuCz9C.js +1 -0
  70. package/dist/client/assets/chunk-4BX2VUAB-DcVdctr0.js +1 -0
  71. package/dist/client/assets/chunk-55IACEB6-Dg6gDigQ.js +1 -0
  72. package/dist/client/assets/chunk-727SXJPM-B9B-vlEb.js +206 -0
  73. package/dist/client/assets/chunk-AQP2D5EJ-LrWQ-2yi.js +231 -0
  74. package/dist/client/assets/chunk-FMBD7UC4-Bnd6hAED.js +15 -0
  75. package/dist/client/assets/chunk-ND2GUHAM-nAw93UB5.js +1 -0
  76. package/dist/client/assets/chunk-QZHKN3VN-CgprKcZo.js +1 -0
  77. package/dist/client/assets/classDiagram-4FO5ZUOK-CzYHP-af.js +1 -0
  78. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CzYHP-af.js +1 -0
  79. package/dist/client/assets/common-BDp2y6CF.js +1 -0
  80. package/dist/client/assets/common-BnEo5fLN.js +1 -0
  81. package/dist/client/assets/common-Bzr_Y8h4.js +1 -0
  82. package/dist/client/assets/common-CvwyFzfv.js +1 -0
  83. package/dist/client/assets/common-CztCXRkz.js +1 -0
  84. package/dist/client/assets/common-DPe2mbb7.js +1 -0
  85. package/dist/client/assets/cose-bilkent-S5V4N54A-Bhn0g_iK.js +1 -0
  86. package/dist/client/assets/cytoscape.esm-OyMbaexL.js +331 -0
  87. package/dist/client/assets/dagre-BM42HDAG-CP4kfwqd.js +4 -0
  88. package/dist/client/assets/{dashboard-view-B4LXCv5H.js → dashboard-view-CM6Xin_H.js} +1680 -1620
  89. package/dist/client/assets/dashboard-view-DV1nEhh9.js +1 -0
  90. package/dist/client/assets/dashboard-view-D_zsA-kz.css +1 -0
  91. package/dist/client/assets/defaultLocale-DX6XiGOO.js +1 -0
  92. package/dist/client/assets/diagram-2AECGRRQ-DPhzVEUf.js +43 -0
  93. package/dist/client/assets/diagram-5GNKFQAL-8QOC3K_L.js +10 -0
  94. package/dist/client/assets/diagram-KO2AKTUF-C1twgEch.js +3 -0
  95. package/dist/client/assets/diagram-LMA3HP47-3bEegSuf.js +24 -0
  96. package/dist/client/assets/diagram-OG6HWLK6-BJ_x0rm6.js +24 -0
  97. package/dist/client/assets/erDiagram-TEJ5UH35-DNiiS5q6.js +85 -0
  98. package/dist/client/assets/flowDiagram-I6XJVG4X-DoouPklt.js +162 -0
  99. package/dist/client/assets/{folder-open-33WGVnbp.js → folder-open-CuUs2W7f.js} +1 -1
  100. package/dist/client/assets/ganttDiagram-6RSMTGT7-BrR6VnP5.js +292 -0
  101. package/dist/client/assets/gitGraphDiagram-PVQCEYII-BV8_J6Ee.js +106 -0
  102. package/dist/client/assets/graph--OzhPTMs.js +1 -0
  103. package/dist/client/assets/index-BZBQ_KsL.css +1 -0
  104. package/dist/client/assets/index-CZcWjLAb.js +1459 -0
  105. package/dist/client/assets/infoDiagram-5YYISTIA-DGwIIFkR.js +2 -0
  106. package/dist/client/assets/init-Dmth1JHB.js +1 -0
  107. package/dist/client/assets/ishikawaDiagram-YF4QCWOH-D5dEH4RE.js +70 -0
  108. package/dist/client/assets/journeyDiagram-JHISSGLW-BuuSWPw5.js +139 -0
  109. package/dist/client/assets/kanban-definition-UN3LZRKU-DA34uUla.js +89 -0
  110. package/dist/client/assets/katex-HP8lGamR.js +257 -0
  111. package/dist/client/assets/layout-SsrduOYp.js +1 -0
  112. package/dist/client/assets/linear-dXivciGL.js +1 -0
  113. package/dist/client/assets/mermaid.core-Ch4HatqA.js +309 -0
  114. package/dist/client/assets/mindmap-definition-RKZ34NQL-DUCG-qD3.js +96 -0
  115. package/dist/client/assets/ordinal-DILIJJjt.js +1 -0
  116. package/dist/client/assets/pieDiagram-4H26LBE5-DWvFGiLa.js +30 -0
  117. package/dist/client/assets/quadrantDiagram-W4KKPZXB-OPTVW3WT.js +7 -0
  118. package/dist/client/assets/requirementDiagram-4Y6WPE33-D7feZvlU.js +84 -0
  119. package/dist/client/assets/sankeyDiagram-5OEKKPKP-AtnSsEX1.js +40 -0
  120. package/dist/client/assets/sequenceDiagram-3UESZ5HK-BZjHUeI5.js +162 -0
  121. package/dist/client/assets/{shield-alert-CqeGWBUK.js → shield-alert-CzaF9ROV.js} +1 -1
  122. package/dist/client/assets/stateDiagram-AJRCARHV-C8j23Pvn.js +1 -0
  123. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CiZR_S5-.js +1 -0
  124. package/dist/client/assets/step-yuy0qJer.js +1 -0
  125. package/dist/client/assets/time-DoDTxsna.js +1 -0
  126. package/dist/client/assets/timeline-definition-PNZ67QCA-DvfNz25n.js +120 -0
  127. package/dist/client/assets/{upload-C11J2diI.js → upload-DTsYywhN.js} +1 -1
  128. package/dist/client/assets/{users-a-ELbyyZ.js → users-yAd09tKP.js} +1 -1
  129. package/dist/client/assets/{vendor-i18n-DYlSUfot.js → vendor-i18n-GF3RlKbq.js} +2 -2
  130. package/dist/client/assets/{vendor-react-BTgM5bbZ.js → vendor-react-SZ_qB27O.js} +1 -1
  131. package/dist/client/assets/vendor-reactflow-Bg-Qjzh8.js +15 -0
  132. package/dist/client/assets/{vendor-xterm-ea7-K05z.js → vendor-xterm-BNq00GSj.js} +1 -1
  133. package/dist/client/assets/vennDiagram-CIIHVFJN-CG2aMt3v.js +34 -0
  134. package/dist/client/assets/wardley-L42UT6IY-BnhBteen.js +173 -0
  135. package/dist/client/assets/wardleyDiagram-YWT4CUSO-DwqTzM3T.js +78 -0
  136. package/dist/client/assets/xychartDiagram-2RQKCTM6-5Cv2ZKMV.js +7 -0
  137. package/dist/client/assets/zoom-out-NWbVkreR.js +41 -0
  138. package/dist/client/index.html +30 -10
  139. package/dist/client/sw.js +1 -1
  140. package/dist/client/theme-data.css +3082 -206
  141. package/dist/client/version.json +1 -1
  142. package/dist/droid-cli/index.ts +56 -40
  143. package/dist/droid-cli/package.json +1 -1
  144. package/dist/droid-cli/src/__tests__/index.test.ts +47 -21
  145. package/dist/droid-cli/src/__tests__/process-manager.test.ts +50 -33
  146. package/dist/extension.js +4935 -827
  147. package/dist/pi-claude-cli/package.json +1 -1
  148. package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +25 -0
  149. package/dist/pi-claude-cli/src/process-manager.ts +11 -1
  150. package/dist/plugin-sdk/index.d.ts +126 -4
  151. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  152. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  153. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  154. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  155. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  156. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +68 -44
  157. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  158. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  159. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  160. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  161. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  162. package/dist/plugins/fusion-plugin-roadmap/bundled.js +5 -11
  163. package/dist/plugins/fusion-plugin-roadmap/manifest.json +1 -11
  164. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  165. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  166. package/package.json +3 -3
  167. package/skill/fusion/SKILL.md +1 -1
  168. package/skill/fusion/references/cli-commands.md +2 -1
  169. package/skill/fusion/references/extension-tools.md +10 -0
  170. package/skill/fusion/references/fusion-capabilities.md +3 -1
  171. package/dist/client/assets/AgentDetailView-CanIeYHg.css +0 -1
  172. package/dist/client/assets/AgentDetailView-DxV8pFHX.js +0 -18
  173. package/dist/client/assets/AgentsView-BVILQjdS.css +0 -1
  174. package/dist/client/assets/AgentsView-CTzbcvhK.js +0 -29
  175. package/dist/client/assets/ChatView-COygcnyk.js +0 -6
  176. package/dist/client/assets/ChatView-DwJAd5G1.css +0 -1
  177. package/dist/client/assets/CommandCenter-CTaopaC0.css +0 -1
  178. package/dist/client/assets/CommandCenter-DoKX2HWm.js +0 -56
  179. package/dist/client/assets/DevServerView-Cyevyvqx.js +0 -1
  180. package/dist/client/assets/DevServerView-VTQY28P7.css +0 -1
  181. package/dist/client/assets/DirectoryPicker-DBdyXEhR.js +0 -1
  182. package/dist/client/assets/DocumentsView-BzSMyrns.js +0 -1
  183. package/dist/client/assets/DocumentsView-WfVoTZt8.css +0 -1
  184. package/dist/client/assets/EvalsView-CUNJ1TLc.css +0 -1
  185. package/dist/client/assets/EvalsView-ikz00o9g.js +0 -1
  186. package/dist/client/assets/ExperimentalAgentOnboardingModal-D-rzCCET.js +0 -499
  187. package/dist/client/assets/GoalsView-Bfu1Oy2-.js +0 -2
  188. package/dist/client/assets/GoalsView-rg9VSIza.css +0 -1
  189. package/dist/client/assets/InsightsView-Cgmf5nES.js +0 -11
  190. package/dist/client/assets/InsightsView-LMv1M1dU.css +0 -1
  191. package/dist/client/assets/MemoryView-DkEuDKQs.js +0 -2
  192. package/dist/client/assets/MemoryView-zaXewZzi.css +0 -1
  193. package/dist/client/assets/NodesView-7VInxyf_.css +0 -1
  194. package/dist/client/assets/NodesView-B_KYfS4o.js +0 -14
  195. package/dist/client/assets/PiExtensionsManager-Dz69kkKs.js +0 -11
  196. package/dist/client/assets/PluginManager-LHCVcduP.js +0 -1
  197. package/dist/client/assets/PullRequestView-3AdbS2a1.css +0 -1
  198. package/dist/client/assets/PullRequestView-DBJutLLl.js +0 -6
  199. package/dist/client/assets/ResearchView-DTh8FLUm.css +0 -1
  200. package/dist/client/assets/ResearchView-gpn1XcVy.js +0 -1
  201. package/dist/client/assets/SecretsView-B7YqIowt.js +0 -1
  202. package/dist/client/assets/SecretsView-Djo1rahi.css +0 -1
  203. package/dist/client/assets/SessionTerminal-9l4bdKcn.js +0 -2
  204. package/dist/client/assets/SessionTerminal-BNgtmXb3.css +0 -1
  205. package/dist/client/assets/SettingsModal-BGEK9_9A.js +0 -31
  206. package/dist/client/assets/SettingsModal-CKv0TJfM.css +0 -1
  207. package/dist/client/assets/SettingsModal-CXogw-Er.css +0 -1
  208. package/dist/client/assets/SettingsModal-DIIoHGUH.js +0 -1
  209. package/dist/client/assets/SetupWizardModal-BcVeMxeX.js +0 -1
  210. package/dist/client/assets/SetupWizardModal-CIqFbkrD.css +0 -1
  211. package/dist/client/assets/SkillsView-3bhGyWs1.css +0 -1
  212. package/dist/client/assets/SkillsView-BxSJ4PHL.js +0 -1
  213. package/dist/client/assets/StashRecoveryView-B_8WIQEo.css +0 -1
  214. package/dist/client/assets/StashRecoveryView-BhFQ2FsP.js +0 -1
  215. package/dist/client/assets/TodoView-7xIh-Fmi.css +0 -1
  216. package/dist/client/assets/TodoView-BZpewjy0.js +0 -6
  217. package/dist/client/assets/WorkflowNodeEditor-Yn1FRF2v.css +0 -1
  218. package/dist/client/assets/WorkflowNodeEditor-tWsgCdVt.js +0 -8
  219. package/dist/client/assets/app-BmGA0Hiz.js +0 -13
  220. package/dist/client/assets/app-CEVYlVuJ.js +0 -13
  221. package/dist/client/assets/app-CbBFax2C.js +0 -13
  222. package/dist/client/assets/app-DORKrGAz.js +0 -13
  223. package/dist/client/assets/app-DQibuQ9z.js +0 -13
  224. package/dist/client/assets/app-k76GrQP0.js +0 -13
  225. package/dist/client/assets/common-BRyX4VxB.js +0 -1
  226. package/dist/client/assets/common-CN9QPI2d.js +0 -1
  227. package/dist/client/assets/common-CNbjPELi.js +0 -1
  228. package/dist/client/assets/common-DFDqu_n0.js +0 -1
  229. package/dist/client/assets/common-DgWWKG8Z.js +0 -1
  230. package/dist/client/assets/common-X6PzBnVA.js +0 -1
  231. package/dist/client/assets/createLucideIcon-DmVITl5d.js +0 -21
  232. package/dist/client/assets/dashboard-view-BFoyhTYF.js +0 -3
  233. package/dist/client/assets/dashboard-view-Cxzm_eqc.js +0 -1
  234. package/dist/client/assets/dashboard-view-DdGlfuu-.css +0 -1
  235. package/dist/client/assets/dashboard-view-_8yfNwju.css +0 -1
  236. package/dist/client/assets/index-Bglw05rM.js +0 -791
  237. package/dist/client/assets/index-FYgnflWD.css +0 -1
  238. package/dist/client/assets/vendor-reactflow-ZasuEfF9.js +0 -15
  239. package/dist/client/assets/x-PItWc-wQ.js +0 -61
  240. package/dist/client/assets/zoom-out-CzlHv0Kj.js +0 -21
@@ -0,0 +1,19 @@
1
+ import{r as a,j as e,b as Za,R as er}from"./vendor-react-SZ_qB27O.js";import{c as ss,az as tt,ax as Ye,dH as zs,dI as as,bT as It,dJ as Bs,aC as ie,dK as dn,dl as yt,dL as tr,dM as nr,dN as an,dm as gn,dn as bt,dO as sr,dP as Us,dQ as ar,dR as rr,dS as ir,dT as or,ah as wa,dU as cr,ay as Zn,bA as Hs,dV as lr,dW as ur,dX as qn,dY as dr,dZ as mr,d_ as hr,d$ as fr,e0 as gr,e1 as pr,e as pn,e2 as br,e3 as Ca,bn as vr,ak as yr,ba as mn,a0 as xr,b$ as wr,e4 as Cr,h as Sr,e5 as Sa,e6 as kr,dw as Nr,U as Mr,e7 as Rr,q as ka,s as Na,F as Ar,G as jr,V as Tr,P as $t,dg as qs,df as Er,X as _r,aJ as $r,I as Kn,dt as Ft,H as Ks,bN as Dr,br as Gs,n as rn,e8 as Vs,e9 as Qs,cC as Ws,bt as Pt,B as Lr,D as Fr,ea as bn,dh as Xs,b6 as Pr,cm as Ir,bL as Ys,bO as Or}from"./index-CZcWjLAb.js";import{u as Fe}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as Js}from"./SessionTerminal-C6gyOWLt.js";import"./vendor-reactflow-Bg-Qjzh8.js";import"./vendor-xterm-BNq00GSj.js";import"./vendor-codemirror-jBKmHyH0.js";import"./shield-alert-CzaF9ROV.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 zr=[["path",{d:"M5 3h14",key:"7usisc"}],["path",{d:"m18 13-6-6-6 6",key:"1kf1n9"}],["path",{d:"M12 7v14",key:"1akyts"}]],Br=ss("arrow-up-to-line",zr);/**
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 Ur=[["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"}]],Ma=ss("hash",Ur);/**
12
+ * @license lucide-react v1.7.0 - ISC
13
+ *
14
+ * This source code is licensed under the ISC license.
15
+ * See the LICENSE file in the root directory of this source tree.
16
+ */const Hr=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]],Zs=ss("wrench",Hr);function ea(n){const{sessionId:s,tempUserMessageId:r,initialText:l,initialThinking:c,initialToolCalls:d,setStreamingText:g,setStreamingThinking:i,setStreamingToolCalls:u,cancelStreamingFlushesRef:E,addToast:j,onDone:R,onError:p,onFallbackSession:k}=n;let C=l??"",T=c??"",w=d?[...d]:[],I,b=null,V=null;const U=()=>{b=null,g(C)},se=()=>{V=null,i(T)},A=()=>{b!==null&&(cancelAnimationFrame(b),b=null),V!==null&&(cancelAnimationFrame(V),V=null)};return E.current=A,{handlers:{onThinking:O=>{T+=O,V===null&&(V=requestAnimationFrame(se))},onText:O=>{C+=O,b===null&&(b=requestAnimationFrame(U))},onToolStart:O=>{w=[...w,{toolName:O.toolName,args:O.args,isError:!1,status:"running"}],u(w)},onToolEnd:O=>{const B=[...w];for(let L=B.length-1;L>=0;L--){const H=B[L];if(H?.toolName===O.toolName&&H.status==="running"){B[L]={...H,status:"completed",isError:O.isError,result:O.result},w=B,u(B);return}}w=[...B,{toolName:O.toolName,isError:O.isError,result:O.result,status:"completed"}],u(w)},onFallback:O=>{I=O,k?.(O,s),j?.(`Primary model unavailable. Switched to fallback ${O.fallbackModel}.`,"warning")},onDone:O=>{A(),R({messageId:O.messageId,message:O.message,accumulated:{text:C,thinking:T,toolCalls:w,fallbackInfo:I}})},onError:O=>{A(),p(O,r)}},cancelFlushes:A}}const qr="fusion:chat-pending:";function rs(n){return n?`${qr}${n}`:null}function Kr(n){const s=rs(n);if(!s||typeof window>"u")return"";try{return localStorage.getItem(s)??""}catch{return""}}function Gr(n,s){const r=rs(n);if(!(!r||typeof window>"u"))try{localStorage.setItem(r,s)}catch{}}function Dt(n){const s=rs(n);if(!(!s||typeof window>"u"))try{localStorage.removeItem(s)}catch{}}const Gn="kb-chat-active-session";function ta(n){const s=typeof n=="string"?n.trim():"",r=s.indexOf("/");return!s||r<=0||r>=s.length-1?{}:{modelProvider:s.slice(0,r),modelId:s.slice(r+1)}}function Vr(n){const s=n?.toolCalls;if(!Array.isArray(s))return;const r=s.map(l=>{if(!l||typeof l!="object")return null;const c=l,d=typeof c.toolName=="string"?c.toolName:"";if(!d)return null;const g=c.args;return{toolName:d,...g&&typeof g=="object"?{args:g}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(l=>l!==null);return r.length>0?r:void 0}function Qr(n){const s=n?.fallback;if(!s||typeof s!="object")return;const r=s,l=typeof r.primaryModel=="string"?r.primaryModel:"",c=typeof r.fallbackModel=="string"?r.fallbackModel:"",d=r.triggerPoint;if(!(!l||!c||d!=="session-creation"&&d!=="prompt-time"))return{primaryModel:l,fallbackModel:c,triggerPoint:d}}function Wr(n){const s=n?.failureInfo;if(!s||typeof s!="object")return;const r=s,l=typeof r.summary=="string"?r.summary.trim():"";if(!l)return;const c=(()=>{const d=r.reference;if(!d||typeof d!="object")return;const g=d,i=typeof g.kind=="string"?g.kind.trim():"",u=typeof g.id=="string"?g.id.trim():"";if(!(!i||!u))return{kind:i,id:u,...typeof g.label=="string"&&g.label.trim()?{label:g.label.trim()}:{}}})();return{summary:l,...typeof r.errorClass=="string"&&r.errorClass.trim()?{errorClass:r.errorClass.trim()}:{},...typeof r.code=="string"&&r.code.trim()?{code:r.code.trim()}:{},...typeof r.detail=="string"&&r.detail.trim()?{detail:r.detail.trim()}:{},...c?{reference:c}:{}}}function na(n,s){const r="Failed to get response";return typeof n=="string"?{summary:n.trim()||r}:{summary:typeof n.summary=="string"&&n.summary.trim()?n.summary.trim():r,...typeof n.errorClass=="string"&&n.errorClass.trim()?{errorClass:n.errorClass.trim()}:{},...typeof n.code=="string"&&n.code.trim()?{code:n.code.trim()}:{},...typeof n.detail=="string"&&n.detail.trim()?{detail:n.detail.trim()}:{},...n.reference?{reference:n.reference}:{}}}function Vn(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:Vr(n.metadata),fallbackInfo:Qr(n.metadata),failureInfo:Wr(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function Xr(n,s){const r=a.useCallback(f=>f?`${tt.CHAT_SESSIONS_PREFIX}${f}`:null,[]),l=a.useCallback((f,M)=>f&&M?`${tt.CHAT_MESSAGES_PREFIX}${f}:${M}`:null,[]),c=a.useCallback(f=>{const M=r(f);return M?Ye(M,{maxAgeMs:zs})??[]:[]},[r]),[d,g]=a.useState(()=>c(n)),[i,u]=a.useState(null),[E,j]=a.useState(()=>c(n).length===0),[R,p]=a.useState([]),[k,C]=a.useState(!1),[T,w]=a.useState(!1),[I,b]=a.useState(""),[V,U]=a.useState(""),[se,A]=a.useState([]),[q,O]=a.useState(""),[B,L]=a.useState(""),[H,y]=a.useState(!1),{agentsMap:F}=as(n),P=a.useRef(null),Y=a.useRef(null),S=a.useRef(!1),$=a.useRef(""),v=a.useRef(null),x=a.useRef(d),m=a.useRef(i),Q=a.useRef(R),D=a.useRef(T);x.current=d,m.current=i,Q.current=R,D.current=T,a.useEffect(()=>{$.current=q},[q]);const X=a.useRef(new Set),oe=a.useRef(0),de=a.useRef(n);de.current!==n&&(It({view:"useChat",trigger:"project-context-change",projectId:n,replayAttempted:!1,detail:{previousProjectId:de.current??null}}),de.current=n,oe.current++);const me=a.useCallback(async()=>{x.current.length===0&&j(!0);try{const M=[...(await Bs(n)).sessions].sort((K,ce)=>new Date(ce.updatedAt).getTime()-new Date(K.updatedAt).getTime());g(M);const _=r(n);_&&ie(_,M,{maxBytes:5e5})}catch{const f=c(n);if(x.current.length===0&&f.length===0){const M=r(n);M&&dn(M)}}finally{j(!1)}},[r,n]);a.useEffect(()=>{const f=c(n);g(f),j(f.length===0)},[n,c]),a.useEffect(()=>{me()},[me,n]);const he=a.useRef(()=>{}),ge=a.useRef(!1);a.useEffect(()=>{ge.current=!1,Y.current=null},[n]),a.useEffect(()=>{if(E||ge.current||m.current)return;const f=yt(Gn,n);if(!f){ge.current=!0;return}const M=d.find(_=>_.id===f);if(M){ge.current=!0,he.current(f,M);return}ge.current=!0},[E,d,n]);const Ce=a.useCallback((f,M)=>{const _=l(f,M);return _?Ye(_,{maxAgeMs:zs})??[]:[]},[l]),Ke=a.useCallback((f,M)=>{const _=Ce(n,f);return _.length>0?(p(_),C(!1),!0):(M?.clearOnMiss!==!1&&p([]),!1)},[n,Ce]),ye=a.useCallback(async(f,M)=>{const _=typeof M?.offset=="number"&&M.offset>0||typeof M?.before=="string",K=l(n,f),ce=_?[]:Ce(n,f),G=ce.length>0;!_&&G?(p(ce),C(!1)):C(!0);try{const ne=await tr(f,{limit:50,order:"desc",...M},n),W=ne.messages.slice().reverse().map(Vn),J=m.current?.id===f||M?.commitForStreamingAttach===!0&&Y.current?.sessionId===f;_?J&&(p(ae=>[...W,...ae]),y(ne.messages.length>=50)):J&&(p(W),y(ne.messages.length>=50),K&&ie(K,W,{maxBytes:5e5}))}catch{!_&&Q.current.length===0&&G&&(p(ce),C(!1))}finally{C(!1)}},[l,n,Ce]),$e=a.useCallback(()=>{v.current?.(),v.current=null,$.current="",O(""),b(""),U(""),A([]),w(!1)},[]),Ot=a.useCallback(()=>{Dt(m.current?.id),$.current="",O("")},[]),fe=a.useCallback(()=>{const f=$.current.trim();f&&(Dt(m.current?.id),$.current="",O(""),Ct.current(f))},[]),pe=a.useCallback((f,M,_)=>{if(P.current||!f)return!0;S.current=!1;const K=Q.current,ce=K.length===0||K[0]?.sessionId!==f;Y.current={sessionId:f,replayFromEventId:typeof M?.replayFromEventId=="number"?M.replayFromEventId:null},ce&&!_?.priorThreadLoadAlreadyStarted&&(Ke(f,{clearOnMiss:!1}),ye(f,{commitForStreamingAttach:!0})),M&&(b(M.streamingText),U(M.streamingThinking),A(M.toolCalls)),w(!0);const{handlers:G}=ea({sessionId:f,tempUserMessageId:"",initialText:M?.streamingText,initialThinking:M?.streamingThinking,initialToolCalls:M?.toolCalls,setStreamingText:b,setStreamingThinking:U,setStreamingToolCalls:A,cancelStreamingFlushesRef:v,addToast:_?.silent?void 0:s,onFallbackSession:(W,J)=>{const ae=ta(W.fallbackModel);g(te=>te.map(ee=>ee.id===J?{...ee,...ae}:ee)),u(te=>te&&te.id===J?{...te,...ae}:te)},onDone:()=>{b(""),U(""),A([]),w(!1),D.current=!1,P.current=null,Y.current=null,ye(f),fe()},onError:W=>{b(""),U(""),A([]),w(!1),D.current=!1,P.current=null,Y.current=null;const J=na(W);_?.silent||s?.(J.summary,"error"),ye(f),fe()}});It({view:"useChat",trigger:"sse-open",projectId:n,replayAttempted:typeof M?.replayFromEventId=="number",replayFromEventId:M?.replayFromEventId??null,lastEventId:M?.replayFromEventId??null});const ne=nr(f,G,n,{...typeof M?.replayFromEventId=="number"?{lastEventId:M.replayFromEventId}:{}});return P.current=ne,!0},[s,Ke,ye,n,fe]),Ae=a.useCallback((f,M)=>{const _=m.current?.id??null;if(f&&_===f&&!M)return;P.current&&(P.current.close(),P.current=null),Y.current=null;const K=M??d.find(ce=>ce.id===f);u(K||null),m.current=K||null,f&&an(f,n).then(({session:ce})=>{!ce.isGenerating||!ce.inFlightGeneration||u(G=>!G||G.id!==f?G:{...G,...ce})}).catch(()=>{}),$e(),y(!1),f?(Ke(f),ye(f)):p([]),K?.isGenerating&&pe(K.id,K.inFlightGeneration,{priorThreadLoadAlreadyStarted:!0}),f?gn(Gn,f,n):bt(Gn,n)},[pe,Ke,d,ye,n,$e]);he.current=Ae,a.useEffect(()=>{const f=i?.id;if(!f)return;const M=Kr(f);if(!M)return;$.current=M,O(M);let _=!1;return an(f,n).then(({session:K})=>{if(!(_||m.current?.id!==f||$.current.trim().length===0)){if(K.isGenerating){P.current||pe(f,K.inFlightGeneration);return}!D.current&&!P.current&&fe()}}).catch(()=>{}),()=>{_=!0}},[i?.id,pe,fe,n]);const Ge=a.useCallback(async f=>{const M=m.current?.id,_=await sr(f,n);P.current&&(P.current.close(),P.current=null),Y.current=null;const K={id:_.session.id,title:_.session.title,agentId:_.session.agentId,status:_.session.status,modelProvider:_.session.modelProvider,modelId:_.session.modelId,createdAt:_.session.createdAt,updatedAt:_.session.updatedAt};return g(ce=>ce.some(G=>G.id===K.id)?ce:[K,...ce]),Dt(M),$e(),Ae(K.id,K),K},[n,$e,Ae]),wt=a.useCallback(async f=>{Dt(f),await Us(f,{status:"archived"},n),g(M=>M.filter(_=>_.id!==f)),i?.id===f&&(Y.current=null,u(null),p([]))},[i,n]),vn=a.useCallback(async(f,M)=>{const _=M.trim()||null,K=d,ce=i;g(G=>G.map(ne=>ne.id===f?{...ne,title:_}:ne)),u(G=>G?.id===f?{...G,title:_}:G);try{const ne=(await Us(f,{title:_},n)).session;g(W=>W.map(J=>J.id===f?{...J,title:ne.title,updatedAt:ne.updatedAt}:J)),u(W=>W?.id===f?{...W,title:ne.title,updatedAt:ne.updatedAt}:W)}catch(G){throw g(K),u(ce),s?.("Failed to rename conversation","error"),G}},[i,s,n,d]),nt=a.useCallback(async f=>{Dt(f),i?.id===f&&P.current&&(P.current.close(),P.current=null),i?.id===f&&(Y.current=null),await ar(f,n);const M=l(n,f);M&&dn(M),g(_=>_.filter(K=>K.id!==f)),i?.id===f&&(u(null),p([]))},[i,l,n]),zt=a.useCallback(async()=>{if(!i||!H)return;const f=Q.current[0]?.createdAt;f&&await ye(i.id,{before:f})},[i,H,ye]),_e=a.useCallback(()=>{i&&(S.current=!0,v.current?.(),v.current=null,P.current?.close(),P.current=null,Y.current=null,rr(i.id,n).catch(()=>{}),w(!1),D.current=!1,b(""),U(""),A([]),fe())},[i,n,fe]),Ct=a.useRef(()=>{}),St=ir(),st=a.useCallback(async f=>{try{await me();const M=await an(f,n);m.current?.id===f&&u(_=>!_||_.id!==f?_:{..._,...M.session}),M.session.isGenerating?(b(""),U(""),A([]),w(!0),D.current=!0,pe(f,M.session.inFlightGeneration,{silent:!0})):(b(""),U(""),A([]),w(!1),D.current=!1,await ye(f))}catch{}},[pe,ye,n,me]),at=a.useCallback((f,M)=>{if(!i)return;if(D.current){$.current=f,O(f),Gr(i.id,f);return}S.current=!1,P.current&&(P.current.close(),P.current=null),Y.current=null;const _=`temp-${Date.now()}`,K={id:_,sessionId:i.id,role:"user",content:f,createdAt:new Date().toISOString()};p(G=>[...G,K]),b(""),U(""),A([]),w(!0);const{handlers:ce}=ea({sessionId:i.id,tempUserMessageId:_,setStreamingText:b,setStreamingThinking:U,setStreamingToolCalls:A,cancelStreamingFlushesRef:v,addToast:s,onFallbackSession:(G,ne)=>{const W=ta(G.fallbackModel);g(J=>J.map(ae=>ae.id===ne?{...ae,...W}:ae)),u(J=>J&&J.id===ne?{...J,...W}:J)},onDone:({messageId:G,message:ne,accumulated:W})=>{const J=ne?{...Vn(ne),...W.text.length>0?{content:W.text}:{}}:{id:G||`msg-${Date.now()}`,sessionId:i.id,role:"assistant",content:W.text,thinkingOutput:W.thinking,toolCalls:W.toolCalls.length>0?W.toolCalls:void 0,fallbackInfo:W.fallbackInfo,createdAt:new Date().toISOString()};X.current.add(J.id),p(ae=>[...ae,J]),b(""),U(""),A([]),w(!1),D.current=!1,P.current=null,Y.current=null,setTimeout(()=>{X.current.delete(J.id)},1e3),me(),fe()},onError:(G,ne)=>{const W=na(G),J=typeof G=="string"?G:W.summary,ae=cr(J);p(te=>{const ee=te.filter(ue=>ue.id!==ne);return ae?ee:[...ee,{id:`error-${Date.now()}`,sessionId:i.id,role:"assistant",content:W.summary,failureInfo:W,createdAt:new Date().toISOString()}]}),b(""),U(""),A([]),w(!1),D.current=!1,P.current=null,Y.current=null,console.error("[useChat] Stream error:",G),ae?(console.info("[useChat] Suppressed tab-suspension stream error:",G),i?.id&&(b(""),U(""),A([]),w(!0),D.current=!0,st(i.id))):(s?.(W.summary,"error"),me()),S.current||fe()}});P.current=or(i.id,f,ce,M,n)},[i,n,me,s,pe,st,fe]);Ct.current=at;const yn=B?d.filter(f=>f.title?.toLowerCase().includes(B.toLowerCase())||f.agentId.toLowerCase().includes(B.toLowerCase())):d;return a.useEffect(()=>{if(!i?.id||i.isGenerating!==!0||P.current)return;const f=typeof i.inFlightGeneration?.replayFromEventId=="number"?i.inFlightGeneration.replayFromEventId:null,M=Y.current;M?.sessionId===i.id&&M.replayFromEventId===f||pe(i.id,i.inFlightGeneration,{silent:!0})},[i?.id,i?.isGenerating,i?.inFlightGeneration,pe]),a.useEffect(()=>{if(!m.current?.isGenerating||(P.current||pe(m.current.id,m.current.inFlightGeneration),!D.current||P.current||!m.current))return;const f=setInterval(async()=>{if(!D.current||P.current||!m.current){clearInterval(f);return}try{(await Bs(n)).sessions.find(K=>K.id===m.current?.id)?.isGenerating||(clearInterval(f),await ye(m.current.id),b(""),U(""),A([]),w(!1),D.current=!1,fe())}catch{}},3e3);return()=>clearInterval(f)},[pe,ye,n,i,fe]),a.useEffect(()=>St.onBecameVisible(()=>{const M=m.current;if(!M||P.current)return;const _=oe.current;an(M.id,n).then(K=>{if(!(oe.current!==_||P.current)){if(K.session.isGenerating){b(""),U(""),A([]),w(!0),D.current=!0,pe(M.id,K.session.inFlightGeneration,{silent:!0});return}D.current&&(b(""),U(""),A([]),w(!1),D.current=!1,fe(),ye(M.id))}}).catch(()=>{})}),[pe,ye,n,St,fe]),a.useEffect(()=>{const f=oe.current,M=n?`?projectId=${encodeURIComponent(n)}`:"",_=()=>oe.current!==f,K=ae=>{if(_())return;const te=JSON.parse(ae.data);g(ee=>ee.some(ue=>ue.id===te.id)?ee:[te,...ee])},ce=ae=>{if(_())return;const te=JSON.parse(ae.data);g(ee=>[...ee.map(be=>be.id===te.id?te:be)]),m.current?.id===te.id&&(u(te),te.isGenerating&&!P.current&&pe(te.id,te.inFlightGeneration))},G=ae=>{if(_())return;const{id:te}=JSON.parse(ae.data);g(ue=>ue.filter(be=>be.id!==te));const ee=l(n,te);ee&&dn(ee),m.current?.id===te&&(u(null),p([]))},ne=ae=>{if(_())return;const te=JSON.parse(ae.data),ee=Vn(te);if(!X.current.has(ee.id)){if(m.current?.id===ee.sessionId&&D.current&&!P.current&&ee.role==="assistant"){p(ue=>ue.some(be=>be.id===ee.id)?ue:[...ue,ee]),b(""),U(""),A([]),w(!1),D.current=!1,fe();return}m.current?.id===ee.sessionId&&!D.current&&p(ue=>{if(ue.some(be=>be.id===ee.id))return ue;if(ee.role==="user"){const be=ue.findIndex(ke=>ke.role==="user"&&ke.id.startsWith("temp-")&&ke.content.trim()===ee.content.trim());if(be>=0){const ke=[...ue];return ke[be]=ee,ke}}return[...ue,ee]})}},W=ae=>{if(_())return;const{id:te}=JSON.parse(ae.data);p(ee=>ee.filter(ue=>ue.id!==te))};return wa(`/api/events${M}`,{events:{"chat:session:created":K,"chat:session:updated":ce,"chat:session:deleted":G,"chat:message:added":ne,"chat:message:deleted":W}})},[pe,l,n,fe]),a.useEffect(()=>()=>{P.current&&(P.current.close(),P.current=null),Y.current=null},[]),{sessions:d,activeSession:i,sessionsLoading:E,messages:R,messagesLoading:k,isStreaming:T,streamingText:I,streamingThinking:V,streamingToolCalls:se,pendingMessage:q,selectSession:Ae,createSession:Ge,archiveSession:wt,renameSession:vn,deleteSession:nt,sendMessage:at,stopStreaming:_e,clearPendingMessage:Ot,loadMoreMessages:zt,hasMoreMessages:H,searchQuery:B,setSearchQuery:L,filteredSessions:yn,refreshSessions:me,agentsMap:F}}function on(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function Yr(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function Qn(n,s){const r=Yr(),l=s?.warm===!0,c=on(),d=new Map;let g=!1,i=!1;return{mark(E){g||i||!r||d.has(E)||d.set(E,on())},complete:E=>{if(!r||g||i){g=!0;return}g=!0,d.set("complete",on());const j=Array.from(d.entries()).sort((C,T)=>C[1]-T[1]);let R=c;const p={};for(const[C,T]of j)p[C]=Math.max(0,T-R),R=T;const k=Math.max(0,on()-c);try{console.debug("[room-open]",{roomId:n,warm:l,totalMs:k,phases:p,...E??{}})}catch{}},cancel(){i=!0,g=!0}}}const Xe="fusion:chat-active-room";class Ra extends Error{roomId;constructor(s,r){super(s),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=r}}function es(n){return[...n].sort((s,r)=>new Date(r.updatedAt).getTime()-new Date(s.updatedAt).getTime())}function gt(n,s){const r=n.findIndex(c=>c.id===s.id);if(r===-1)return es([s,...n]);const l=[...n];return l[r]=s,es(l)}function qe(n){try{return JSON.parse(n.data)}catch{return null}}function Jr(n,s,r){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:n,role:"user",content:s,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...r?.length?{attachments:r}:{},createdAt:new Date().toISOString()}}function sa(n,s,r){if(n.some(c=>c.id===s.id))return n;const l=r?n.findIndex(c=>c.id===r):-1;if(l>=0){const c=[...n];return c[l]=s,c}if(s.role==="user"){const c=n.findIndex(d=>d.role==="user"&&d.id.startsWith("temp-")&&d.content.trim()===s.content.trim());if(c>=0){const d=[...n];return d[c]=s,d}}return[...n,s]}function Zr(n,s){const{t:r}=Fe("app"),l=`${tt.CHAT_ROOMS}:${n??"global"}`,c=`${tt.ACTIVE_CHAT_ROOM_ID}:${n??"global"}`,d=a.useCallback(S=>`${tt.CHAT_ROOM_MESSAGES_PREFIX}${n??"global"}:${S}`,[n]),g=a.useCallback(S=>`${tt.CHAT_ROOM_MEMBERS_PREFIX}${n??"global"}:${S}`,[n]),[i,u]=a.useState(()=>{const S=Ye(l,{maxAgeMs:Zn});return Array.isArray(S)?S:[]}),[E,j]=a.useState(()=>i.length===0),[R,p]=a.useState(null),[k,C]=a.useState(()=>{const S=Ye(c,{maxAgeMs:Hs});return S?i.find($=>$.id===S)??null:null}),[T,w]=a.useState([]),[I,b]=a.useState([]),[V,U]=a.useState(!1),se=a.useRef(i),A=a.useRef(k),q=a.useRef(0),O=a.useRef(n);se.current=i,A.current=k,O.current!==n&&(O.current=n,q.current+=1);const B=a.useCallback(async S=>{if(!S){w([]),b([]),U(!1);return}const $=Qn(S.id,{warm:!1});$.mark("select");const v=Ye(d(S.id),{maxAgeMs:lr}),x=Ye(g(S.id),{maxAgeMs:Zn}),m=Array.isArray(v)&&v.length>0,Q=Array.isArray(x)&&x.length>0;m||Q?($.mark("cache-hit"),m&&(b(v),$.mark("hydrate")),Q&&w(x),U(!1)):(b([]),U(!0));try{const[D,X]=await Promise.all([ur(S.id,n),qn(S.id,{limit:100,order:"desc"},n)]);$.mark("members-fetch"),$.mark("messages-fetch"),ie(g(S.id),D.members,{maxBytes:5e5}),ie(d(S.id),X.messages,{maxBytes:5e5}),A.current?.id===S.id&&(w(D.members),b(X.messages),$.mark("hydrate"))}catch{!m&&!Q&&(w([]),b([]))}finally{U(!1),$.complete({warm:m,membersCached:Q})}},[g,d,n]),L=a.useCallback(async()=>{se.current.length===0&&j(!0);try{const S=await dr({},n),$=es(S.rooms);u($),ie(l,$,{maxBytes:5e5}),p(null);const v=Ye(c,{maxAgeMs:Hs})??yt(Xe,n);if(v){const x=$.find(m=>m.id===v)??null;x?(C(x),B(x)):(bt(Xe,n),ie(c,"",{maxBytes:5e5}))}}catch(S){const $=S instanceof Error?S.message:r("chatRooms.error.failedToLoad","Failed to load chat rooms");p($),s?.($,"error")}finally{j(!1)}},[c,s,B,n,l]),H=a.useCallback(S=>{if(!S){A.current=null,C(null),bt(Xe,n),ie(c,"",{maxBytes:5e5}),B(null);return}const $=se.current.find(v=>v.id===S)??null;A.current=$,C($),$&&(gn(Xe,$.id,n),ie(c,$.id,{maxBytes:5e5}),B($))},[c,B,n]),y=a.useCallback(async S=>{const v=(await mr({name:S.name,memberAgentIds:S.memberAgentIds},n)).room;return u(x=>gt(x,v)),A.current=v,C(v),gn(Xe,v.id,n),ie(c,v.id,{maxBytes:5e5}),await B(v),v},[c,B,n]),F=a.useCallback(async S=>{await hr(S,n),u($=>$.filter(v=>v.id!==S)),ie(d(S),[],{maxBytes:5e5}),ie(g(S),[],{maxBytes:5e5}),A.current?.id===S&&(A.current=null,C(null),w([]),b([]),bt(Xe,n),ie(c,"",{maxBytes:5e5}))},[c,g,d,n]),P=a.useCallback(async(S,$)=>{const v=A.current,x=v?.id;if(!x)throw new Error(r("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const m=Qn(x,{warm:!1}),Q=$?.files?.map(oe=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:oe.name,originalName:oe.name,mimeType:oe.type||"application/octet-stream",size:oe.size,createdAt:new Date().toISOString()})),D=Jr(x,S,Q?.length?Q:$?.attachments);A.current?.id===x&&b(oe=>{const de=[...oe,D];return ie(d(x),de,{maxBytes:5e5}),de});let X=!1;try{const oe=[];if($?.files?.length)for(const ge of $.files)try{const Ce=await fr(x,ge,n);oe.push(Ce.attachment)}catch{throw new Error(r("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:ge.name}))}const de=[...$?.attachments??[],...oe],me=await gr(x,{content:S,...de.length?{attachments:de}:{}},n);X=!0,me.message?.createdAt&&v&&u(ge=>gt(ge,{...v,updatedAt:me.message.createdAt})),A.current?.id===x&&b(ge=>{const Ce=sa(ge,me.message,D.id);return ie(d(x),Ce,{maxBytes:5e5}),Ce});const he=await qn(x,{limit:100,order:"desc"},n);if(ie(d(x),he.messages,{maxBytes:5e5}),A.current?.id!==x)return;b(he.messages),m.mark("hydrate")}catch(oe){let de=null;try{const he=await qn(x,{limit:100,order:"desc"},n);de=he.messages,ie(d(x),he.messages,{maxBytes:5e5}),A.current?.id===x&&(b(he.messages),m.mark("hydrate"))}catch{A.current?.id===x&&b(he=>{const ge=he.filter(Ce=>Ce.id!==D.id);return ie(d(x),ge,{maxBytes:5e5}),ge})}const me=de?.some(he=>he.role==="user"&&he.content.trim()===D.content.trim());if(X||me){const he=oe instanceof Error&&oe.message.trim()?oe.message:r("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new Ra(he,x)}throw oe}finally{m.complete({source:"send-room-message"})}},[d,n]),Y=a.useCallback(async S=>{!S||!se.current.some($=>$.id===S)||(await pr(S,n),ie(d(S),[],{maxBytes:5e5}),A.current?.id===S&&b([]))},[d,n]);return a.useEffect(()=>{L()},[L]),a.useEffect(()=>{const S=q.current,$=n?`/api/events?projectId=${encodeURIComponent(n)}`:"/api/events";return wa($,{onReconnect:()=>{It({view:"useChatRooms",trigger:"sse-reconnect",projectId:n,replayAttempted:!1});const v=A.current?.id;if(v){const x=Qn(v,{warm:!0});x.mark("sse-reconnect-refresh"),L().finally(()=>x.complete({source:"sse-reconnect"}));return}L()},events:{"chat:room:created":v=>{if(q.current!==S)return;const x=qe(v);x&&u(m=>gt(m,x))},"chat:room:updated":v=>{if(q.current!==S)return;const x=qe(v);x&&(u(m=>gt(m,x)),A.current?.id===x.id&&C(x))},"chat:room:deleted":v=>{if(q.current!==S)return;const x=qe(v);x?.id&&(u(m=>m.filter(Q=>Q.id!==x.id)),ie(d(x.id),[],{maxBytes:5e5}),ie(g(x.id),[],{maxBytes:5e5}),A.current?.id===x.id&&(A.current=null,C(null),w([]),b([]),bt(Xe,n),ie(c,"",{maxBytes:5e5})))},"chat:room:member:added":v=>{if(q.current!==S)return;const x=qe(v);!x||A.current?.id!==x.roomId||w(m=>{if(m.some(D=>D.agentId===x.agentId))return m;const Q=[...m,x];return ie(g(x.roomId),Q,{maxBytes:5e5}),Q})},"chat:room:member:removed":v=>{if(q.current!==S)return;const x=qe(v);!x||A.current?.id!==x.roomId||w(m=>{const Q=m.filter(D=>D.agentId!==x.agentId);return ie(g(x.roomId),Q,{maxBytes:5e5}),Q})},"chat:room:message:added":v=>{if(q.current!==S)return;const x=qe(v);x&&(u(m=>{const Q=m.find(D=>D.id===x.roomId);return Q?gt(m,{...Q,updatedAt:x.createdAt}):m}),A.current?.id===x.roomId&&b(m=>{const Q=sa(m,x);return Q===m?m:(ie(d(x.roomId),Q,{maxBytes:5e5}),Q)}))},"chat:room:message:updated":v=>{if(q.current!==S)return;const x=qe(v);!x||A.current?.id!==x.roomId||b(m=>{const Q=m.map(D=>D.id===x.id?x:D);return ie(d(x.roomId),Q,{maxBytes:5e5}),Q})},"chat:room:message:deleted":v=>{if(q.current!==S)return;const x=qe(v);x?.id&&b(m=>{const Q=m.filter(X=>X.id!==x.id),D=A.current?.id;return D&&ie(d(D),Q,{maxBytes:5e5}),Q})},"chat:room:messages:cleared":v=>{if(q.current!==S)return;const x=qe(v);x?.roomId&&(ie(d(x.roomId),[],{maxBytes:5e5}),A.current?.id===x.roomId&&b([]),u(m=>{const Q=m.find(D=>D.id===x.roomId);return Q?gt(m,{...Q,updatedAt:new Date().toISOString()}):m}))}}})},[c,g,d,n,L]),a.useEffect(()=>{k&&(i.some(S=>S.id===k.id)||(A.current=null,C(null),w([]),b([]),bt(Xe,n),ie(c,"",{maxBytes:5e5})))},[k,c,n,i]),{rooms:i,roomsLoading:E,roomsError:R,activeRoom:k,activeRoomMembers:T,messages:I,messagesLoading:V,selectRoom:H,createRoom:y,deleteRoom:F,sendRoomMessage:P,clearRoom:Y,refreshRooms:L}}const Lt={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},aa=200;function ts(n){if(!n)return null;const s=new Date(n).getTime();return Number.isFinite(s)?s:null}function Aa(n){const s=Object.entries(n);if(s.length<=aa)return n;const r=s.map(([l,c])=>({id:l,timestamp:c,value:ts(c)??0})).sort((l,c)=>c.value-l.value).slice(0,aa);return Object.fromEntries(r.map(({id:l,timestamp:c})=>[l,c]))}function cn(n){if(!n)return{};try{const s=JSON.parse(n);if(!s||typeof s!="object")return{};const r={};for(const[l,c]of Object.entries(s))typeof l=="string"&&typeof c=="string"&&(r[l]=c);return Aa(r)}catch{return{}}}function ei(n){const[s,r]=a.useState(()=>{try{return cn(yt(Lt.direct,n))}catch{return{}}}),[l,c]=a.useState(()=>{try{return cn(yt(Lt.room,n))}catch{return{}}});a.useEffect(()=>{try{r(cn(yt(Lt.direct,n)))}catch{r({})}try{c(cn(yt(Lt.room,n)))}catch{c({})}},[n]);const d=a.useMemo(()=>({direct:s,room:l}),[s,l]),g=a.useCallback((R,p)=>{const k=Aa(p);try{gn(Lt[R],JSON.stringify(k),n)}catch{}return k},[n]),i=a.useCallback((R,p)=>{if(R==="direct"){r(k=>g(R,p(k)));return}c(k=>g(R,p(k)))},[g]),u=a.useCallback((R,p,k)=>{const C=ts(k);if(C===null)return!1;const T=d[R][p],w=ts(T);return w===null?!0:C>w},[d]),E=a.useCallback((R,p,k)=>{if(!p)return;const C=k??new Date().toISOString();i(R,T=>({...T,[p]:C}))},[i]),j=a.useCallback((R,p)=>{p.length!==0&&i(R,k=>{const C={...k};for(const T of p)T.id&&(C[T.id]=T.lastActivityAt??new Date().toISOString());return C})},[i]);return{isUnread:u,markRead:E,markAllRead:j}}const ti=["AskUserQuestion","ask_user","ask_followup_question","request_user_input","elicit","ask_question","fn_ask_question"],ni=new Set(ti.map(n=>n.toLowerCase()));function si(n){return ni.has(n.toLowerCase())}function ai(n){if(!si(n.toolName))return null;const s=xt(n.args);if(!s)return null;const r=Array.isArray(s.questions)?s.questions:null,l=r?r.map((c,d)=>ra(c,d)).filter(oa):[ra(s,0)].filter(oa);return l.length>0?{questions:l}:null}function ri(n,s){return n.map(r=>{const l=s[r.id];return`> Q: ${r.question}
17
+ ${ui(r,l)}`}).join(`
18
+
19
+ `)}function ra(n,s){const r=xt(n);if(!r)return null;const l=Le(r.question,r.prompt,r.message,r.text,r.title);if(!l)return null;const c=li(di(r.options,r.choices,r.enum,r.values)),d=oi(Le(r.type,r.questionType,r.inputType,r.responseType)),g=!!(r.multiSelect??r.multiselect??r.multiple??r.allowMultiple??r.multiple_choice);if((d==="single_select"||d==="multi_select")&&c.length===0)return null;const i=ii(r,c,d,g);return(i==="single_select"||i==="multi_select")&&c.length===0?null:{id:Le(r.id,r.name,r.key)??`q-${s}`,type:i,question:l,header:Le(r.header,r.heading)??void 0,description:Le(r.description,r.details,r.helpText)??void 0,options:c.length>0?c:void 0,multiSelect:i==="multi_select"?!0:g||void 0}}function ii(n,s,r,l){return r?r==="multi_select"&&s.length===0||r==="single_select"&&s.length===0?"text":r:ci(n,s)?"confirm":s.length>0?l?"multi_select":"single_select":"text"}function oi(n){if(!n)return null;const s=n.toLowerCase().replace(/[\s-]+/g,"_");return s==="text"||s==="free_text"||s==="input"?"text":s==="single_select"||s==="select"||s==="choice"?"single_select":s==="multi_select"||s==="multiple_select"||s==="checkbox"?"multi_select":s==="confirm"||s==="confirmation"||s==="boolean"||s==="yes_no"?"confirm":null}function ci(n,s){const r=Le(n.type,n.schemaType,n.inputType,n.responseType)?.toLowerCase().replace(/[\s-]+/g,"_");if(r==="boolean"||r==="confirm"||r==="confirmation"||r==="yes_no")return!0;const l=xt(n.schema)??xt(n.inputSchema)??xt(n.parameters),c=Le(l?.type,l?.format)?.toLowerCase().replace(/[\s-]+/g,"_");if(c==="boolean"||c==="yes_no")return!0;if(s.length!==2)return!1;const d=s.map(g=>g.label.trim().toLowerCase());return d.includes("yes")&&d.includes("no")}function li(n){return n?n.map((s,r)=>{const l=xt(s);if(!l)return typeof s=="string"||typeof s=="number"||typeof s=="boolean"?{id:`opt-${r}`,label:String(s)}:null;const c=Le(l.label,l.text,l.name,l.title,l.value,l.id);return c?{id:Le(l.id,l.value,l.key)??`opt-${r}`,label:c,description:Le(l.description,l.details,l.helpText)??void 0}:null}).filter(mi):[]}function ui(n,s){if(s===void 0)return"(no answer)";if(n.type==="confirm")return s===!0?"Yes":"No";if(Array.isArray(s)){const r=s.map(l=>ia(n,l)).filter(Boolean);return r.length>0?r.join(", "):"(no answer)"}return n.type==="single_select"?ia(n,String(s))??String(s):String(s).trim()||"(no answer)"}function ia(n,s){return n.options?.find(r=>r.id===s)?.label??null}function xt(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:null}function Le(...n){for(const s of n){if(typeof s=="string"&&s.trim().length>0)return s.trim();if(typeof s=="number"||typeof s=="boolean")return String(s)}return null}function di(...n){return n.find(Array.isArray)??null}function oa(n){return n!==null}function mi(n){return n!==null}function hi({parsed:n,answered:s=!1,submittedAnswer:r,compact:l=!1,disabled:c=!1,onSubmit:d}){const{t:g}=Fe("app"),[i,u]=a.useState({}),E=a.useRef(new Map),j=a.useMemo(()=>n.questions.every(C=>gi(C,i[C.id])),[i,n.questions]);a.useLayoutEffect(()=>{for(const C of E.current.values())C.style.height="0",C.style.height=`${C.scrollHeight}px`},[i]);const R=a.useCallback((C,T)=>{u(w=>({...w,[C]:T}))},[]),p=a.useCallback((C,T,w)=>{u(I=>{const b=I[C],V=Array.isArray(b)?b:[];return{...I,[C]:w?[...V,T]:V.filter(U=>U!==T)}})},[]),k=a.useCallback(()=>{if(!j||s||c)return;const C=ri(n.questions,i);d(C,i)},[i,s,c,j,d,n.questions]);return e.jsxs("section",{className:`chat-question-response${l?" chat-question-response--compact":""}${s?" chat-question-response--answered":""}`,"data-testid":"chat-question-response","aria-label":g("chat.questionResponseLabel","Question from assistant"),children:[e.jsxs("div",{className:"chat-question-response__header",children:[e.jsx("span",{className:"chat-question-response__eyebrow",children:g("chat.questionResponseEyebrow","Assistant question")}),s&&e.jsx("span",{className:"chat-question-response__answered-label",children:g("chat.questionAnsweredLabel","Answered")})]}),e.jsx("div",{className:"chat-question-response__questions",children:n.questions.map((C,T)=>e.jsxs("article",{className:"chat-question-response__question",children:[C.header&&e.jsx("p",{className:"chat-question-response__question-header",children:C.header}),e.jsx("h4",{className:"chat-question-response__question-text",children:C.question}),C.description&&e.jsx("p",{className:"chat-question-response__description",children:C.description}),s?null:e.jsx(fi,{question:C,questionIndex:T,value:i[C.id],disabled:c,setQuestionAnswer:R,toggleMultiSelect:p,textareaRefs:E})]},C.id))}),s?e.jsxs("div",{className:"chat-question-response__submitted","data-testid":"chat-question-response-submitted-answer",children:[e.jsx("span",{className:"chat-question-response__submitted-label",children:g("chat.questionSubmittedAnswerLabel","Submitted answer")}),e.jsx("pre",{children:r||g("chat.questionAnsweredWithoutContent","A later user reply answered this question.")})]}):e.jsxs("div",{className:"chat-question-response__actions",children:[e.jsx("p",{className:"chat-question-response__hint",children:g("chat.questionSelectHint","Answer all questions to continue the chat.")}),e.jsx("button",{type:"button",className:"btn btn-primary chat-question-response__submit","data-testid":"chat-question-response-submit",disabled:!j||c,onClick:k,children:g("chat.questionSubmit","Send answer")})]})]})}function fi({question:n,questionIndex:s,value:r,disabled:l,setQuestionAnswer:c,toggleMultiSelect:d,textareaRefs:g}){const{t:i}=Fe("app");if(n.type==="text")return e.jsx("textarea",{className:"input chat-question-response__textarea","data-testid":`chat-question-response-text-${n.id}`,placeholder:i("chat.questionTextPlaceholder","Type your answer here…"),value:typeof r=="string"?r:"",disabled:l,rows:3,ref:p=>{p?g.current.set(n.id,p):g.current.delete(n.id)},onChange:p=>c(n.id,p.target.value)});if(n.type==="confirm")return e.jsxs("div",{className:"chat-question-response__confirm-group",role:"group","aria-label":n.question,children:[e.jsx("button",{type:"button",className:`btn chat-question-response__confirm${r===!0?" chat-question-response__confirm--selected":""}`,"data-testid":`chat-question-response-option-${n.id}-yes`,disabled:l,onClick:()=>c(n.id,!0),children:i("chat.questionConfirmYes","Yes")}),e.jsx("button",{type:"button",className:`btn chat-question-response__confirm${r===!1?" chat-question-response__confirm--selected":""}`,"data-testid":`chat-question-response-option-${n.id}-no`,disabled:l,onClick:()=>c(n.id,!1),children:i("chat.questionConfirmNo","No")})]});const u=n.options??[],E=Array.isArray(r)?r:[],j=`chat-question-${n.id}-${s}`,R=n.type==="multi_select";return e.jsx("div",{className:"chat-question-response__options",role:R?"group":"radiogroup","aria-label":n.question,children:u.map(p=>{const k=R?E.includes(p.id):r===p.id;return e.jsxs("label",{className:`chat-question-response__option${k?" chat-question-response__option--selected":""}`,"data-testid":`chat-question-response-option-${n.id}-${p.id}`,children:[e.jsx("input",{type:R?"checkbox":"radio",name:R?void 0:j,value:p.id,checked:k,disabled:l,onChange:C=>{R?d(n.id,p.id,C.target.checked):c(n.id,p.id)}}),e.jsxs("span",{className:"chat-question-response__option-content",children:[e.jsx("span",{className:"chat-question-response__option-label",children:p.label}),p.description&&e.jsx("span",{className:"chat-question-response__option-description",children:p.description})]})]},p.id)})})}function gi(n,s){return n.type==="text"?typeof s=="string"&&s.trim().length>0:n.type==="multi_select"?Array.isArray(s)&&s.length>0:n.type==="confirm"?typeof s=="boolean":typeof s=="string"&&s.trim().length>0}function ca(n){return n.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function ja(n,s){const r=s.trim();if(!r)return!0;const l=ca(r);return ca(n).includes(l)||n.toLowerCase().includes(r.toLowerCase())}function la({agents:n,filter:s,highlightedIndex:r,visible:l,onSelect:c,position:d="below",roomMemberIds:g,roomName:i}){const{t:u}=Fe("app"),E=a.useMemo(()=>n.filter(T=>ja(T.name,s)),[n,s]),j=!!g,R=j&&s.trim().length>0,p=a.useMemo(()=>j?E.filter(T=>g?.has(T.id)):E,[E,g,j]),k=a.useMemo(()=>j?E.filter(T=>!g?.has(T.id)):[],[E,g,j]),C=R?[...p,...k]:p;return l?e.jsx("div",{className:`agent-mention-popup agent-mention-popup--${d}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":u("agentMention.suggestionsLabel","Agent mention suggestions"),children:C.length===0?e.jsx("div",{className:"agent-mention-empty",children:u("agentMention.noAgentsFound","No agents found")}):e.jsxs(e.Fragment,{children:[j&&e.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:i?u("agentMention.membersOf","Members of #{{roomName}}",{roomName:i}):u("agentMention.roomMembers","Room members")}),p.map((T,w)=>e.jsxs("button",{type:"button",className:`agent-mention-item${w===r?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${T.id}`,onMouseDown:I=>I.preventDefault(),onClick:()=>c(T),role:"option","aria-selected":w===r,children:[e.jsx(pn,{agent:T,size:20}),j&&e.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":u("agentMention.roomMemberBadge","Room member")}),e.jsx("span",{className:"agent-mention-name",children:T.name}),e.jsx("span",{className:"agent-mention-role",children:T.role})]},T.id)),j&&!R&&k.length>0&&e.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:u("agentMention.typeToSearch","Type to search other agents")}),j&&R&&k.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:u("agentMention.otherAgents","Other agents")}),k.map((T,w)=>{const I=p.length+w;return e.jsxs("button",{type:"button",className:`agent-mention-item${I===r?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${T.id}`,onMouseDown:b=>b.preventDefault(),onClick:()=>c(T),role:"option","aria-selected":I===r,children:[e.jsx(pn,{agent:T,size:20}),e.jsx("span",{className:"agent-mention-name",children:T.name}),e.jsx("span",{className:"agent-mention-role",children:T.role})]},T.id)})]})]})}):null}function pi(n,s){return n+s}function bi({visible:n,position:s,tasks:r,files:l,selectedIndex:c,onSelectTask:d,onSelectFile:g,loading:i}){const{t:u}=Fe("app");if(!n)return null;const E=r.length>0,j=l.length>0;return e.jsxs("div",{className:"file-mention-popup",style:{top:s.top,left:s.left},"data-testid":"file-mention-popup",onMouseDown:R=>{R.preventDefault()},children:[i&&e.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:e.jsx("span",{className:"spinner"})}),!i&&!E&&!j&&e.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:u("fileMention.empty","No tasks or files found")}),!i&&(E||j)&&e.jsxs("div",{className:"file-mention-popup-groups",children:[E&&e.jsxs("div",{className:"file-mention-popup-group",children:[e.jsx("div",{className:"file-mention-popup-group-header",children:u("fileMention.taskHeader","Tasks")}),e.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":u("fileMention.taskMatches","Task matches"),children:r.map((R,p)=>{const k=p;return e.jsxs("li",{className:`file-mention-popup-item${k===c?" file-mention-popup-item--selected":""}`,onClick:()=>d(R),role:"option","aria-selected":k===c,"data-testid":`task-mention-item-${k}`,children:[e.jsx("span",{className:"file-mention-popup-icon",children:e.jsx(Ma,{})}),e.jsxs("div",{className:"file-mention-popup-info",children:[e.jsxs("div",{className:"file-mention-popup-task-row",children:[e.jsx("span",{className:"file-mention-popup-task-id",children:R.id}),e.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${R.column}`,children:R.column})]}),e.jsx("span",{className:"file-mention-popup-item-path",children:R.title})]})]},R.id)})})]}),j&&e.jsxs("div",{className:"file-mention-popup-group",children:[e.jsx("div",{className:"file-mention-popup-group-header",children:u("fileMention.fileHeader","Files")}),e.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":u("fileMention.fileMatches","File matches"),children:l.map((R,p)=>{const k=pi(r.length,p),C=br(R.path);return e.jsxs("li",{className:`file-mention-popup-item${k===c?" file-mention-popup-item--selected":""}`,onClick:()=>g(R),role:"option","aria-selected":k===c,"data-testid":`file-mention-item-${k}`,children:[e.jsx("span",{className:"file-mention-popup-icon",children:e.jsx(Ca,{})}),e.jsxs("div",{className:"file-mention-popup-info",children:[e.jsx("span",{className:"file-mention-popup-item-name",children:R.name}),C&&e.jsx("span",{className:"file-mention-popup-item-path",children:C})]})]},R.path)})})]})]})]})}function vi(n,s=[],r){const l=n.trim().replace(/^#/,""),c=(g,i)=>r?r(g,i):i;if(!l)return{ok:!1,error:c("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(l))return{ok:!1,error:c("createRoom.lowercase","Use lowercase letters only.")};const d=l.toLowerCase();return d.length>80?{ok:!1,error:c("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(d)?/^[-_]|[-_]$/.test(d)?{ok:!1,error:c("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:s.some(g=>g.toLowerCase()===d)?{ok:!1,error:c("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:d}:{ok:!1,error:c("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function yi({isOpen:n,onClose:s,onCreate:r,projectId:l,existingRoomNames:c=[]}){const{t:d}=Fe("app"),[g,i]=a.useState(""),[u,E]=a.useState([]),[j,R]=a.useState(""),[p,k]=a.useState([]),[C,T]=a.useState(!1),[w,I]=a.useState(null),[b,V]=a.useState(!1),U=a.useRef(null),se=a.useRef(null);a.useEffect(()=>{n&&(se.current=document.activeElement instanceof HTMLElement?document.activeElement:null,T(!0),I(null),vr(void 0,l).then(y=>E(y)).catch(()=>{E([]),I(d("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>T(!1)))},[n,l]),a.useEffect(()=>{if(!n){i(""),R(""),k([]),I(null),V(!1);return}const y=window.requestAnimationFrame(()=>U.current?.focus());return()=>window.cancelAnimationFrame(y)},[n]),a.useEffect(()=>{if(!n)return;const y=F=>{F.key==="Escape"&&s()};return document.addEventListener("keydown",y),()=>document.removeEventListener("keydown",y)},[n,s]),a.useEffect(()=>{n||se.current?.focus()},[n]);const A=a.useMemo(()=>vi(g,c,d),[g,c,d]),q=a.useMemo(()=>{const y=j.trim().toLowerCase();return y?u.filter(F=>F.name.toLowerCase().includes(y)):u},[u,j]),O=a.useMemo(()=>u.filter(y=>p.includes(y.id)),[u,p]),B=A.ok&&p.length>0&&!b&&!C;if(!n)return null;const L=y=>{b||k(F=>F.includes(y)?F.filter(P=>P!==y):[...F,y])},H=async()=>{if(!A.ok){I(A.error);return}if(p.length===0){I(d("createRoom.selectMember","Select at least one member."));return}I(null),V(!0);try{await r({name:A.name,displayName:`#${A.name}`,memberAgentIds:p}),s()}catch(y){I(y instanceof Error?y.message:d("createRoom.failedCreate","Failed to create room."))}finally{V(!1)}};return Za.createPortal(e.jsx("div",{className:"modal-overlay open",onClick:y=>y.target===y.currentTarget&&s(),children:e.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":d("createRoom.title","Create room"),onClick:y=>y.stopPropagation(),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:d("createRoom.title","Create room")}),e.jsx("button",{type:"button",className:"modal-close","aria-label":d("actions.close","Close"),onClick:s,children:"×"})]}),e.jsxs("div",{className:"form-group create-room-modal-name-group",children:[e.jsx("label",{htmlFor:"create-room-name",children:d("createRoom.nameLabel","Room name")}),e.jsxs("div",{className:"create-room-modal-name-field",children:[e.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),e.jsx("input",{ref:U,id:"create-room-name",className:"input",value:g,disabled:b,onChange:y=>{const F=y.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();i(F)}})]}),!A.ok&&e.jsx("div",{className:"form-error",children:A.error})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"create-room-member-search",children:d("createRoom.members","Members")}),e.jsx("input",{id:"create-room-member-search",className:"input",placeholder:d("createRoom.searchAgents","Search agents"),value:j,disabled:b,onChange:y=>R(y.target.value)})]}),O.length>0&&e.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:O.map(y=>e.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>L(y.id),disabled:b,children:[y.name," ×"]},y.id))}),e.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:C?e.jsx("div",{className:"create-room-modal-empty",children:e.jsx(yr,{label:d("createRoom.loadingAgents","Loading agents...")})}):q.length===0?e.jsx("div",{className:"create-room-modal-empty",children:u.length===0?d("createRoom.noAgents","No agents in this project yet."):d("createRoom.noMatch","No agents match your search.")}):q.map(y=>{const F=p.includes(y.id);return e.jsxs("button",{type:"button",className:`create-room-modal-member-row${F?" create-room-modal-member-row--selected":""}`,onClick:()=>L(y.id),disabled:b,children:[e.jsx(pn,{agent:y,size:20}),e.jsx("span",{children:y.name}),e.jsx("span",{className:"create-room-modal-member-role",children:y.role})]},y.id)})}),w&&e.jsx("div",{className:"form-group",children:e.jsx("div",{className:"form-error",children:w})}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:s,disabled:b,children:d("actions.cancel","Cancel")}),e.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void H(),disabled:!B,children:b?d("createRoom.creating","Creating..."):d("createRoom.create","Create room")})]})]})}),document.body)}function xi({cliSessionId:n,tier:s,projectId:r,renderTranscript:l,renderComposer:c,queuedCount:d=0,terminalProps:g}){const{t:i}=Fe("app"),u=s==="generic",[E,j]=a.useState(u?"terminal":"transcript");if(u)return e.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:e.jsx(Js,{sessionId:n,projectId:r,...g})});const R=E==="terminal";return e.jsxs("div",{className:"cli-chat-surface","data-tier":s,"data-view":E,children:[e.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":i("cliChat.viewToggleLabel","Chat view"),children:[e.jsxs("button",{type:"button",role:"tab","aria-selected":!R,className:`cli-chat-surface__tab${R?"":" is-active"}`,onClick:()=>j("transcript"),children:[e.jsx(mn,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:i("cliChat.transcriptTab","Transcript")})]}),e.jsxs("button",{type:"button",role:"tab","aria-selected":R,className:`cli-chat-surface__tab${R?" is-active":""}`,onClick:()=>j("terminal"),children:[e.jsx(xr,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:i("cliChat.terminalTab","Terminal")})]})]}),e.jsx("div",{className:"cli-chat-surface__body",children:R?e.jsx(Js,{sessionId:n,projectId:r,...g}):l()}),!R&&e.jsxs("div",{className:"cli-chat-surface__composer",children:[d>0&&e.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:i("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:d})}),c()]})]})}const wi=200,Ci=8,Si=8;function ua(){return new DOMException("The operation was aborted.","AbortError")}function da(n,s){return s.aborted?Promise.reject(ua()):new Promise((r,l)=>{const c=()=>l(ua());s.addEventListener("abort",c,{once:!0}),n.then(d=>{s.removeEventListener("abort",c),r(d)},d=>{s.removeEventListener("abort",c),l(d)})})}function ma(n,s,r){const l=n.slice(0,s),c=n.slice(s+1),d=c.match(/[\s]|$/),g=d?d.index??c.length:c.length,i=c.slice(g);return`${l}${r}${i}`}function ki(n={}){const{projectId:s,workspace:r="project"}=n,[l,c]=a.useState(!1),[d,g]=a.useState(""),[i,u]=a.useState(-1),[E,j]=a.useState([]),[R,p]=a.useState([]),[k,C]=a.useState(!1),[T,w]=a.useState(0),I=a.useRef(null),b=a.useRef(null),V=[...E.map(L=>({kind:"task",task:L})),...R.map(L=>({kind:"file",file:L}))];a.useEffect(()=>()=>{I.current&&clearTimeout(I.current),b.current?.abort()},[]);const U=a.useCallback((L,H)=>{if(H<0||H>L.length){c(!1);return}const y=F=>/[a-zA-Z0-9/_.-]/.test(F);for(let F=H-1;F>=0;F--){if(L[F]==="#"){if(F===0){const Y=L.slice(F+1,H);u(F),g(Y),w(0),c(!0);return}const P=L[F-1];if(/[\s,.;:!?'"()[\]{}]/.test(P)){const Y=L.slice(F+1,H);u(F),g(Y),w(0),c(!0);return}c(!1);return}if(!y(L[F])){c(!1);return}}c(!1)},[]),se=a.useCallback(()=>{b.current?.abort(),c(!1),g(""),u(-1),j([]),p([]),w(0),C(!1)},[]),A=a.useCallback(async L=>{if(!L.trim()){j([]),p([]),C(!1);return}b.current?.abort();const H=new AbortController;b.current=H;try{C(!0);const[y,F]=await Promise.allSettled([da(wr(20,0,s,L),H.signal),da(Cr(L,r,s),H.signal)]);if(H.signal.aborted)return;const P=y.status==="fulfilled"?y.value.slice(0,Ci).map(S=>({id:S.id,title:S.title??"",column:S.column})):[],Y=F.status==="fulfilled"?F.value.files.slice(0,Si):[];j(P),p(Y),w(0)}catch(y){y.name!=="AbortError"&&(j([]),p([]))}finally{H.signal.aborted||C(!1)}},[r,s]);a.useEffect(()=>{if(l)return I.current&&clearTimeout(I.current),I.current=setTimeout(()=>{A(d)},wi),()=>{I.current&&clearTimeout(I.current)}},[d,l,A]);const q=a.useCallback((L,H)=>!l||i<0?H:ma(H,i,`#${L.id}`),[l,i]),O=a.useCallback((L,H)=>!l||i<0?H:ma(H,i,`#${L.path}`),[l,i]),B=a.useCallback((L,H)=>{if(!l||V.length===0)return!1;switch(L.key){case"ArrowDown":return L.preventDefault(),w(y=>Math.min(y+1,V.length-1)),!0;case"ArrowUp":return L.preventDefault(),w(y=>Math.max(y-1,0)),!0;case"Enter":case"Tab":return V[T]?(L.preventDefault(),!0):!1;case"Escape":return L.preventDefault(),se(),!0;default:return!1}},[l,V,T,se]);return{mentionActive:l,tasks:E,files:R,combinedItems:V,loading:k,mentionQuery:d,selectedIndex:T,setSelectedIndex:w,detectMention:U,selectTask:q,selectFile:O,dismissMention:se,handleKeyDown:B}}const Wn=new Map,hn=new Map;function is(n){return n??"global"}function ns(n){return`${tt.DISCOVERED_SKILLS_PREFIX}${is(n)}`}function pt(n){return Ye(ns(n),{maxAgeMs:Zn})}function Ni(n,s){for(const r of hn.get(n)??[])r(s)}async function Mi(n){const s=is(n),r=Wn.get(s);if(r)return r;const l=Sr(n).finally(()=>{Wn.delete(s)});return Wn.set(s,l),l}function Ri(n){const[s,r]=a.useState(()=>pt(n)??[]),[l,c]=a.useState(()=>pt(n)===null),d=a.useRef(pt(n)!==null),g=is(n);a.useEffect(()=>{const E=pt(n)??[];r(E),c(pt(n)===null),d.current=pt(n)!==null},[n]),a.useEffect(()=>{const E=hn.get(g)??new Set;return E.add(r),hn.set(g,E),()=>{E.delete(r),E.size===0&&hn.delete(g)}},[g]);const i=a.useCallback(async()=>{try{const E=await Mi(n);d.current=!0,ie(ns(n),E,{maxBytes:5e5}),Ni(g,E)}catch{d.current||dn(ns(n))}finally{c(!1)}},[n,g]);a.useEffect(()=>{i()},[i]);const u=a.useCallback(async()=>{c(!0),await i()},[i]);return{skills:s,loading:l,refresh:u}}const os=640,Ai=200,ha="__SKIP__";let Xn=!1;function ji(n,s=os){return n>s?"auto":"hidden"}function Ti(n,s=os){return Math.max(40,Math.min(n,s))}function Ta(n,s){const r=new Date(n),c=new Date().getTime()-r.getTime(),d=Math.floor(c/1e3),g=Math.floor(d/60),i=Math.floor(g/60),u=Math.floor(i/24);return d<60?s("chat.relativeTimeJustNow","just now"):g<60?s("chat.relativeTimeMinutes","{{count}}m ago",{count:g}):i<24?s("chat.relativeTimeHours","{{count}}h ago",{count:i}):u<7?s("chat.relativeTimeDays","{{count}}d ago",{count:u}):r.toLocaleDateString()}function fa(n,s){if(!n||!s)return null;const r=s.toLowerCase();if(r.includes("claude")){let c=s.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return c=c.replace(/\s+/g," "),c.length>30?c.slice(0,30)+"…":c}if(r.includes("gpt")||r.includes("openai")){const c=s.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return c.length>30?c.slice(0,30)+"…":c}if(r.includes("gemini")){const c=s.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return c.length>30?c.slice(0,30)+"…":c}const l=s.replace(/-/g," ").replace(/^\w/,c=>c.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function fn(n,s){return n.length<=s?n:`${n.slice(0,s)}…`}function Ei(n){if(!n)return null;const s=Object.entries(n);return s.length===0?null:s.map(([r,l])=>{const c=typeof l=="string"?l:(()=>{try{return JSON.stringify(l)}catch{return String(l)}})();return`${r}=${fn(c,50)}`}).join(", ")}function _i(n){if(n===void 0)return null;if(typeof n=="string")return fn(n,200);try{return fn(JSON.stringify(n),200)}catch{return fn(String(n),200)}}function $i(n){if(!n)return null;if(n.kind==="mailbox"||n.kind==="mailbox-message"){const s=typeof window>"u"?"/":window.location.pathname||"/",r=new URLSearchParams(typeof window>"u"?"":window.location.search);return r.set("view","mailbox"),r.set("mailbox-message",n.id),`${s}?${r.toString()}#message-${encodeURIComponent(n.id)}`}return null}function Di(n,s){if(!n)return null;const r=n.label??`${n.kind} ${n.id}`,l=$i(n),c=`chat-failure-reference-${n.kind}-${n.id}`.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase();return e.jsxs("div",{className:"chat-message-failure-reference",children:[e.jsx("span",{className:"chat-message-failure-reference-label",children:s("chat.failureReferenceLabel","Reference")}),e.jsx("span",{className:"chat-message-failure-reference-value",children:r}),l?e.jsx("a",{className:"btn btn-sm chat-message-failure-reference-link",href:l,children:s("chat.openMailboxMessage","Open mailbox message")}):e.jsxs("details",{className:"chat-message-failure-reference-details",children:[e.jsx("summary",{className:"btn btn-sm chat-message-failure-reference-link",children:s("chat.viewFailureDetails","View failure details")}),e.jsxs("dl",{className:"chat-message-failure-reference-meta",id:c,children:[e.jsxs("div",{children:[e.jsx("dt",{children:s("chat.failureReferenceKind","Kind")}),e.jsx("dd",{children:n.kind})]}),e.jsxs("div",{children:[e.jsx("dt",{children:s("chat.failureReferenceId","ID")}),e.jsx("dd",{children:n.id})]}),n.label&&e.jsxs("div",{children:[e.jsx("dt",{children:s("chat.failureReferenceMetaLabel","Label")}),e.jsx("dd",{children:n.label})]})]})]})]})}function Ea(n,s,r){if(!n||n.length===0)return null;const l=(k,C)=>{const T=ai(k);if(T){const A=r?.isAwaitingAnswer===!0;return e.jsx(hi,{parsed:T,answered:!A,submittedAnswer:r?.submittedAnswer,disabled:!A,onSubmit:(q,O)=>r?.onQuestionSubmit?.(q,O)},`${k.toolName}-${C}`)}const w=k.status==="running",I=k.status==="completed"&&k.isError,b=Ei(k.args),V=_i(k.result),U=w?b:V?`${s("chat.toolCallResultPrefix","result")}: ${V}`:b?`${s("chat.toolCallArgsPrefix","args")}: ${b}`:null,se=w?s("chat.toolCallStatusRunning","running"):I?s("chat.toolCallStatusError","error"):s("chat.toolCallStatusCompleted","completed");return e.jsxs("details",{className:`chat-tool-call${w?" chat-tool-call--running":""}${I?" chat-tool-call--error":""}`,open:w,children:[e.jsxs("summary",{children:[e.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),e.jsx("span",{className:"chat-tool-call-name",title:k.toolName,children:k.toolName}),U&&e.jsx("span",{className:"chat-tool-call-preview",title:U,children:U}),e.jsx("span",{className:"chat-tool-call-status-text",children:se})]}),e.jsxs("div",{className:"chat-tool-call-content",children:[b&&e.jsxs("div",{className:"chat-tool-call-row",children:[e.jsx("span",{className:"chat-tool-call-label",children:s("chat.toolCallArgsPrefix","args")}),e.jsx("span",{className:"chat-tool-call-value",children:b})]}),V&&e.jsxs("div",{className:`chat-tool-call-row${I?" chat-tool-call-row--error":""}`,children:[e.jsx("span",{className:"chat-tool-call-label",children:s("chat.toolCallResultPrefix","result")}),e.jsx("span",{className:"chat-tool-call-value",children:V})]})]})]},`${k.toolName}-${C}`)},c="chat-tool-calls";if(n.length===1)return e.jsxs("div",{className:c,"data-testid":"chat-tool-calls",children:[e.jsxs("div",{className:"chat-tool-calls-header",children:[e.jsx(Zs,{size:12,"aria-hidden":"true"}),e.jsx("span",{children:s("chat.toolCallsHeader","Tool calls")})]}),l(n[0],0)]});const d=n.filter(k=>k.status==="running").length,g=n.filter(k=>k.status==="completed"&&k.isError).length,i=d>0,u=Array.from(new Set(n.map(k=>k.toolName))),E=u.slice(0,5),j=Math.max(0,u.length-E.length),R=j>0?`${E.join(", ")}, +${j} more`:E.join(", "),p=i?`(${d} ${s("chat.toolCallStatusRunning","running")})`:g>0?`(${g} ${g===1?s("chat.toolCallStatusError","error"):s("chat.toolCallStatusErrors","errors")})`:null;return e.jsx("div",{className:c,"data-testid":"chat-tool-calls",children:e.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:i,children:[e.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[e.jsx(Zs,{size:12,"aria-hidden":"true"}),e.jsx("span",{className:"chat-tool-calls-count",children:s("chat.toolCallsCount","{{count}} tool calls",{count:n.length})}),e.jsx("span",{className:"chat-tool-calls-names",title:R,children:R}),p&&e.jsx("span",{className:"chat-tool-calls-group-status",children:p})]}),n.map((k,C)=>l(k,C))]})})}const _a={p:({children:n,...s})=>e.jsx("p",{...s,children:Xs(n)}),li:({children:n,...s})=>e.jsx("li",{...s,children:Xs(n)}),pre:({children:n,...s})=>e.jsx("pre",{...s,className:"chat-markdown-pre",children:n}),code:({children:n,...s})=>{const r=typeof n=="string"?n:er.Children.toArray(n).join(""),l=bn(r);return l.length===1&&typeof l[0]=="string"?e.jsx("code",{...s,children:n}):e.jsx("code",{...s,children:l})},table:({children:n,...s})=>e.jsx("table",{...s,className:"chat-markdown-table",children:n})},vt="__fn_agent__",Li=280,ln=180,un=500,ga="fusion:chat-sidebar-width",Yn="fusion:chat-scope",Fi="fusion:chat-draft:";function pa(n,s){return s?`${Fi}${n}:${s}`:null}function ba(n){if(!n)return"";try{return localStorage.getItem(n)??""}catch{return""}}const Pi=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function va(n){const s=/(^|[\s])\/([^\s]*)$/.exec(n);if(!s)return null;const r=s[1]??"",l=s[2]??"",c=s.index+r.length;return{filter:l,start:c,end:n.length}}function Ii(n,s){const r=n.slice(0,s),l=/(^|[\s\n])@([\w-]*)$/.exec(r);if(!l)return null;const c=l[2]??"",d=r.length-c.length-1;return{filter:c,start:d,end:s}}function Oi(n){const s=n?.runtimeConfig;if(!s||typeof s!="object")return null;const r=Reflect.get(s,"modelProvider"),l=Reflect.get(s,"modelId");return typeof r!="string"||r.trim().length===0||typeof l!="string"||l.trim().length===0?null:{provider:r,modelId:l}}function ya(n,s,r){if(n?.modelProvider&&n?.modelId)return{provider:n.modelProvider,modelId:n.modelId};const l=Oi(s??void 0);return l||(r.provider&&r.modelId?{provider:r.provider,modelId:r.modelId}:null)}function zi({projectId:n,defaultModel:s,onClose:r,onCreate:l}){const{t:c}=Fe("app"),[d,g]=a.useState("agent"),{agents:i,loading:u}=as(n),[E,j]=a.useState(""),{models:R,favoriteProviders:p,favoriteModels:k,loading:C,refresh:T}=Sa(),w=s.provider&&s.modelId?`${s.provider}/${s.modelId}`:"",[I,b]=a.useState(w),[V,U]=a.useState(p),[se,A]=a.useState(k);a.useEffect(()=>{U(p)},[p]),a.useEffect(()=>{A(k)},[k]),a.useEffect(()=>{w&&b(y=>y||w)},[w]);const q=a.useCallback(async y=>{const F=V,Y=F.includes(y)?F.filter(S=>S!==y):[y,...F];U(Y);try{await Ys({favoriteProviders:Y,favoriteModels:se}),await T()}catch{U(F)}},[V,se,T]),O=a.useCallback(async y=>{const F=se,Y=F.includes(y)?F.filter(S=>S!==y):[y,...F];A(Y);try{await Ys({favoriteProviders:V,favoriteModels:Y}),await T()}catch{A(F)}},[se,V,T]),B=I||w,L=y=>{if(y.preventDefault(),d==="agent"){if(!E)return;l({agentId:E});return}if(!B)return;const F=B.indexOf("/");if(F<=0)return;const P=B.slice(0,F),Y=B.slice(F+1);l({agentId:vt,modelProvider:P,modelId:Y})},H=d==="agent"?!E:!B;return e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:y=>y.stopPropagation(),children:[e.jsx("h3",{children:c("chat.newChatTitle","New Chat")}),e.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{g("agent")},children:c("chat.newChatModeAgent","Agent")}),e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{g("model"),j(""),b(y=>y||w)},children:c("chat.newChatModeModel","Model")})]}),e.jsxs("form",{onSubmit:L,children:[d==="agent"&&e.jsxs("label",{className:"chat-new-dialog-model-label",children:[c("chat.newChatModeAgent","Agent"),u?e.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingAgents","Loading agents...")}):i.length===0?e.jsx("div",{className:"chat-new-dialog-empty",children:c("chat.noAgentsAvailable","No agents available")}):e.jsx("div",{className:"chat-new-dialog-agent-list",children:i.map(y=>e.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${E===y.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>j(y.id),"data-testid":`agent-option-${y.id}`,children:[e.jsx(Pt,{size:16}),e.jsx("span",{className:"chat-new-dialog-agent-name",children:y.name}),e.jsx("span",{className:"chat-new-dialog-agent-role",children:y.role})]},y.id))})]}),d==="model"&&e.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:C?e.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingModels","Loading models...")}):e.jsx(Or,{models:R,value:I,onChange:b,label:c("chat.newChatModeModel","Model"),placeholder:c("chat.selectModel","Select a model"),favoriteProviders:V,onToggleFavorite:q,favoriteModels:se,onToggleModelFavorite:O})}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:c("chat.cancel","Cancel")}),e.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:H,children:c("chat.create","Create")})]})]})]})})}function xa(n,s){return n.slice(s+1).find(r=>r.role==="user")?.content}const Jn=a.memo(function({message:s,forcePlain:r,agentName:l,hideAssistantIdentity:c,showAssistantModelTag:d,activeModelTag:g,activeModelProvider:i,activeSessionId:u,mentionAgentsByName:E,roomContext:j,copyAction:R,onScrollToTop:p,isAwaitingQuestionAnswer:k,submittedQuestionAnswer:C,onQuestionSubmit:T}){const{t:w}=Fe("app"),I=s.role==="assistant",b=I?s.failureInfo:void 0,V=I&&(!c||!!b),U=a.useMemo(()=>{if(I)return null;const q=s.content,O=/@([\w-]+)/g,B=[];let L=0,H=O.exec(q);for(;H;){const[y,F=""]=H,P=H.index;P>L&&B.push(q.slice(L,P));const Y=F.replace(/_/g," ").toLowerCase(),S=E.get(Y);if(S){const $=!!(j&&!j.memberIds.has(S.id)),v=$?w("chat.mentionNonMember","Not a member of {{roomName}}",{roomName:j?.roomName}):void 0;B.push(e.jsxs("span",{className:`chat-mention-chip${$?" chat-mention-chip--non-member":""}`,title:v,"aria-label":v,children:["@",S.name.replace(/\s+/g,"_")]},`${S.id}-${P}`))}else B.push(y);L=P+y.length,H=O.exec(q)}return L<q.length&&B.push(q.slice(L)),B.length===0?q:B},[I,s.content,E,j]),se=a.useMemo(()=>{const q=s.attachments;if(!q||q.length===0)return null;const O=s.roomId?`/api/chat/rooms/${encodeURIComponent(s.roomId)}/attachments/`:u?`/api/chat/sessions/${encodeURIComponent(u)}/attachments/`:null;return O?e.jsx("div",{className:"chat-message-attachments",children:q.map(B=>{const L=B.mimeType.startsWith("image/"),H=B.id||B.filename,y=`${O}${encodeURIComponent(B.filename)}`;return L?e.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:e.jsx("img",{className:"chat-message-attachment",src:y,alt:B.originalName})},H):e.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:[e.jsx(Ca,{size:14}),e.jsx("span",{children:B.originalName})]},H)})}):null},[s.attachments,s.roomId,u]),A=a.useMemo(()=>I?b?e.jsxs("div",{className:"chat-message-content chat-message-content--failure",children:[e.jsxs("div",{className:"chat-message-failure-summary-row",children:[e.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),e.jsx("span",{className:"chat-message-failure-label",children:w("chat.responseFailed","Response failed")})]}),e.jsx("div",{className:"chat-message-failure-summary",children:b.summary}),(b.errorClass||b.code)&&e.jsxs("div",{className:"chat-message-failure-badges",children:[b.errorClass&&e.jsx("span",{className:"chat-message-failure-badge",children:b.errorClass}),b.code&&e.jsx("span",{className:"chat-message-failure-badge",children:b.code})]}),(b.detail||b.reference)&&e.jsxs("details",{className:"chat-message-failure-details",children:[e.jsxs("summary",{children:[e.jsx(Pr,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:w("chat.failureDetails","Failure details")})]}),b.detail&&e.jsx("pre",{className:"chat-message-failure-detail",children:bn(b.detail)}),Di(b.reference,w)]})]}):r?e.jsx("div",{className:"chat-message-content chat-message-content--plain",children:s.content}):e.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:e.jsx(ka,{remarkPlugins:[Na],components:_a,children:s.content})}):null,[b,r,I,s.content]);return e.jsxs("div",{className:`chat-message chat-message--${s.role}${b?" chat-message--failure":""}`,"data-testid":`chat-message-${s.id}`,"data-message-id":s.id,children:[V&&e.jsxs("div",{className:"chat-message-avatar",children:[i?e.jsx(Ft,{provider:i,size:"sm"}):e.jsx(Pt,{size:14}),e.jsx("span",{children:l}),d&&g&&e.jsx("span",{className:"chat-model-tag",children:g})]}),I?A:e.jsx("div",{className:"chat-message-content",children:U}),I&&!b&&(R||p)&&e.jsxs("div",{className:"chat-message-actions",children:[R,p&&e.jsx("button",{type:"button",className:"btn-icon chat-message-scroll-to-top-action","aria-label":w("chat.scrollMessageToTop","Scroll message to top"),"data-testid":`chat-message-scroll-to-top-${s.id}`,onClick:()=>p(s.id),children:e.jsx(Br,{size:14})})]}),Ea(s.toolCalls,w,{isAwaitingAnswer:k,submittedAnswer:C,onQuestionSubmit:T}),s.thinkingOutput&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:w("chat.thinking","Thinking")}),e.jsx("pre",{className:"chat-message-thinking-content",children:bn(s.thinkingOutput)})]}),se,e.jsx("div",{className:"chat-message-time",children:Ta(s.createdAt,w)})]})});function Wi({projectId:n,addToast:s,floating:r=!1,onPopOut:l,onMaximize:c,onMinimize:d,onClose:g}){const{t:i}=Fe("app");a.useEffect(()=>(It({view:"ChatView",trigger:Xn?"route-active":"remount",projectId:n,replayAttempted:!1}),Xn=!1,()=>{Xn=!0,It({view:"ChatView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{activeSession:u,sessionsLoading:E,messages:j,messagesLoading:R,isStreaming:p,streamingText:k,streamingThinking:C,streamingToolCalls:T,selectSession:w,createSession:I,archiveSession:b,renameSession:V,deleteSession:U,sendMessage:se,stopStreaming:A,pendingMessage:q,clearPendingMessage:O,loadMoreMessages:B,hasMoreMessages:L,searchQuery:H,setSearchQuery:y,filteredSessions:F,agentsMap:P}=Xr(n,s),[Y,S]=a.useState(!1),$=!0,[v,x]=a.useState(()=>{try{if(localStorage.getItem(Yn)==="rooms"&&$)return"rooms"}catch{}return"direct"}),m=Zr(n,s),{isUnread:Q,markRead:D}=ei(n),[X,oe]=a.useState(()=>{const t=pa(v,v==="rooms"?m.activeRoom?.id:u?.id);return ba(t)}),[de,me]=a.useState(null),[he,ge]=a.useState(null),[Ce,Ke]=a.useState(""),[ye,$e]=a.useState(null),[Ot,fe]=a.useState(null),[pe,Ae]=a.useState(!0),[Ge,wt]=a.useState(Li),[vn,nt]=a.useState(!1),{agentsMap:zt}=as(n),_e=a.useMemo(()=>P.size>0?P:zt,[zt,P]),{defaultProvider:Ct,defaultModelId:St}=Sa(),st=a.useMemo(()=>({provider:Ct,modelId:St}),[St,Ct]),{skills:at,loading:yn}=Ri(n),[f,M]=a.useState(!1),[_,K]=a.useState(""),[ce,G]=a.useState(0),[ne,W]=a.useState(""),[J,ae]=a.useState(!1),[te,ee]=a.useState(0),[ue,be]=a.useState(-1),[ke,$a]=a.useState(!1),[je,xn]=a.useState([]),[cs,rt]=a.useState(!1),[ls,Bt]=a.useState(!1),[it,us]=a.useState({}),[Ut,Je]=a.useState(!1),[Ht,kt]=a.useState(!1),{pushNav:ds}=kr(),[,qt]=a.useState(!1),[Da,La]=a.useState({top:0,left:0}),le=ki({projectId:n}),wn=a.useCallback(t=>{if(!t||!le.mentionActive)return;const o=t.getBoundingClientRect();La({top:o.top-260,left:o.left+8})},[le.mentionActive]),ms=a.useRef(null),hs=a.useRef(null),fs=a.useRef(null),gs=a.useRef(null),Ne=a.useRef(!1),Kt=a.useRef(null),ps=a.useRef(null),Ve=a.useRef(null),Gt=a.useRef(0),Cn=a.useRef(null),Nt=a.useRef(null),Pe=a.useRef(null),Me=a.useRef(null),Sn=a.useRef(null),Vt=a.useRef(!1),Ie=a.useRef(null),Oe=a.useRef(null),Se=a.useRef(null),Qt=a.useRef(null),bs=a.useRef([]),ot=a.useRef(0),Mt=a.useRef(new Map),kn=a.useRef(!1),Wt=a.useRef(!1),ze=a.useRef(null),Nn=a.useRef(!1),Xt=Nr(),Ze=Xt==="mobile",Mn=Xt==="tablet",vs=a.useRef(null),[Fa,ys]=a.useState(!1);a.useLayoutEffect(()=>{if(!r){ys(!1);return}const t=vs.current;if(!t||typeof ResizeObserver>"u")return;const o=()=>{ys(t.getBoundingClientRect().width<=768)};o();const h=new ResizeObserver(o);return h.observe(t),()=>h.disconnect()},[r]);const re=Ze||Fa;a.useEffect(()=>{u?.id&&D("direct",u.id,u.lastMessageAt??u.updatedAt)},[u?.id,u?.lastMessageAt,u?.updatedAt,D]),a.useEffect(()=>{m.activeRoom?.id&&D("room",m.activeRoom.id,m.activeRoom.updatedAt)},[m.activeRoom?.id,m.activeRoom?.updatedAt,D]),a.useEffect(()=>{if(!u?.id||j.length===0)return;const t=j[j.length-1];D("direct",u.id,t?.createdAt??u.lastMessageAt??u.updatedAt)},[u?.id,u?.lastMessageAt,u?.updatedAt,D,j]),a.useEffect(()=>{if(!m.activeRoom?.id||m.messages.length===0)return;const t=m.messages[m.messages.length-1];D("room",m.activeRoom.id,t?.createdAt??m.activeRoom.updatedAt)},[D,m.activeRoom?.id,m.activeRoom?.updatedAt,m.messages]),a.useEffect(()=>{try{const t=localStorage.getItem(ga);if(!t)return;const o=Number.parseInt(t,10);if(Number.isNaN(o))return;const h=Math.max(ln,Math.min(un,o));wt(h)}catch{}},[]),a.useEffect(()=>{try{const t=localStorage.getItem(Yn);if(t==="direct"){x("direct");return}t==="rooms"&&$&&x("rooms")}catch{}},[$]),a.useEffect(()=>{try{localStorage.setItem(Yn,v)}catch{}},[$,v]);const Re=pa(v,v==="rooms"?m.activeRoom?.id:u?.id),Rn=a.useRef(Re);a.useEffect(()=>{Re!==Rn.current&&(Rn.current=Re,oe(ba(Re)))},[Re]),a.useEffect(()=>{if(!(!Re||Rn.current!==Re))try{if(X){localStorage.setItem(Re,X);return}localStorage.removeItem(Re)}catch{}},[Re,X]);const ve=v==="rooms"&&!!m.activeRoom,{keyboardOverlap:xs,keyboardOpen:Yt}=Mr({enabled:(re||Mn)&&(!!u||ve),allowNonMobileViewport:Mn}),Rt=Mn&&Yt,Te=a.useMemo(()=>{const t=_.trim().toLowerCase();return(t?at.filter(h=>h.name.toLowerCase().includes(t)):at).slice(0,10)},[at,_]),ct=a.useMemo(()=>Array.from(_e.values()),[_e]),Be=a.useMemo(()=>v!=="rooms"||!m.activeRoom?null:{roomId:m.activeRoom.id,roomName:m.activeRoom.name,memberIds:new Set(m.activeRoomMembers.map(t=>t.agentId))},[$,v,m.activeRoom,m.activeRoomMembers]),et=a.useMemo(()=>{const t=ct.filter(N=>ja(N.name,ne));if(!Be)return t;const o=t.filter(N=>Be.memberIds.has(N.id));if(ne.trim().length===0)return o;const h=t.filter(N=>!Be.memberIds.has(N.id));return[...o,...h]},[ct,ne,Be]),An=a.useMemo(()=>{const t=new Map;for(const o of ct)t.set(o.name.toLowerCase(),o);return t},[ct]),Pa=a.useMemo(()=>Te.map(t=>t.id).join("\0"),[Te]);a.useEffect(()=>{G(0)},[Pa]),a.useEffect(()=>{ee(0)},[ne,J]),a.useEffect(()=>()=>{Pe.current!==null&&window.clearTimeout(Pe.current)},[]),a.useEffect(()=>{const t=hs.current;if(!t||!L||R)return;const o=new IntersectionObserver(h=>{h[0].isIntersecting&&B()},{threshold:.1});return o.observe(t),()=>o.disconnect()},[L,R,B]);const lt=a.useCallback(()=>ve?m.activeRoom?.id??null:u?.id??null,[ve,m.activeRoom?.id,u?.id]),ws=a.useCallback((t,o)=>typeof CSS<"u"&&typeof CSS.escape=="function"?t.querySelector(`.chat-message[data-message-id="${CSS.escape(o)}"]`):t.querySelector(`.chat-message[data-message-id="${o.replace(/"/g,'\\"')}"]`),[]),Jt=a.useCallback(()=>{const t=Me.current,o=lt();if(!t||!o)return;const h=t.scrollTop,N=t.querySelectorAll(".chat-message[data-message-id]"),z=Array.from(N).find(xe=>xe.offsetTop+xe.offsetHeight>=h)??N[0]??null,Z=z?.getAttribute("data-message-id")??null,we=z?z.offsetTop-h:0;Nt.current={threadId:o,scrollTop:h,scrollHeight:t.scrollHeight,clientHeight:t.clientHeight,anchorMessageId:Z,anchorOffset:we,wasPinnedBefore:!Ne.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[lt]),Cs=a.useCallback(()=>{const t=Me.current;if(!t)return;const h=t.scrollTop+t.clientHeight>=t.scrollHeight-50;Bt(!h),Ne.current=!h,Jt()},[Jt]),Ue=a.useCallback((t,o)=>{if(!t.isConnected||!o?.force&&Ne.current)return;let h=0,N=0,z=-1;const Z=6,we=()=>{if(t.isConnected&&!(!o?.force&&Ne.current)){if(t.scrollTop=t.scrollHeight,t.scrollHeight===z?N+=1:(N=0,z=t.scrollHeight),h+=1,h>=Z||N>=2){Bt(!1),Ne.current=!1;return}window.requestAnimationFrame(we)}};we()},[]),At=ve?m.messages:j;a.useLayoutEffect(()=>{const t=Me.current,o=lt(),h=Nt.current;if(!t||!o||!h||h.threadId!==o||h.wasPinnedBefore)return;const N=(typeof performance<"u"?performance.now():Date.now())-h.capturedAtMs,z=t.scrollHeight>t.clientHeight,Z=N>3e3,we=h.scrollTop<=0&&h.anchorOffset<=0&&z;if(!Ne.current||Z||we){Nt.current=null;return}let xe=h.scrollTop;if(h.anchorMessageId){const He=ws(t,h.anchorMessageId);He?xe=He.offsetTop-h.anchorOffset:xe=h.scrollTop+(t.scrollHeight-h.scrollHeight)}else xe=h.scrollTop+(t.scrollHeight-h.scrollHeight);t.scrollTop=Math.max(0,xe),Ne.current=!0,Bt(!0),Nt.current=null},[At,lt,ws]);const jn=a.useCallback(t=>{},[At.length,ve]),De=a.useCallback(t=>{jn(t);const o=Me.current;o&&(Nt.current=null,Ne.current=!1,Ue(o))},[Ue,jn]);a.useLayoutEffect(()=>{Ve.current!==null&&(window.clearTimeout(Ve.current),Ve.current=null);const t=ve?m.activeRoom?.id??null:u?.id??null;if(!t){Kt.current=null;return}const o={threadId:t,loaded:ve?!m.messagesLoading:!R,hasMessages:ve?m.messages.length>0:j.length>0},h=Kt.current,N=h?.threadId!==t,z=h?.threadId===t&&!h.loaded&&o.loaded,Z=h?.threadId===t&&!h.hasMessages&&o.hasMessages;if(!(h===null||N||z||Z))return;const xe=Me.current;if(xe)return jn(N?"thread-change":z?"finished-loading":Z?"first-messages":"mount"),Ue(xe,{force:!0}),ve||(Ve.current=window.setTimeout(()=>{if(Ve.current=null,Ne.current)return;const He=Me.current;He&&Ue(He)},250)),Kt.current=o,()=>{Ve.current!==null&&(window.clearTimeout(Ve.current),Ve.current=null)}},[ve,m.activeRoom?.id,m.messages.length,m.messagesLoading,u?.id,j.length,R,Ue]),a.useEffect(()=>{!p||Ne.current||De("streaming")},[p,k,C,De]),a.useEffect(()=>{const t=lt();if(!t){Gt.current=0,Cn.current=null;return}if(Cn.current!==t){Cn.current=t,Gt.current=At.length;return}const o=Gt.current,h=At.length,N=h>o,z=!Ne.current;Gt.current=h,N&&z&&De("new-message")},[At,lt,De]),a.useEffect(()=>{xs<=0||!Me.current||De("keyboard")},[xs,De]),Rr(Ze&&Yt),a.useLayoutEffect(()=>{if(!Ze||!u&&!ve||typeof window>"u")return;const t=Sn.current,o=window.visualViewport;if(!t||!o)return;const h=z=>{if(!(z instanceof HTMLElement))return!1;if(z.tagName==="TEXTAREA")return!0;if(z.tagName!=="INPUT")return!1;const Z=z.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(Z)},N=()=>{if(Vt.current){t.classList.remove("chat-thread--keyboard-active"),t.style.transform="",t.style.willChange="";return}const z=Math.max(0,window.innerHeight-o.offsetTop-o.height),Z=o.offsetTop||0;t.style.setProperty("--vv-height",`${o.height}px`),t.style.setProperty("--vv-offset-top",`${Z}px`),t.style.setProperty("--keyboard-overlap",`${z}px`);const we=(z>0||Z>0)&&h(document.activeElement);t.classList.toggle("chat-thread--keyboard-active",we),we&&Z>0?(t.style.transform=`translateY(${Z}px)`,t.style.willChange="transform"):(t.style.transform="",t.style.willChange="")};return N(),o.addEventListener("resize",N),o.addEventListener("scroll",N),document.addEventListener("focusin",N),document.addEventListener("focusout",N),window.addEventListener("pageshow",N),document.addEventListener("visibilitychange",N),()=>{o.removeEventListener("resize",N),o.removeEventListener("scroll",N),document.removeEventListener("focusin",N),document.removeEventListener("focusout",N),window.removeEventListener("pageshow",N),document.removeEventListener("visibilitychange",N),t.classList.remove("chat-thread--keyboard-active"),t.style.transform="",t.style.willChange=""}},[u,Ze,ve]),a.useEffect(()=>{const t=()=>me(null);if(de)return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[de]),a.useEffect(()=>{if(!Ze||!Yt)return;const t=o=>{o.target?.closest(".chat-messages")||o.preventDefault()};return document.addEventListener("touchmove",t,{passive:!1}),()=>{document.removeEventListener("touchmove",t)}},[Ze,Yt]),a.useEffect(()=>{const t=ps.current;if(ps.current=v,v==="rooms"&&!m.activeRoom){Kt.current=null;return}if(!(v==="direct"&&(t===null||t==="rooms"))&&!(v==="rooms"&&(t===null||t==="direct")))return;const N=Me.current;N&&(Ue(N,{force:!0}),Ne.current=!1,Bt(!1))},[v,m.activeRoom,Ue]),a.useEffect(()=>{if(!u&&!ve||ve&&!re)return;const t=()=>{const h=!Ne.current;Jt(),h&&re&&Me.current&&De("visibility-restore")},o=()=>{document.visibilityState==="visible"&&t()};return document.addEventListener("visibilitychange",o),window.addEventListener("pageshow",t),()=>{document.removeEventListener("visibilitychange",o),window.removeEventListener("pageshow",t)}},[re,Ze,u,ve,Jt,De]),a.useEffect(()=>{if(ve||typeof ResizeObserver>"u")return;const t=Me.current;if(!t)return;const o=new ResizeObserver(()=>{Ne.current||Ue(t)});return o.observe(t),()=>{o.disconnect()}},[ve,Ue,u?.id,v]),a.useEffect(()=>{bs.current=je},[je]),a.useEffect(()=>()=>{for(const t of bs.current)t.previewUrl&&URL.revokeObjectURL(t.previewUrl);for(const t of Mt.current.values())window.clearTimeout(t);Mt.current.clear()},[]);const ut=a.useCallback(t=>{if(!t||t.length===0)return;const o=[];for(const h of Array.from(t)){if(!Pi.includes(h.type))continue;const N=h.type.startsWith("image/");o.push({file:h,previewUrl:N?URL.createObjectURL(h):""})}o.length>0&&xn(h=>[...h,...o])},[]),Ss=a.useCallback(t=>{xn(o=>{const h=o[t];return h?.previewUrl&&URL.revokeObjectURL(h.previewUrl),o.filter((N,z)=>z!==t)})},[]),ks=a.useCallback(t=>{const o=t.clipboardData?.files;if(!o||o.length===0)return;const h=Array.from(o).filter(N=>N.type.startsWith("image/"));h.length!==0&&ut(h)},[ut]),Ia=a.useCallback(async t=>{try{await I(t),S(!1),re&&Ae(!1)}catch{s(i("chat.failedToCreateSession","Failed to create chat session"),"error")}},[I,s,re]),Ee=a.useCallback(t=>{const o=t??Se.current;if(!o)return;const h=Xt==="tablet"?Ai:os;o.style.height="auto",o.style.height=`${Ti(o.scrollHeight,h)}px`,o.style.overflowY=ji(o.scrollHeight,h)},[Xt]),Ns=a.useCallback(t=>{Se.current=t,t&&Ee(t)},[Ee]);a.useLayoutEffect(()=>{Ee()},[v,X,u?.id,m.activeRoom?.id,Ee]);const dt=a.useCallback(()=>{if(oe(""),Re)try{localStorage.removeItem(Re)}catch{}M(!1),K(""),ae(!1),W(""),be(-1),xn(t=>{for(const o of t)o.previewUrl&&URL.revokeObjectURL(o.previewUrl);return[]})},[Re]),mt=a.useCallback(()=>{Wt.current=!0,ze.current!=null&&clearTimeout(ze.current),ze.current=window.setTimeout(()=>{Wt.current=!1,ze.current=null},700)},[]),ht=a.useCallback(()=>Nn.current?!1:(Nn.current=!0,window.setTimeout(()=>{Nn.current=!1},0),!0),[]),Tn=a.useCallback(()=>Wt.current?(Wt.current=!1,ze.current!=null&&(clearTimeout(ze.current),ze.current=null),!0):!1,[]);a.useEffect(()=>()=>{ze.current!=null&&clearTimeout(ze.current)},[]);const jt=a.useCallback(()=>{const t=X.trim(),o=je.map(h=>h.file);if(!(!t&&o.length===0||!u)){if(t==="/clear"||t==="/new"){dt(),O(),A(),I({agentId:u.agentId,modelProvider:u.modelProvider??void 0,modelId:u.modelId??void 0}).catch(()=>{s(i("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}dt(),se(t,o)}},[X,je,u,dt,A,O,I,s,se]),Tt=a.useCallback(async()=>{const t=X.trim(),o=je.map(h=>h.file);if(!(!t&&o.length===0)){if(v==="rooms"){if(!m.activeRoom)return;if(t==="/clear"||t==="/new"){dt();try{await m.clearRoom(m.activeRoom.id)}catch{s(i("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(kn.current)return;kn.current=!0;const h=X;dt();try{await m.sendRoomMessage(t,{files:o})}catch(N){if(N instanceof Ra){const Z=N.message.trim()?N.message:i("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");s(i("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:Z}),"error");return}oe(h);const z=N instanceof Error&&N.message.trim()?N.message:i("chat.failedToSendRoomMessage","Failed to send room message");s(z,"error")}finally{kn.current=!1}return}jt()}},[X,je,$,v,m,m.clearRoom,dt,s,jt]),Zt=a.useCallback(async t=>{if(v==="rooms"){if(!m.activeRoom)return;try{await m.sendRoomMessage(t)}catch(o){const h=o instanceof Error&&o.message.trim()?o.message:i("chat.failedToSendRoomMessage","Failed to send room message");s(h,"error")}return}u&&se(t)},[u,s,$,v,m,se,i]),En=a.useCallback(t=>{oe(o=>{const h=va(o);if(!h)return o;const N=`/skill:${t.name} `,z=o.slice(0,h.start)+N+o.slice(h.end);return window.requestAnimationFrame(()=>{Se.current&&(Ee(Se.current),Se.current.focus())}),z}),M(!1),K(""),G(0)},[Ee]),en=a.useCallback(t=>{const o=Se.current;if(!o||ue<0)return;const h=o.selectionStart??ot.current,N=o.selectionEnd??h,z=Math.max(h,N),Z=Math.min(ue,z),xe=`${`@${t.name.replace(/\s+/g,"_")}`} `,He=X.slice(0,Z)+xe+X.slice(z),ft=Z+xe.length;oe(He),ae(!1),W(""),ee(0),be(-1),window.requestAnimationFrame(()=>{Se.current&&(Ee(Se.current),Se.current.focus(),Se.current.setSelectionRange(ft,ft))})},[ue,X,Ee]),Et=a.useCallback((t,o)=>{const N=Se.current?.selectionStart??ot.current,z=X.lastIndexOf("#",N),Z=z>=0?z+o.length:t.length;oe(t),le.dismissMention(),qt(!1),window.requestAnimationFrame(()=>{Se.current&&(Ee(Se.current),Se.current.focus(),Se.current.setSelectionRange(Z,Z))})},[le,X,Ee]),Ms=a.useCallback(t=>{if(ot.current=t.currentTarget.selectionStart??ot.current,le.mentionActive&&le.combinedItems.length>0){if(le.handleKeyDown(t,X),t.key==="Enter"||t.key==="Tab"){const o=le.combinedItems[le.selectedIndex];o?.kind==="task"?Et(le.selectTask(o.task,X),`#${o.task.id}`):o?.kind==="file"&&Et(le.selectFile(o.file,X),`#${o.file.path}`)}return}if(J&&t.key==="ArrowDown"){t.preventDefault(),et.length>0&&ee(o=>(o+1)%et.length);return}if(J&&t.key==="ArrowUp"){t.preventDefault(),et.length>0&&ee(o=>o===0?et.length-1:o-1);return}if(J&&t.key==="Enter"){t.preventDefault();const o=et[te]??et[0];o&&en(o);return}if(J&&t.key==="Escape"){t.preventDefault(),ae(!1),W(""),be(-1);return}if(f&&t.key==="ArrowDown"){t.preventDefault(),Te.length>0&&G(o=>(o+1)%Te.length);return}if(f&&t.key==="ArrowUp"){t.preventDefault(),Te.length>0&&G(o=>o===0?Te.length-1:o-1);return}if(f&&(t.key==="Enter"||t.key==="Tab")&&Te.length>0){t.preventDefault();const o=Te[ce]??Te[0];o&&En(o);return}if(f&&t.key==="Escape"){t.preventDefault(),M(!1);return}t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),Tt())},[J,et,te,en,f,Te,ce,En,Tt,le,Et,X]),tn=a.useCallback((t,o)=>{const h=Ii(t,o);if(h){ae(!0),W(h.filter),be(h.start);return}ae(!1),W(""),be(-1)},[]),Rs=a.useCallback(t=>{const o=t.target,h=o.value,N=o.selectionStart??h.length;Ee(o),ot.current=N,oe(h);const z=va(h);z?(M(!0),K(z.filter)):(M(!1),K("")),tn(h,N),le.detectMention(h,N),qt(le.mentionActive),le.mentionActive&&wn(o)},[tn,Ee]),nn=a.useCallback(t=>{const o=t.currentTarget,h=o.selectionStart??o.value.length;ot.current=h,tn(o.value,h),le.detectMention(o.value,h),qt(le.mentionActive),le.mentionActive&&wn(o)},[tn,le,wn]),As=a.useCallback(t=>{t.key!=="Escape"&&nn(t)},[nn]),js=a.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(Vt.current=!0,Ie.current!==null&&window.clearTimeout(Ie.current),Ie.current=window.setTimeout(()=>{Vt.current=!1,Ie.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),Oe.current!==null&&window.clearTimeout(Oe.current),Oe.current=window.setTimeout(()=>{Oe.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Pe.current!==null&&window.clearTimeout(Pe.current),Pe.current=window.setTimeout(()=>{M(!1),ae(!1),W(""),be(-1),qt(!1),le.dismissMention(),Pe.current=null},120)},[le]),Ts=a.useCallback(()=>{Vt.current=!1,Ie.current!==null&&(window.clearTimeout(Ie.current),Ie.current=null),Pe.current!==null&&(window.clearTimeout(Pe.current),Pe.current=null),Oe.current!==null&&(window.clearTimeout(Oe.current),Oe.current=null)},[]);a.useEffect(()=>()=>{Ie.current!==null&&window.clearTimeout(Ie.current),Oe.current!==null&&window.clearTimeout(Oe.current)},[]);const Oa=a.useCallback(async t=>{me(null);try{await b(t),s(i("chat.conversationArchived","Conversation archived"),"success")}catch{s(i("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[b,s]),Es=a.useCallback(t=>{const o=F.find(h=>h.id===t)??(u?.id===t?u:null);me(null),Je(!1),Ke(o?.title??""),ge({sessionId:t,title:o?.title??""})},[u,F]),_s=a.useCallback(async()=>{if(he)try{await V(he.sessionId,Ce),ge(null),Ke(""),s(i("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[s,he,V,Ce,i]),za=a.useCallback(async t=>{$e(null),me(null);try{await U(t),s(i("chat.conversationDeleted","Conversation deleted"),"success")}catch{s(i("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[U,s]),_t=a.useCallback(t=>{try{localStorage.setItem(ga,String(t))}catch{}},[]),Ba=a.useCallback(t=>{if(re||Rt)return;t.preventDefault(),t.stopPropagation();const o=t.currentTarget;typeof o.setPointerCapture=="function"&&o.setPointerCapture(t.pointerId);const h=t.clientX,N=Ge;let z=N;document.body.style.userSelect="none";const Z=xe=>{const He=xe.clientX-h,ft=Math.max(ln,Math.min(un,N+He));z=ft,wt(ft),_t(ft)},we=xe=>{typeof o.releasePointerCapture=="function"&&o.releasePointerCapture(xe.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",Z),document.removeEventListener("pointerup",we),_t(z)};document.addEventListener("pointermove",Z),document.addEventListener("pointerup",we)},[re,_t,Ge,Rt]),Ua=a.useCallback(t=>{if(re||Rt||t.key!=="ArrowLeft"&&t.key!=="ArrowRight")return;t.preventDefault();const o=t.shiftKey?50:10,h=t.key==="ArrowLeft"?-o:o,N=Math.max(ln,Math.min(un,Ge+h));wt(N),_t(N)},[re,_t,Ge,Rt]),$s=a.useCallback(t=>{const o=F.find(h=>h.id===t);D("direct",t,o?.lastMessageAt??o?.updatedAt),w(t),Je(!1),re&&Ae(!1)},[F,re,D,w]),_n=a.useCallback(()=>{w(""),Ae(!0),Je(!1)},[w]),$n=a.useCallback(()=>{m.selectRoom(null),Ae(!0),Je(!1)},[m]),Ha=()=>e.jsxs("div",{className:"chat-empty-state",children:[e.jsx(mn,{size:48,strokeWidth:1.5}),e.jsx("h2",{children:i("chat.startNewConversation","Start a new conversation")}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>S(!0),children:[e.jsx($t,{size:16}),i("chat.newChat","New Chat")]})]}),Dn=ya(u,u?.agentId?_e.get(u.agentId)??null:null,st),Qe=fa(Dn?.provider,Dn?.modelId),We=Dn?.provider??null,Ln=!!(u||p||j.length>0),sn=v==="rooms"?ve:!!u,Ds=a.useRef(sn);a.useEffect(()=>{const t=Ds.current;Ds.current=sn,re&&(t||!sn||ds({type:"view",revert:v==="rooms"?$n:_n}))},[v,_n,$n,sn,re,ds]);const Fn=u?.agentId===vt?Qe??"Fusion":u?.title||_e.get(u?.agentId??"")?.name||u?.agentId||"Chat",Ls=!!(Qe&&Qe!==Fn),qa=re&&v==="direct"&&!!u,Pn=_e.get(u?.agentId??"")?.name||(u?.agentId===vt?Qe??"Fusion":u?.agentId?.slice(0,30)??"Fusion"),In=!1,On=u?.agentId===vt,Ka=q.length>50?`${q.slice(0,50)}…`:q,Ga=a.useCallback(()=>{$a(t=>!t)},[]);a.useEffect(()=>{if(!Ut)return;const t=o=>{fs.current?.contains(o.target)||Je(!1)};return document.addEventListener("mousedown",t),()=>{document.removeEventListener("mousedown",t)}},[Ut]),a.useEffect(()=>{if(!Ht)return;const t=h=>{gs.current?.contains(h.target)||kt(!1)},o=h=>{h.key==="Escape"&&kt(!1)};return document.addEventListener("mousedown",t),document.addEventListener("keydown",o),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("keydown",o)}},[Ht]),a.useEffect(()=>{(!re||v!=="direct"||pe)&&Je(!1)},[re,v,pe]),a.useEffect(()=>{kt(!1)},[m.activeRoom?.id]);const zn=a.useCallback((t,o)=>{const h=Mt.current.get(t);h&&window.clearTimeout(h),us(z=>({...z,[t]:o}));const N=window.setTimeout(()=>{us(z=>{const{[t]:Z,...we}=z;return we}),Mt.current.delete(t)},2e3);Mt.current.set(t,N)},[]),Fs=a.useCallback(async(t,o)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(o),zn(t,"success")}catch{zn(t,"error")}},[zn]),Va=a.useCallback((t,o=!1)=>o?e.jsx("div",{className:"chat-message-content chat-message-content--plain",children:t}):e.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:e.jsx(ka,{remarkPlugins:[Na],components:_a,children:t})}),[]),Bn=u?.agentId===vt,Un=a.useCallback((t,o,h)=>e.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${it[t]==="success"?" chat-message-copy-action--success":""}${it[t]==="error"?" chat-message-copy-action--error":""}`,"data-testid":h??`chat-copy-response-${t}`,"aria-label":it[t]==="success"?i("chat.responseCopied","Response copied"):it[t]==="error"?i("chat.copyFailed","Copy failed"):i("chat.copyResponse","Copy response"),onClick:()=>{Fs(t,o)},children:it[t]==="success"?e.jsx(Ar,{size:14}):e.jsx(jr,{size:14})}),[it,Fs]),Hn=a.useCallback(t=>{const o=Me.current;if(!o)return;const h=`[data-testid="chat-message-${t}"]`,N=o.querySelector(h);if(!N)return;const z=N.getBoundingClientRect().top-o.getBoundingClientRect().top+o.scrollTop,Z=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;o.scrollTo({top:z,behavior:Z?"auto":"smooth"})},[]),Ps=u?.cliExecutorAdapterId??null,Qa=!!Ps,Wa=Ps==="generic"?"generic":"hybrid",Xa=u?.cliSessionFile||u?.id||"",Is=()=>e.jsxs("div",{className:"chat-messages",ref:Me,onScroll:Cs,children:[e.jsx("div",{ref:hs,className:"chat-load-more-sentinel",children:L&&R&&e.jsx("div",{className:"chat-loading-older",children:i("chat.loadingOlderMessages","Loading older messages…")})}),p?e.jsxs(e.Fragment,{children:[j.map((t,o)=>e.jsx(Jn,{message:t,forcePlain:ke,agentName:Pn,hideAssistantIdentity:On,showAssistantModelTag:In,activeModelTag:Qe,activeModelProvider:We,activeSessionId:u?.id??null,mentionAgentsByName:An,roomContext:null,copyAction:Bn&&t.role==="assistant"?Un(t.id,t.content):void 0,onScrollToTop:Hn,isAwaitingQuestionAnswer:t.role==="assistant"&&o===j.length-1&&!p,submittedQuestionAnswer:xa(j,o),onQuestionSubmit:Zt},t.id)),e.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!On&&e.jsxs("div",{className:"chat-message-avatar",children:[We?e.jsx(Ft,{provider:We,size:"sm"}):e.jsx(Pt,{size:14}),e.jsx("span",{children:Pn}),In]}),k?Va(k,ke):e.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:C?i("chat.thinkingStatus","Thinking…"):i("chat.workingStatus","Working…")}),Bn&&k&&Un("__streaming__",k,"chat-copy-response-streaming"),Ea(T,i,{isAwaitingAnswer:!0,onQuestionSubmit:Zt}),C&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:i("chat.thinking","Thinking")}),e.jsx("pre",{className:"chat-message-thinking-content",children:bn(C)})]}),e.jsxs("div",{className:"chat-typing-indicator",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})]})]}):R?e.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):j.length===0&&!u?Ha():j.length===0&&u?e.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):e.jsx(e.Fragment,{children:j.map((t,o)=>e.jsx(Jn,{message:t,forcePlain:ke,agentName:Pn,hideAssistantIdentity:On,showAssistantModelTag:In,activeModelTag:Qe,activeModelProvider:We,activeSessionId:u?.id??null,mentionAgentsByName:An,roomContext:null,copyAction:Bn&&t.role==="assistant"?Un(t.id,t.content):void 0,onScrollToTop:Hn,isAwaitingQuestionAnswer:t.role==="assistant"&&o===j.length-1&&!p,submittedQuestionAnswer:xa(j,o),onQuestionSubmit:Zt},t.id))}),e.jsx("div",{ref:ms})]}),Os=()=>e.jsxs("div",{className:"chat-input-area",children:[e.jsx("input",{ref:Qt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:t=>{ut(t.target.files),t.target.value=""}}),f&&e.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":i("chat.skillSuggestions","Skill suggestions"),children:yn?e.jsx("div",{className:"chat-skill-menu-empty",children:i("chat.loadingSkills","Loading skills…")}):Te.length===0?e.jsx("div",{className:"chat-skill-menu-empty",children:_?i("chat.noSkillsFound","No skills found"):i("chat.noSkillsAvailable","No skills available")}):Te.map((t,o)=>e.jsxs("button",{type:"button",role:"option","aria-selected":o===ce,className:`chat-skill-menu-item${o===ce?" chat-skill-menu-item--highlighted":""}`,onMouseDown:h=>h.preventDefault(),onMouseEnter:()=>G(o),onClick:()=>En(t),children:[e.jsx("span",{className:"chat-skill-menu-item-name",children:t.name}),e.jsx("span",{className:"chat-skill-menu-item-description",title:t.relativePath,children:t.relativePath})]},t.id))}),je.length>0&&e.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:je.map((t,o)=>e.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${o}`,children:[t.previewUrl?e.jsx("img",{src:t.previewUrl,alt:t.file.name}):e.jsx("span",{className:"chat-attachment-preview-name",children:t.file.name}),e.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>Ss(o),"data-testid":`chat-attachment-remove-${o}`,"aria-label":`Remove ${t.file.name}`,children:"×"})]},t.previewUrl||`${t.file.name}-${o}`))}),e.jsxs("div",{className:"chat-input-row",children:[e.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>Qt.current?.click(),children:e.jsx(Vs,{size:16})}),e.jsxs("div",{className:`chat-input-wrapper${cs?" chat-input-wrapper--dragover":""}`,onDragOver:t=>{t.preventDefault(),rt(!0)},onDragLeave:()=>rt(!1),onDrop:t=>{t.preventDefault(),rt(!1),ut(t.dataTransfer.files)},children:[e.jsx("textarea",{ref:Ns,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:X,onChange:Rs,onKeyDown:Ms,onKeyUp:As,onClick:nn,onBlur:js,onFocus:Ts,onPaste:ks,onTouchStart:t=>{typeof window>"u"||window.innerWidth>768||Qs()&&(document.activeElement,t.currentTarget)},rows:1,"data-testid":"chat-input"}),e.jsx(la,{agents:ct,filter:ne,highlightedIndex:te,visible:J,onSelect:en,position:"below",roomMemberIds:Be?.memberIds,roomName:Be?.roomName}),e.jsx(bi,{visible:le.mentionActive&&!J,position:Da,tasks:le.tasks,files:le.files,selectedIndex:le.selectedIndex,onSelectTask:t=>{Et(le.selectTask(t,X),`#${t.id}`)},onSelectFile:t=>{Et(le.selectFile(t,X),`#${t.path}`)},loading:le.loading}),q&&e.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[e.jsx("span",{children:i("chat.queuedMessage","Queued: {{preview}}",{preview:Ka})}),e.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":i("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":"chat-pending-dismiss",onClick:O,children:"×"})]})]}),p?e.jsx("button",{className:"chat-input-stop",onPointerDown:t=>{if(t.pointerType&&t.pointerType!=="mouse"){if(t.preventDefault(),!ht())return;mt(),A()}},onTouchStart:t=>{t.preventDefault(),ht()&&(mt(),A())},onMouseDown:t=>{t.preventDefault()},onClick:()=>{Tn()||A()},"aria-label":i("chat.stopGeneration","Stop generation"),"data-testid":"chat-stop-btn",children:e.jsx(Ir,{size:14})}):e.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:t=>{if(t.pointerType&&t.pointerType!=="mouse"){if(t.preventDefault(),!ht())return;mt(),jt()}},onTouchStart:t=>{t.preventDefault(),ht()&&(mt(),jt())},onMouseDown:t=>{t.preventDefault()},onClick:()=>{Tn()||jt()},disabled:!X.trim()&&je.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:e.jsx(Ws,{size:16})})]})]}),Ya=re?void 0:{width:`${Ge}px`},Ja=e.jsxs("div",{className:"chat-sidebar-scope-toggle chat-view-header-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[e.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${v==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":v==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>x("direct"),children:[e.jsx(mn,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:i("chat.scopeDirect","Direct")})]}),e.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${v==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":v==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>x("rooms"),children:[e.jsx(Ma,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:i("chat.scopeRooms","Rooms")})]})]});return e.jsxs("div",{ref:vs,className:`chat-view${r?" chat-view--floating":""}${re?" chat-view--narrow":""}`,children:[e.jsx(Tr,{icon:mn,title:i("chat.title","Chat"),actions:e.jsxs(e.Fragment,{children:[Ja,re?null:e.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:()=>S(!0),"data-testid":"chat-new-btn",children:[e.jsx($t,{size:14}),i("chat.newChat","New Chat")]}),!r&&l?e.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:l,"aria-label":i("chat.popOut","Pop out chat"),title:i("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:e.jsx(qs,{size:16})}):null,r&&c?e.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:c,"aria-label":i("chat.maximizeToChatView","Open in Chat view"),title:i("chat.maximizeToChatView","Open in Chat view"),"data-testid":"chat-modal-maximize",children:e.jsx(qs,{size:16})}):null,r&&d?e.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:d,"aria-label":i("chat.minimizeToQuickChat","Minimize to quick chat"),title:i("chat.minimizeToQuickChat","Minimize to quick chat"),"data-testid":"chat-modal-minimize",children:e.jsx(Er,{size:16})}):null,r&&g?e.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:g,"aria-label":i("chat.closeChat","Close chat"),title:i("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:e.jsx(_r,{size:16})}):null]})}),e.jsxs("div",{className:"chat-view__body",children:[e.jsxs("div",{className:`chat-sidebar${pe?"":" chat-sidebar--hidden"}`,style:Ya,children:[v==="direct"?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"chat-sidebar-search-container",children:e.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[e.jsx($r,{size:14,className:"chat-sidebar-search-icon"}),e.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:i("chat.searchConversations","Search conversations..."),value:H,onChange:t=>y(t.target.value),"data-testid":"chat-search-input"})]})}),e.jsx("div",{className:"chat-session-list chat-sidebar-list",children:E?e.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.loadingConversations","Loading...")}):F.length===0?e.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.noConversationsYet","No conversations yet")}):F.map(t=>{const o=u?.id===t.id,h=!o&&Q("direct",t.id,t.lastMessageAt??t.updatedAt),N=ya(t,_e.get(t.agentId)??null,st),z=fa(N?.provider,N?.modelId)??"Fusion";return e.jsxs("div",{className:`chat-session-item${o?" chat-session-item--active":""}`,onClick:()=>$s(t.id),onContextMenu:Z=>{Z.preventDefault(),me({sessionId:t.id,x:Z.clientX,y:Z.clientY})},"data-testid":`chat-session-${t.id}`,children:[e.jsx("button",{className:"chat-session-delete-btn",onClick:Z=>{Z.stopPropagation(),$e(t.id)},"data-testid":"chat-session-delete-btn","aria-label":i("chat.deleteConversation","Delete conversation"),children:e.jsx(Kn,{size:14})}),e.jsxs("div",{className:"chat-session-title",children:[t.title||i("chat.untitledSession","Untitled"),h?e.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${t.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),e.jsx("div",{className:"chat-session-preview",children:t.lastMessagePreview||i("chat.noMessages","No messages")}),e.jsxs("div",{className:"chat-session-meta",children:[e.jsxs("span",{className:"chat-session-meta-model",children:[N?.provider?e.jsx(Ft,{provider:N.provider,size:"sm"}):null,e.jsx("span",{children:_e.get(t.agentId)?.name||(t.agentId===vt?z:t.agentId.slice(0,30))})]}),e.jsx("span",{children:t.updatedAt?Ta(t.updatedAt,i):""})]})]},t.id)})})]}):e.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!re&&e.jsx("div",{className:"chat-sidebar-rooms-header","data-testid":"chat-sidebar-rooms-header",children:e.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>nt(!0),children:[e.jsx($t,{size:14}),i("chat.createRoom","Create room")]})}),m.rooms.length===0?e.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:i("chat.noRoomsYet","No rooms yet.")}):e.jsx("div",{className:"chat-session-list chat-sidebar-list",children:m.rooms.map(t=>{const o=m.activeRoom?.id===t.id,h=!o&&Q("room",t.id,t.updatedAt);return e.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${o?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${t.slug}`,onClick:()=>{D("room",t.id,t.updatedAt),m.selectRoom(t.id),re&&Ae(!1)},onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),D("room",t.id,t.updatedAt),m.selectRoom(t.id),re&&Ae(!1))},children:[e.jsxs("span",{className:"chat-room-item-details",children:[e.jsxs("span",{className:"chat-room-item-name-row",children:[e.jsxs("span",{className:"chat-room-item-name",children:["#",t.name]}),h?e.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${t.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),o?e.jsx("span",{className:"chat-room-item-meta",children:i("chat.roomMemberCount","{{count}} member",{count:m.activeRoomMembers.length,defaultValue_one:"{{count}} member",defaultValue_other:"{{count}} members"})}):null]}),e.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${t.slug}`,"aria-label":i("chat.deleteRoom","Delete room {{name}}",{name:t.name}),onClick:N=>{N.stopPropagation(),fe(t.id)},children:e.jsx(Kn,{size:14})})]},t.id)})})]}),v==="rooms"?re?e.jsx("div",{className:"chat-sidebar-footer",children:e.jsxs("button",{type:"button",className:"btn btn-sm btn-primary chat-sidebar-footer-btn","data-testid":"chat-create-room-btn",onClick:()=>nt(!0),children:[e.jsx($t,{size:14}),i("chat.createRoom","Create room")]})}):null:re?e.jsx("div",{className:"chat-sidebar-footer",children:e.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>S(!0),"data-testid":"chat-new-btn",children:[e.jsx($t,{size:14}),i("chat.newChat","New Chat")]})}):null]}),!re&&pe&&!Rt&&e.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":ln,"aria-valuemax":un,"aria-valuenow":Ge,"aria-label":i("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:Ba,onKeyDown:Ua}),de&&e.jsxs("div",{className:"chat-session-context-menu",style:{top:de.y,left:de.x},onClick:t=>t.stopPropagation(),children:[e.jsxs("button",{onClick:()=>Es(de.sessionId),"data-testid":"chat-context-rename",children:[e.jsx(Ks,{size:14}),i("chat.rename","Rename")]}),e.jsxs("button",{onClick:()=>Oa(de.sessionId),"data-testid":"chat-context-archive",children:[e.jsx(Dr,{size:14}),i("chat.archive","Archive")]}),e.jsxs("button",{onClick:()=>{me(null),$e(de.sessionId)},"data-testid":"chat-context-delete",children:[e.jsx(Kn,{size:14}),i("chat.delete","Delete")]})]}),he&&e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>ge(null),children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:i("chat.renameConversationTitle","Rename Conversation")}),e.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.renameConversationBody","Choose a new name for this conversation. Leave it blank to show Untitled.")}),e.jsx("label",{className:"chat-rename-label",htmlFor:"chat-rename-input",children:i("chat.conversationName","Conversation name")}),e.jsx("input",{id:"chat-rename-input",className:"input chat-rename-input",type:"text",value:Ce,placeholder:i("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:t=>Ke(t.target.value),onKeyDown:t=>{t.key==="Enter"&&(t.preventDefault(),_s())},autoFocus:!0}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>ge(null),children:i("chat.cancel","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void _s(),"data-testid":"chat-rename-save",children:i("chat.save","Save")})]})]})}),ye&&e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>$e(null),children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:i("chat.deleteConversationTitle","Delete Conversation?")}),e.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.deleteConversationBody","This action cannot be undone. All messages in this conversation will be permanently deleted.")}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>$e(null),children:i("chat.cancel","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void za(ye),children:i("chat.delete","Delete")})]})]})}),Ot&&e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>fe(null),children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:i("chat.deleteRoomTitle","Delete Room?")}),e.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.deleteRoomBody","This action cannot be undone. This room and all its messages will be permanently deleted.")}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>fe(null),children:i("chat.cancel","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await m.deleteRoom(Ot),fe(null)}catch{s(i("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:i("chat.delete","Delete")})]})]})}),v==="rooms"?e.jsxs("div",{ref:Sn,className:"chat-thread",children:[m.activeRoom?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"chat-room-thread-header",children:[re&&e.jsx("button",{className:"btn-icon",onClick:$n,"data-testid":"chat-back-btn",children:e.jsx(Gs,{size:16})}),e.jsxs("div",{className:"chat-room-switcher-menu",ref:gs,children:[e.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":Ht,onClick:()=>kt(t=>!t),children:[e.jsxs("span",{className:"chat-thread-header-title",children:["#",m.activeRoom.name]}),e.jsx(rn,{size:16,"aria-hidden":"true"})]}),Ht&&e.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:m.rooms.map(t=>e.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${t.id===m.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${t.id}`,onClick:()=>{D("room",t.id,t.updatedAt),m.selectRoom(t.id),kt(!1)},children:["#",t.name]},t.id))})]}),e.jsx("div",{className:"chat-room-thread-members",children:m.activeRoomMembers.map(t=>e.jsx(pn,{agent:_e.get(t.agentId)??{id:t.agentId,name:t.agentId.slice(0,30)}},t.agentId))})]}),e.jsxs("div",{className:"chat-messages",ref:Me,onScroll:Cs,children:[m.messagesLoading?e.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):m.messages.filter(t=>t.content.trim()!==ha).length===0?e.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):m.messages.filter(t=>t.content.trim()!==ha).map(t=>{const o=t.senderAgentId?_e.get(t.senderAgentId)?.name??t.senderAgentId.slice(0,30):i("chat.you","You"),h={id:t.id,sessionId:t.roomId,role:t.role,content:t.content,thinkingOutput:t.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:t.attachments,createdAt:t.createdAt};return e.jsx(Jn,{message:h,forcePlain:ke,agentName:o,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:m.activeRoom?.id??null,mentionAgentsByName:An,roomContext:Be,onScrollToTop:Hn,isAwaitingQuestionAnswer:!1,onQuestionSubmit:Zt},t.id)}),e.jsx("div",{ref:ms})]}),m.activeRoom&&ls&&e.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>De("fab-click"),children:[e.jsx(rn,{size:14}),i("chat.latest","Latest")]})]}):e.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:i("chat.selectRoomOrCreate","Select a room or create one")}),m.activeRoom&&e.jsxs("div",{className:"chat-input-area",children:[e.jsx("input",{ref:Qt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:t=>{ut(t.target.files),t.target.value=""}}),je.length>0&&e.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:je.map((t,o)=>e.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${o}`,children:[t.previewUrl?e.jsx("img",{src:t.previewUrl,alt:t.file.name}):e.jsx("span",{className:"chat-attachment-preview-name",children:t.file.name}),e.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>Ss(o),"data-testid":`chat-attachment-remove-${o}`,"aria-label":`Remove ${t.file.name}`,children:"×"})]},t.previewUrl||`${t.file.name}-${o}`))}),e.jsxs("div",{className:"chat-input-row",children:[e.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>Qt.current?.click(),children:e.jsx(Vs,{size:16})}),e.jsxs("div",{className:`chat-input-wrapper${cs?" chat-input-wrapper--dragover":""}`,onDragOver:t=>{t.preventDefault(),rt(!0)},onDragLeave:()=>rt(!1),onDrop:t=>{t.preventDefault(),rt(!1),ut(t.dataTransfer.files)},children:[e.jsx("textarea",{ref:Ns,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:X,onChange:Rs,onKeyDown:Ms,onKeyUp:As,onClick:nn,onBlur:js,onFocus:Ts,onPaste:ks,onTouchStart:t=>{typeof window>"u"||window.innerWidth>768||Qs()&&(document.activeElement,t.currentTarget)},rows:1,"data-testid":"chat-input"}),e.jsx(la,{agents:ct,filter:ne,highlightedIndex:te,visible:J,onSelect:en,position:"below",roomMemberIds:Be?.memberIds,roomName:Be?.roomName})]}),e.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:t=>{if(t.pointerType&&t.pointerType!=="mouse"){if(t.preventDefault(),!ht())return;mt(),Tt()}},onTouchStart:t=>{t.preventDefault(),ht()&&(mt(),Tt())},onMouseDown:t=>{t.preventDefault()},onClick:()=>{Tn()||Tt()},disabled:!X.trim()&&je.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:e.jsx(Ws,{size:16})})]})]})]}):e.jsxs("div",{ref:Sn,className:"chat-thread",children:[(Ln||!re)&&e.jsxs("div",{className:"chat-thread-header",children:[re&&Ln&&e.jsx("button",{className:"btn-icon",onClick:_n,"data-testid":"chat-back-btn",children:e.jsx(Gs,{size:16})}),e.jsx("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:qa?e.jsxs("div",{className:"chat-mobile-session-menu",ref:fs,children:[e.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":Ut,onClick:()=>Je(t=>!t),children:[We?e.jsx(Ft,{provider:We,size:"md"}):e.jsx(Pt,{size:16}),e.jsx("span",{className:"chat-thread-header-title",children:Fn}),Ls&&e.jsx("span",{className:"chat-model-tag",children:Qe}),e.jsx(rn,{size:16,"aria-hidden":"true"})]}),Ut&&e.jsx("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:F.map(t=>e.jsxs("div",{className:`chat-mobile-session-option-row${u?.id===t.id?" chat-mobile-session-option-row--active":""}`,role:"none",children:[e.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${u?.id===t.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${t.id}`,onClick:()=>$s(t.id),children:e.jsx("span",{className:"chat-mobile-session-option-title",children:t.title||i("chat.untitledSession","Untitled")})}),e.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-rename","data-testid":`chat-mobile-session-rename-${t.id}`,"aria-label":i("chat.renameConversationAria","Rename conversation {{title}}",{title:t.title||i("chat.untitledSession","Untitled")}),onClick:()=>Es(t.id),children:e.jsx(Ks,{size:14})})]},t.id))})]}):e.jsxs(e.Fragment,{children:[We?e.jsx(Ft,{provider:We,size:"md"}):e.jsx(Pt,{size:16}),e.jsx("span",{className:"chat-thread-header-title",children:Fn}),Ls&&e.jsx("span",{className:"chat-model-tag",children:Qe})]})}),Ln&&e.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${ke?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":ke?i("chat.showRenderedMarkdown","Show all messages as rendered Markdown"):i("chat.showPlainText","Show all messages as plain text"),onClick:Ga,children:ke?e.jsx(Lr,{size:14}):e.jsx(Fr,{size:14})})]}),Qa?e.jsx(xi,{cliSessionId:Xa,tier:Wa,projectId:n,renderTranscript:Is,renderComposer:()=>u?Os():null}):e.jsxs(e.Fragment,{children:[Is(),ls&&e.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>De("fab-click"),children:[e.jsx(rn,{size:14}),i("chat.latest","Latest")]}),u&&Os()]})]}),e.jsx(yi,{isOpen:vn,onClose:()=>nt(!1),projectId:n,existingRoomNames:m.rooms.map(t=>t.name),onCreate:async t=>{await m.createRoom({name:t.name,memberAgentIds:t.memberAgentIds}),v!=="rooms"&&x("rooms"),nt(!1),re&&Ae(!1)}})]}),Y&&e.jsx(zi,{projectId:n,defaultModel:st,onClose:()=>S(!1),onCreate:Ia})]})}export{Wi as ChatView,Ti as clampChatInputHeight,ji as resolveChatInputOverflowY,ya as resolveSessionProvider};
@@ -0,0 +1 @@
1
+ .chat-question-response{display:flex;flex-direction:column;gap:var(--space-md);margin-block:var(--space-sm);padding:var(--space-md);border:thin solid color-mix(in srgb,var(--accent) 28%,var(--border));border-radius:var(--radius-lg);background:color-mix(in srgb,var(--accent) 6%,var(--bg-secondary));color:var(--text)}.chat-question-response--compact{gap:var(--space-sm);padding:var(--space-sm);border-radius:var(--radius-md)}.chat-question-response__header,.chat-question-response__actions{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.chat-question-response__eyebrow,.chat-question-response__answered-label,.chat-question-response__submitted-label{font-size:.75rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted)}.chat-question-response__answered-label{color:var(--color-success)}.chat-question-response__questions{display:flex;flex-direction:column;gap:var(--space-md)}.chat-question-response__question{display:flex;flex-direction:column;gap:var(--space-xs)}.chat-question-response__question-header{margin:0;font-size:.875rem;font-weight:600;color:var(--text-muted)}.chat-question-response__question-text{margin:0;font-size:1rem;line-height:1.3;color:var(--text)}.chat-question-response--compact .chat-question-response__question-text{font-size:.875rem}.chat-question-response__description,.chat-question-response__hint{margin:0;font-size:.875rem;line-height:1.45;color:var(--text-muted)}.chat-question-response__options,.chat-question-response__confirm-group{display:flex;flex-direction:column;gap:var(--space-xs);margin-block-start:var(--space-xs)}.chat-question-response__confirm-group{flex-direction:row;flex-wrap:wrap}.chat-question-response__option{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-sm);border:thin solid var(--border);border-radius:var(--radius-md);background:var(--card);cursor:pointer;transition:border-color var(--transition-fast),background-color var(--transition-fast),color var(--transition-fast)}.chat-question-response__option:hover,.chat-question-response__option--selected,.chat-question-response__confirm--selected{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,var(--card))}.chat-question-response__option input{margin:calc(var(--space-xs) / 2) 0 0;accent-color:var(--accent)}.chat-question-response__option-content{display:flex;flex-direction:column;gap:calc(var(--space-xs) / 2);min-width:0}.chat-question-response__option-label{font-size:.875rem;font-weight:600;color:var(--text)}.chat-question-response__option-description{font-size:.875rem;line-height:1.45;color:var(--text-muted)}.chat-question-response__textarea{width:100%;min-height:calc(var(--space-xl) * 3);margin-block-start:var(--space-xs);resize:vertical;line-height:1.45}.chat-question-response__submit{flex:0 0 auto}.chat-question-response__submitted{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border:thin solid var(--border);border-radius:var(--radius-md);background:var(--card)}.chat-question-response__submitted pre{margin:0;white-space:pre-wrap;font-family:var(--font-mono);font-size:.875rem;line-height:1.45;color:var(--text)}.chat-question-response--compact .chat-question-response__actions{align-items:stretch;flex-direction:column}.chat-question-response--compact .chat-question-response__submit{width:100%}@media(max-width:768px){.chat-question-response{padding:var(--space-sm);border-radius:var(--radius-md)}.chat-question-response__header,.chat-question-response__actions{align-items:stretch;flex-direction:column}.chat-question-response__confirm-group{flex-direction:column}.chat-question-response__submit{width:100%}}.chat-input-wrapper{position:relative;display:flex;flex:1;flex-direction:column;align-items:stretch;gap:var(--space-xs);min-width:0}.agent-mention-popup{position:absolute;z-index:250;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);min-width:220px;max-width:320px;max-height:240px;overflow-y:auto;box-shadow:var(--shadow-lg);padding:var(--space-xs) 0}.agent-mention-popup--below{top:calc(100% + var(--space-xs));left:0}.agent-mention-popup--above{bottom:calc(100% + var(--space-xs));left:0}.agent-mention-item{display:flex;align-items:center;gap:var(--space-sm);padding:calc(var(--space-sm) - (var(--space-xs) / 2)) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);color:var(--text);cursor:pointer;border:none;background:transparent;width:100%;text-align:left}.agent-mention-item:hover,.agent-mention-item--highlighted{background:var(--card-hover)}.agent-mention-item:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);background:var(--card-hover)}.agent-mention-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-mention-role{font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.agent-mention-empty{padding:calc(var(--space-sm) + (var(--space-xs) / 2)) var(--space-md);font-size:var(--space-md);color:var(--text-dim)}.agent-mention-section-header{padding:var(--space-xs) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs) * .5);text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted)}.agent-mention-hint{padding:var(--space-xs) var(--space-md);font-size:var(--space-md);color:var(--text-muted)}.agent-mention-member-dot{background:var(--color-success)}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:1024px){.agent-mention-popup{min-width:200px;max-width:min(280px,100%)}.agent-mention-popup--below,.agent-mention-popup--above{bottom:calc(100% + var(--space-xs));top:auto;left:0}}.file-mention-popup{position:absolute;z-index:250;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);min-width:calc(var(--space-xl) * 7 + var(--space-md));max-width:calc(var(--space-xl) * 10);max-height:calc(var(--space-xl) * 7 + var(--space-sm));overflow-y:auto;padding:var(--space-xs) 0}.file-mention-popup-groups,.file-mention-popup-group{display:flex;flex-direction:column}.file-mention-popup-group-header{padding:var(--space-xs) var(--space-md);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;letter-spacing:calc(var(--space-xs) / 2);text-transform:uppercase}.file-mention-popup-list{list-style:none;margin:0;padding:0}.file-mention-popup-item{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);cursor:pointer;color:var(--text);font-size:calc(var(--space-sm) + var(--space-xs) * 1.5)}.file-mention-popup-item:hover{background:var(--card-hover)}.file-mention-popup-item--selected{background:color-mix(in srgb,var(--todo) 15%,transparent)}.file-mention-popup-item:focus-visible{outline:none;box-shadow:var(--focus-ring);background:var(--card-hover)}.file-mention-popup-icon{flex-shrink:0;display:inline-flex;align-items:center;color:var(--text-muted);margin-top:1px}.file-mention-popup-info{display:flex;flex-direction:column;min-width:0;gap:calc(var(--space-xs) / 2)}.file-mention-popup-item-name{font-weight:500;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-mention-popup-item-path{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-mention-popup-task-row{display:flex;align-items:center;gap:var(--space-sm);min-width:0}.file-mention-popup-task-id{font-family:var(--font-mono);font-weight:600;color:var(--text);white-space:nowrap}.file-mention-popup-column-badge{display:inline-flex;align-items:center;justify-content:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;line-height:1;text-transform:capitalize}.file-mention-popup-column-badge--triage{background:var(--status-triage-bg);color:var(--triage)}.file-mention-popup-column-badge--todo{background:var(--status-todo-bg);color:var(--todo)}.file-mention-popup-column-badge--in-progress{background:var(--status-in-progress-bg);color:var(--in-progress)}.file-mention-popup-column-badge--in-review{background:var(--status-in-review-bg);color:var(--in-review)}.file-mention-popup-column-badge--done{background:var(--status-done-bg);color:var(--done)}.file-mention-popup-column-badge--archived{background:var(--status-archived-bg);color:var(--text-muted)}.file-mention-popup-empty{padding:var(--space-lg) var(--space-md);text-align:center;color:var(--text-muted);font-size:var(--space-md)}.file-mention-popup-loading{display:flex;align-items:center;justify-content:center;padding:var(--space-lg) var(--space-md)}.file-mention-popup-loading .spinner{display:inline-block;width:var(--space-lg);height:var(--space-lg);border:calc(var(--space-xs) / 2) solid var(--border);border-top-color:var(--text-muted);border-radius:50%;animation:spin var(--duration-slow) linear infinite}@media(max-width:768px){.file-mention-popup{top:auto!important;bottom:calc(100% + var(--space-xs));left:max(var(--space-md),env(safe-area-inset-left,0px))!important;right:max(var(--space-md),env(safe-area-inset-right,0px));max-width:none;width:auto;max-height:calc(var(--space-xl) * 8 + var(--space-sm))}.file-mention-popup-item{min-height:calc(var(--space-lg) + var(--space-xl) - var(--space-sm));padding:calc(var(--space-sm) + (var(--space-xs) / 2)) var(--space-md)}}.chat-empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-lg);color:var(--text-muted);padding:var(--space-xl);text-align:center}.chat-empty-state h2{font-size:calc(var(--space-xl) - var(--space-xs));color:var(--text);margin:0}.chat-empty-state-agent-select select{padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);color:var(--text);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5));min-width:calc(var(--space-xl) * 8 + var(--space-sm))}.chat-new-dialog-backdrop{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:100}.chat-new-dialog{background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-xl);width:calc(var(--space-xl) * 16 + var(--space-md));max-width:calc(100vw - (var(--space-md) * 2));display:flex;flex-direction:column;gap:var(--space-lg)}.chat-new-dialog h3{margin:0;font-size:calc(var(--space-lg) + (var(--space-xs) / 2))}.chat-new-dialog label{display:flex;flex-direction:column;gap:var(--space-xs);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.25));color:var(--text-muted)}.chat-new-dialog input,.chat-new-dialog select{padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg);color:var(--text);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5))}.chat-new-dialog-mode-toggle{display:flex;gap:var(--space-xs)}.chat-new-dialog-mode-btn{flex:1;padding:var(--space-xs) var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.25));cursor:pointer;transition:var(--transition-fast)}.chat-new-dialog-mode-btn:hover{background:color-mix(in srgb,var(--todo) 10%,transparent);color:var(--text);border-color:color-mix(in srgb,var(--todo) 40%,var(--border))}.chat-new-dialog-mode-btn--active{background:color-mix(in srgb,var(--todo) 18%,transparent);color:var(--text);border-color:color-mix(in srgb,var(--todo) 50%,var(--border));font-weight:500}.chat-new-dialog-mode-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.chat-new-dialog-actions{display:flex;justify-content:flex-end;gap:var(--space-sm)}.chat-view-delete-dialog-copy{margin:0 0 var(--space-lg);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.5)}.chat-new-dialog-model-label{display:flex;flex-direction:column;gap:var(--space-sm)}.chat-new-dialog-loading,.chat-new-dialog-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5))}.chat-new-dialog-agent-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-xl) * 12 + var(--space-md));overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-xs)}.chat-new-dialog-agent-item{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text);font-size:calc(var(--space-sm) + (var(--space-xs) * 1.5));text-align:left;cursor:pointer;transition:background var(--transition-fast)}.chat-new-dialog-agent-item:hover{background:var(--surface-hover)}.chat-new-dialog-agent-item--selected{background:color-mix(in srgb,var(--todo) 10%,transparent);border:1px solid color-mix(in srgb,var(--todo) 30%,transparent)}.chat-new-dialog-agent-name{flex:1;font-weight:500}.chat-new-dialog-agent-role{font-size:var(--space-md);color:var(--text-muted);text-transform:capitalize}.chat-new-dialog{overflow:visible}@media(max-width:768px){.quick-chat-fab{right:var(--space-xs);bottom:calc(var(--space-xs) + var(--executor-footer-height-mobile, var(--executor-footer-height, 0px)) + var(--mobile-nav-height, 44px) + env(safe-area-inset-bottom,0px))}.chat-view-dialog-backdrop{align-items:center;justify-content:center;overflow-y:auto;padding:var(--space-md);padding-top:max(var(--space-md),env(safe-area-inset-top,0px));padding-bottom:max(var(--space-md),env(safe-area-inset-bottom,0px))}.chat-view-dialog{width:100%;max-width:min(100%,calc(var(--space-xl) * 16));max-height:calc(100dvh - (var(--space-md) * 2) - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px));display:flex;flex-direction:column;overflow-y:auto}}.create-room-modal{display:flex;flex-direction:column;gap:var(--space-md)}.create-room-modal-name-group{margin-bottom:0}.create-room-modal-name-field{display:flex;align-items:center;gap:var(--space-sm)}.create-room-modal-name-hash{color:var(--text-muted);font-family:var(--font-mono)}.create-room-modal-name-field .input{flex:1}.create-room-modal-selected{display:flex;flex-wrap:wrap;gap:var(--space-sm);padding:0 var(--space-xl)}.create-room-modal-chip{border-color:var(--border)}.create-room-modal-member-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-2xl) * 8);overflow-y:auto;padding:0 var(--space-xl)}.create-room-modal-member-row{display:flex;width:100%;align-items:center;gap:var(--space-sm);text-align:left;border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-sm);background:var(--surface);color:var(--text);transition:background var(--transition-fast),border-color var(--transition-fast)}.create-room-modal-member-row:hover{background:var(--card-hover)}.create-room-modal-member-row:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.create-room-modal-member-row--selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.create-room-modal-member-role{margin-left:auto;color:var(--text-muted);font-size:var(--space-md)}.create-room-modal-empty{color:var(--text-muted);padding:var(--space-md);text-align:center}@media(max-width:768px){.create-room-modal{width:100%}.create-room-modal-selected,.create-room-modal-member-list{padding:0 var(--space-md)}.create-room-modal .modal-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.create-room-modal .modal-actions .btn{width:100%}}