@runfusion/fusion 0.23.0 → 0.24.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 (204) hide show
  1. package/dist/bin.js +26610 -20597
  2. package/dist/client/assets/AgentDetailView-BwJaLqZh.css +1 -0
  3. package/dist/client/assets/AgentDetailView-gy_5SUj2.js +18 -0
  4. package/dist/client/assets/AgentsView-BkB9FiMT.js +29 -0
  5. package/dist/client/assets/{AgentsView-DSGQWObq.css → AgentsView-CV3vm7Qk.css} +1 -1
  6. package/dist/client/assets/ChatView-B_-B8fqu.js +1 -0
  7. package/dist/client/assets/ChatView-DwJAd5G1.css +1 -0
  8. package/dist/client/assets/{DevServerView-C9lzHrcT.js → DevServerView-BkvtjZBa.js} +1 -1
  9. package/dist/client/assets/{DirectoryPicker-aVdFaV37.js → DirectoryPicker-BK-KbnhP.js} +1 -1
  10. package/dist/client/assets/{DocumentsView-DIpg3NSP.js → DocumentsView-BEg1CQAk.js} +1 -1
  11. package/dist/client/assets/{DocumentsView-BrhyOdeE.css → DocumentsView-gv4zG3aT.css} +1 -1
  12. package/dist/client/assets/EvalsView-Berf9bQm.js +1 -0
  13. package/dist/client/assets/EvalsView-CUNJ1TLc.css +1 -0
  14. package/dist/client/assets/{agentSkills-DDHJnrkn.css → ExperimentalAgentOnboardingModal-B-APN_lM.css} +1 -1
  15. package/dist/client/assets/ExperimentalAgentOnboardingModal-jcInE50G.js +499 -0
  16. package/dist/client/assets/InsightsView-B0J4mhzV.css +1 -0
  17. package/dist/client/assets/InsightsView-BX5bSF1J.js +11 -0
  18. package/dist/client/assets/{MemoryView-nXlTqebk.js → MemoryView-CKElJY_3.js} +2 -2
  19. package/dist/client/assets/NodesView-DLUOBLf6.js +14 -0
  20. package/dist/client/assets/NodesView-DT4pXowv.css +1 -0
  21. package/dist/client/assets/{PiExtensionsManager-Buopv-jb.js → PiExtensionsManager-COlJf0Kx.js} +2 -2
  22. package/dist/client/assets/PluginManager-CfW55BF4.js +1 -0
  23. package/dist/client/assets/PluginManager-DtRQXia5.css +1 -0
  24. package/dist/client/assets/{ResearchView-_BHXUv2j.js → ResearchView-B256Lr8I.js} +1 -1
  25. package/dist/client/assets/SettingsModal-BeA_nQtW.js +31 -0
  26. package/dist/client/assets/SettingsModal-DzsLquBu.css +1 -0
  27. package/dist/client/assets/{SettingsModal-C89Ikhfm.js → SettingsModal-yRqM4DV8.js} +1 -1
  28. package/dist/client/assets/SetupWizardModal-uUZk3TKT.js +1 -0
  29. package/dist/client/assets/{SkillsView-hDpTBdFT.js → SkillsView-CP8JX0P_.js} +1 -1
  30. package/dist/client/assets/TodoView-Cx9cVhq7.css +1 -0
  31. package/dist/client/assets/TodoView-DCRIkDZ-.js +6 -0
  32. package/dist/client/assets/createLucideIcon-BazL2hk5.js +21 -0
  33. package/dist/client/assets/dashboard-view-BkTMSZYn.css +1 -0
  34. package/dist/client/assets/dashboard-view-CyWN-d02.js +63 -0
  35. package/dist/client/assets/dashboard-view-lR7YYmSC.js +21 -0
  36. package/dist/client/assets/{folder-open-usZkXdq2.js → folder-open-DHjELt8-.js} +1 -1
  37. package/dist/client/assets/index-CQyVRLOb.js +692 -0
  38. package/dist/client/assets/index-CxA2Nn0_.css +1 -0
  39. package/dist/client/assets/projectDetection-G3XuxD2X.js +1 -0
  40. package/dist/client/assets/{star-BAT_ObKE.js → star-DYesq1AV.js} +1 -1
  41. package/dist/client/assets/{upload-BC2YKNEV.js → upload-DTWF3Db5.js} +1 -1
  42. package/dist/client/assets/{users-Dkd4rtrN.js → users--syrel4l.js} +1 -1
  43. package/dist/client/index.html +12 -20
  44. package/dist/client/theme-data.css +106 -0
  45. package/dist/client/version.json +1 -1
  46. package/dist/droid-cli/package.json +1 -1
  47. package/dist/extension.js +14287 -9568
  48. package/dist/pi-claude-cli/package.json +1 -1
  49. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +218 -0
  50. package/dist/plugins/fusion-plugin-cursor-runtime/manifest.json +6 -0
  51. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +11 -0
  52. package/dist/plugins/fusion-plugin-dependency-graph/manifest.json +1 -1
  53. package/dist/plugins/fusion-plugin-dependency-graph/package.json +6 -4
  54. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.css +58 -0
  55. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.tsx +301 -0
  56. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphHighlight.css +27 -0
  57. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.css +157 -0
  58. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.tsx +126 -0
  59. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.css +35 -0
  60. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.tsx +36 -0
  61. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.highlighting.test.tsx +112 -0
  62. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.persistence.test.tsx +115 -0
  63. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.test.tsx +128 -0
  64. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.drag.test.tsx +82 -0
  65. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.test.tsx +307 -0
  66. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphToolbar.test.tsx +60 -0
  67. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/edges.test.tsx +75 -0
  68. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filtering.test.tsx +62 -0
  69. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filters.test.ts +78 -0
  70. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/graphPositionStorage.test.ts +95 -0
  71. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/host-integration.test.ts +74 -0
  72. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/index.test.ts +58 -0
  73. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/interactions.test.tsx +121 -0
  74. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/layout.test.ts +70 -0
  75. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/persistence.test.tsx +89 -0
  76. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphData.test.ts +86 -0
  77. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphInteraction.test.ts +167 -0
  78. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphPositions.test.ts +66 -0
  79. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useNodeDrag.test.ts +81 -0
  80. package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-interop.d.ts +35 -0
  81. package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-view.tsx +19 -0
  82. package/dist/plugins/fusion-plugin-dependency-graph/src/edges.tsx +70 -0
  83. package/dist/plugins/fusion-plugin-dependency-graph/src/filters.ts +8 -0
  84. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/__tests__/useDependencyChain.test.ts +53 -0
  85. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useDependencyChain.ts +60 -0
  86. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useGraphPositions.ts +45 -0
  87. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useNodeDrag.ts +114 -0
  88. package/dist/plugins/fusion-plugin-dependency-graph/src/index.ts +1 -2
  89. package/dist/plugins/fusion-plugin-dependency-graph/src/layout.ts +91 -0
  90. package/dist/plugins/fusion-plugin-dependency-graph/src/styles/drag.css +15 -0
  91. package/dist/plugins/fusion-plugin-dependency-graph/src/types.ts +21 -0
  92. package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphData.ts +17 -0
  93. package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphInteraction.ts +292 -0
  94. package/dist/plugins/fusion-plugin-dependency-graph/src/utils/graphPositionStorage.ts +65 -0
  95. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +136680 -0
  96. package/dist/plugins/fusion-plugin-droid-runtime/manifest.json +13 -0
  97. package/dist/plugins/fusion-plugin-droid-runtime/mcp-schema-server.cjs +49 -0
  98. package/dist/plugins/fusion-plugin-droid-runtime/package.json +11 -0
  99. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  100. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +93 -6
  101. package/dist/plugins/fusion-plugin-openclaw-runtime/mcp-schema-server.cjs +59 -0
  102. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  103. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  104. package/dist/plugins/fusion-plugin-reports/manifest.json +33 -0
  105. package/dist/plugins/fusion-plugin-reports/package.json +26 -0
  106. package/dist/plugins/fusion-plugin-reports/src/__tests__/manifest.test.ts +51 -0
  107. package/dist/plugins/fusion-plugin-reports/src/__tests__/review-panel.test.ts +166 -0
  108. package/dist/plugins/fusion-plugin-reports/src/__tests__/settings.test.ts +157 -0
  109. package/dist/plugins/fusion-plugin-reports/src/index.ts +41 -0
  110. package/dist/plugins/fusion-plugin-reports/src/review-panel.ts +294 -0
  111. package/dist/plugins/fusion-plugin-reports/src/review-types.ts +75 -0
  112. package/dist/plugins/fusion-plugin-reports/src/settings.ts +105 -0
  113. package/dist/plugins/fusion-plugin-roadmap/manifest.json +16 -0
  114. package/dist/plugins/fusion-plugin-roadmap/package.json +48 -0
  115. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/api-client.test.ts +101 -0
  116. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/index.test.ts +92 -0
  117. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/roadmap-routes.test.ts +48 -0
  118. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/roadmap-suggestions.test.ts +31 -0
  119. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/RoadmapsView.css +1299 -0
  120. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/RoadmapsView.tsx +2559 -0
  121. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/__tests__/RoadmapsView.test.tsx +1144 -0
  122. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/__tests__/useRoadmaps.test.ts +1756 -0
  123. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/api.ts +70 -0
  124. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/test-setup.ts +7 -0
  125. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/types.ts +1 -0
  126. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useConfirm.ts +8 -0
  127. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useRoadmaps.ts +1188 -0
  128. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useViewportMode.ts +20 -0
  129. package/dist/plugins/fusion-plugin-roadmap/src/dashboard-view.tsx +6 -0
  130. package/dist/plugins/fusion-plugin-roadmap/src/index.ts +74 -0
  131. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-routes.ts +1 -0
  132. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-schema.ts +41 -0
  133. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-suggestions.d.ts +15 -0
  134. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-suggestions.ts +15 -0
  135. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.d.ts +283 -0
  136. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.d.ts.map +1 -0
  137. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.js +21 -0
  138. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.js.map +1 -0
  139. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.ts +310 -0
  140. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.d.ts +5 -0
  141. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.d.ts.map +1 -0
  142. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.js +361 -0
  143. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.js.map +1 -0
  144. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.ts +408 -0
  145. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.d.ts +68 -0
  146. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.d.ts.map +1 -0
  147. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.js +300 -0
  148. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.js.map +1 -0
  149. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.ts +381 -0
  150. package/dist/plugins/fusion-plugin-roadmap/src/server/index.d.ts +3 -0
  151. package/dist/plugins/fusion-plugin-roadmap/src/server/index.ts +1 -0
  152. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-handoff.test.ts +445 -0
  153. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-ordering.test.ts +334 -0
  154. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-store.test.ts +1318 -0
  155. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-handoff.ts +163 -0
  156. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.d.ts +37 -0
  157. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.d.ts.map +1 -0
  158. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.js +188 -0
  159. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.js.map +1 -0
  160. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.ts +311 -0
  161. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.d.ts +299 -0
  162. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.d.ts.map +1 -0
  163. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.js +765 -0
  164. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.js.map +1 -0
  165. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.ts +1001 -0
  166. package/dist/plugins/fusion-plugin-whatsapp-chat/manifest.json +8 -0
  167. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +34 -0
  168. package/dist/plugins/fusion-plugin-whatsapp-chat/src/__tests__/auth-state.test.ts +99 -0
  169. package/dist/plugins/fusion-plugin-whatsapp-chat/src/__tests__/connection.test.ts +145 -0
  170. package/dist/plugins/fusion-plugin-whatsapp-chat/src/__tests__/index.test.ts +216 -0
  171. package/dist/plugins/fusion-plugin-whatsapp-chat/src/__tests__/reply.test.ts +52 -0
  172. package/dist/plugins/fusion-plugin-whatsapp-chat/src/auth-state.ts +89 -0
  173. package/dist/plugins/fusion-plugin-whatsapp-chat/src/connection.ts +253 -0
  174. package/dist/plugins/fusion-plugin-whatsapp-chat/src/index.ts +262 -0
  175. package/dist/plugins/fusion-plugin-whatsapp-chat/src/qrcode.d.ts +1 -0
  176. package/dist/plugins/fusion-plugin-whatsapp-chat/src/reply.ts +37 -0
  177. package/package.json +2 -2
  178. package/skill/fusion/SKILL.md +2 -2
  179. package/skill/fusion/references/engine-tools.md +3 -0
  180. package/skill/fusion/references/extension-tools.md +39 -0
  181. package/skill/fusion/references/fusion-capabilities.md +3 -0
  182. package/dist/client/assets/AgentDetailView-C1XceMgi.js +0 -18
  183. package/dist/client/assets/AgentDetailView-CeO_1MK7.css +0 -1
  184. package/dist/client/assets/AgentsView-Deh125ss.js +0 -527
  185. package/dist/client/assets/ChatView-7D_RQDqT.js +0 -1
  186. package/dist/client/assets/InsightsView-AWo5o_81.css +0 -1
  187. package/dist/client/assets/InsightsView-jKjEFAx_.js +0 -11
  188. package/dist/client/assets/NodesView-Di2SvOhg.js +0 -14
  189. package/dist/client/assets/NodesView-fXqDk9ur.css +0 -1
  190. package/dist/client/assets/PluginManager-B9-NbQ8f.js +0 -1
  191. package/dist/client/assets/PluginManager-C1DbPaar.css +0 -1
  192. package/dist/client/assets/RoadmapsView-DHWjUoc8.js +0 -6
  193. package/dist/client/assets/SettingsModal-DHitIpsa.css +0 -1
  194. package/dist/client/assets/SettingsModal-DR_yirvK.js +0 -31
  195. package/dist/client/assets/SetupWizardModal-BtDMY9pa.js +0 -1
  196. package/dist/client/assets/agentSkills-B-w5wFHh.js +0 -1
  197. package/dist/client/assets/index-Bc6ZdGMz.css +0 -1
  198. package/dist/client/assets/index-D__RMku8.js +0 -694
  199. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraphView.css +0 -141
  200. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraphView.tsx +0 -428
  201. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraphView.test.tsx +0 -261
  202. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/storage.test.ts +0 -41
  203. package/dist/plugins/fusion-plugin-dependency-graph/src/storage.ts +0 -22
  204. /package/dist/client/assets/{RoadmapsView-DdGlfuu-.css → dashboard-view-DdGlfuu-.css} +0 -0
@@ -0,0 +1,29 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-gy_5SUj2.js","assets/vendor-react-K0fH_qHe.js","assets/index-CQyVRLOb.js","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/index-CxA2Nn0_.css","assets/star-DYesq1AV.js","assets/ExperimentalAgentOnboardingModal-jcInE50G.js","assets/ExperimentalAgentOnboardingModal-B-APN_lM.css","assets/AgentDetailView-BwJaLqZh.css"])))=>i.map(i=>d[i]);
2
+ import{c as Xe,A as De,C as qe,Z as Kt,s as Zt,r as ht,F as pt,f as qt,a as Jt,b as Ft,B as xt,u as Pt,d as nt,e as Qt,g as Xt,h as Yt,i as es,j as wt,k as Qe,P as ts,l as ss,m as as,n as ns,o as Ct,G as ls,S as is,L as lt,T as it,R as Ge,X as St,p as rs,q as os,t as At,v as cs,w as ds,x as us,y as ms,z as fe,D as rt,E as gs,H as hs,N as ps,I as xs,J as vs,M as bs,K as js,O as fs,Q as Ns,U as ot,V as Tt,W as ys,_ as ks,Y as ws,$ as Ke,a0 as Cs,a1 as Rt,a2 as Ss,a3 as As,a4 as Ts}from"./index-CQyVRLOb.js";import{r as a,j as e,a as Rs}from"./vendor-react-K0fH_qHe.js";import{A as Es,S as Ms,E as _s,f as $s}from"./ExperimentalAgentOnboardingModal-jcInE50G.js";import{U as zt}from"./upload-DTWF3Db5.js";import{F as Ls}from"./folder-open-DHjELt8-.js";import"./vendor-xterm-DzcZoU0P.js";/**
3
+ * @license lucide-react v1.7.0 - ISC
4
+ *
5
+ * This source code is licensed under the ISC license.
6
+ * See the LICENSE file in the root directory of this source tree.
7
+ */const Is=[["path",{d:"M13 5h8",key:"a7qcls"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"m3 17 2 2 4-4",key:"1jhpwq"}],["rect",{x:"3",y:"4",width:"6",height:"6",rx:"1",key:"cif1o7"}]],Fs=Xe("list-todo",Is);/**
8
+ * @license lucide-react v1.7.0 - ISC
9
+ *
10
+ * This source code is licensed under the ISC license.
11
+ * See the LICENSE file in the root directory of this source tree.
12
+ */const Ps=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],zs=Xe("sliders-horizontal",Ps);/**
13
+ * @license lucide-react v1.7.0 - ISC
14
+ *
15
+ * This source code is licensed under the ISC license.
16
+ * See the LICENSE file in the root directory of this source tree.
17
+ */const Ds=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Hs=Xe("zoom-in",Ds);/**
18
+ * @license lucide-react v1.7.0 - ISC
19
+ *
20
+ * This source code is licensed under the ISC license.
21
+ * See the LICENSE file in the root directory of this source tree.
22
+ */const Os=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Bs=Xe("zoom-out",Os);function Et(n){return typeof n=="number"&&Number.isFinite(n)?n:0}function ze(n){return n.toLocaleString()}function Gs({agents:n}){const{rows:i,totalInputTokens:f,totalOutputTokens:u,totalTokens:d}=a.useMemo(()=>{const o=n.map(c=>{const v=Et(c.totalInputTokens),N=Et(c.totalOutputTokens);return{id:c.id,name:c.name,inputTokens:v,outputTokens:N,totalTokens:v+N}}).sort((c,v)=>v.totalTokens-c.totalTokens||c.name.localeCompare(v.name)||c.id.localeCompare(v.id));return{rows:o,totalInputTokens:o.reduce((c,v)=>c+v.inputTokens,0),totalOutputTokens:o.reduce((c,v)=>c+v.outputTokens,0),totalTokens:o.reduce((c,v)=>c+v.totalTokens,0)}},[n]),g=d>0;return e.jsxs("section",{className:"agent-token-stats-panel","aria-label":"Agent token usage statistics",children:[e.jsx("header",{className:"agent-token-stats-panel__header",children:e.jsx("h3",{className:"agent-token-stats-panel__title",children:"Token Usage by Agent"})}),e.jsxs("div",{className:"agent-token-stats-panel__totals",role:"list","aria-label":"Token usage totals",children:[e.jsxs("div",{className:"agent-token-stats-panel__total-card",role:"listitem",children:[e.jsx("span",{className:"agent-token-stats-panel__total-label",children:"Input Tokens"}),e.jsx("span",{className:"agent-token-stats-panel__total-value",children:ze(f)})]}),e.jsxs("div",{className:"agent-token-stats-panel__total-card",role:"listitem",children:[e.jsx("span",{className:"agent-token-stats-panel__total-label",children:"Output Tokens"}),e.jsx("span",{className:"agent-token-stats-panel__total-value",children:ze(u)})]}),e.jsxs("div",{className:"agent-token-stats-panel__total-card",role:"listitem",children:[e.jsx("span",{className:"agent-token-stats-panel__total-label",children:"Combined Tokens"}),e.jsx("span",{className:"agent-token-stats-panel__total-value",children:ze(d)})]})]}),g?e.jsx("div",{className:"agent-token-stats-panel__table-wrapper",children:e.jsxs("table",{className:"agent-token-stats-panel__table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{scope:"col",children:"Agent"}),e.jsx("th",{scope:"col",children:"Input"}),e.jsx("th",{scope:"col",children:"Output"}),e.jsx("th",{scope:"col",children:"Total"})]})}),e.jsx("tbody",{children:i.map(o=>e.jsxs("tr",{children:[e.jsxs("th",{scope:"row",className:"agent-token-stats-panel__agent-cell",children:[e.jsx("span",{className:"agent-token-stats-panel__agent-name",children:o.name}),e.jsx("span",{className:"agent-token-stats-panel__agent-id",children:o.id})]}),e.jsx("td",{children:ze(o.inputTokens)}),e.jsx("td",{children:ze(o.outputTokens)}),e.jsx("td",{className:"agent-token-stats-panel__total-cell",children:ze(o.totalTokens)})]},o.id))})]})}):e.jsx("div",{className:"agent-token-stats-panel__empty",role:"status",children:"No token usage recorded yet. Token totals appear here once agents run."})]})}const Vs=[{icon:De,label:"Active Agents",valueKey:"activeCount",className:"agent-metric-card--active"},{icon:Fs,label:"Assigned Tasks",valueKey:"assignedTaskCount",className:"agent-metric-card--tasks"},{icon:qe,label:"Success Rate",valueKey:"successRate",className:"agent-metric-card--success"},{icon:Kt,label:"Total Runs",valueKey:"completedRuns",className:"agent-metric-card--runs"}];function Us({stats:n,className:i=""}){return n?e.jsx("div",{className:`agent-metrics-bar ${i}`.trim(),children:Vs.map(f=>{const u=f.valueKey==="successRate"?`${Math.round(n.successRate*100)}%`:n[f.valueKey];return e.jsxs("div",{className:`agent-metric-card ${f.className}`,children:[e.jsx(f.icon,{size:18}),e.jsxs("div",{className:"agent-metric-info",children:[e.jsx("span",{className:"agent-metric-value",children:u}),e.jsx("span",{className:"agent-metric-label",children:f.label})]})]},f.label)})}):null}const Mt=200;function Ws(n,i){const[f,u]=a.useState([]),[d,g]=a.useState(!1),o=a.useRef(null),c=a.useRef(0),v=a.useRef(n),N=a.useRef(i);return(v.current!==n||N.current!==i)&&(v.current=n,N.current=i,c.current++,o.current&&(o.current(),o.current=null),u([]),g(!1)),a.useEffect(()=>{if(!n){u([]),g(!1);return}const E=c.current;let C=`/api/tasks/${encodeURIComponent(n)}/logs/stream`;i&&(C+=`?projectId=${encodeURIComponent(i)}`);const w=Zt(C,{events:{"agent:log":P=>{if(c.current===E)try{const T=JSON.parse(P.data),M={type:T.type??"text",text:T.text??T.content??"",timestamp:T.timestamp,content:T.content};u(S=>{const _=[M,...S];return _.length>Mt?_.slice(0,Mt):_})}catch{}}},onOpen:()=>{c.current===E&&g(!0)},onError:()=>{c.current===E&&g(!1)}});return o.current=w,()=>{w(),o.current=null,c.current===E&&g(!1)}},[n,i]),{entries:f,isConnected:d}}const Ks=5e3;function Zs({agent:n,projectId:i,onSelect:f,onOpenTaskLogs:u}){const{entries:d,isConnected:g}=Ws(n.taskId,i),[o,c]=a.useState(null);a.useEffect(()=>{if(!n.taskId){c(null);return}let S=!1,_;const p=async()=>{try{const I=await qt(n.taskId,i);S||c(I)}catch{}finally{S||(_=setTimeout(p,Ks))}};return p(),()=>{S=!0,_&&clearTimeout(_)}},[n.taskId,i]);const v=n.lastHeartbeatAt?Math.floor((Date.now()-new Date(n.lastHeartbeatAt).getTime())/1e3):0,N=(()=>{if(!n.lastHeartbeatAt)return null;const S=ht(n.runtimeConfig?.heartbeatIntervalMs),_=new Date(n.lastHeartbeatAt).getTime()+S,p=Math.round((_-Date.now())/1e3);return Number.isFinite(p)?p<=0?`Heartbeat overdue ${ct(-p)}`:`Next heartbeat in ${ct(p)}`:null})(),k=o?.steps?.[o.currentStep??0],E=o?.steps?.length??0,C=(o?.currentStep??0)+1,w=o?.modelId,P=()=>{f&&f(n.id)},T=S=>{S.stopPropagation(),n.taskId&&u&&u(n.taskId)},M=S=>{(S.key==="Enter"||S.key===" ")&&(S.preventDefault(),P())};return e.jsxs("div",{className:"live-agent-card",onClick:P,onKeyDown:M,role:"button",tabIndex:0,"aria-label":`Select agent ${n.name}`,children:[e.jsxs("div",{className:"live-agent-card-header",children:[e.jsxs("div",{className:"live-agent-card-name",children:[e.jsx("span",{className:`status-dot ${n.state==="running"?"status-dot--pending":"status-dot--online"}`,"aria-hidden":"true"}),e.jsx("span",{children:n.name})]}),n.taskId&&e.jsx("span",{className:"live-agent-task badge",children:n.taskId})]}),e.jsx("div",{className:"live-agent-card-transcript",children:d.length===0?e.jsx("div",{className:"live-agent-card-empty",children:n.taskId?k?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"live-agent-card-status",children:["Step ",C,E?`/${E}`:"",": ",k.name]}),w&&e.jsx("div",{className:"live-agent-card-status-sub",children:w}),e.jsx("div",{className:"live-agent-card-status-sub",children:g?"Waiting for output...":"Connecting to log stream..."})]}):e.jsx("span",{children:g?"Waiting for output...":"Connecting..."}):e.jsx("span",{children:n.state==="running"?"Starting...":"Idle — no task assigned"})}):d.slice(0,20).map((S,_)=>e.jsx("div",{className:"live-agent-card-line",children:S.text},_))}),e.jsxs("div",{className:"live-agent-card-footer",children:[e.jsxs("div",{className:"live-agent-card-footer-meta",children:[e.jsx("span",{className:"text-secondary",title:"Time since last heartbeat",children:ct(v)}),N&&e.jsx("span",{className:"live-agent-card-next-heartbeat",title:N,children:N})]}),e.jsxs("div",{className:"live-agent-card-footer-actions",children:[n.taskId&&u&&e.jsxs("button",{type:"button",className:"live-agent-card-logs-btn",onClick:T,title:"View live run logs","aria-label":`View live logs for ${n.taskId}`,children:[e.jsx(pt,{size:12}),e.jsx("span",{children:"Live logs"})]}),g&&e.jsx(De,{size:12,className:"live-agent-streaming-dot"})]})]})]})}function ct(n){return n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m ${n%60}s`:`${Math.floor(n/3600)}h ${Math.floor(n%3600/60)}m`}function qs({agents:n,projectId:i,onAgentSelect:f,onOpenTaskLogs:u,className:d=""}){const g=Array.from(new Map(n.map(o=>[o.id,o])).values());return g.length===0?null:e.jsxs("div",{className:`active-agents-panel ${d}`.trim(),children:[e.jsxs("div",{className:"active-agents-panel-header",children:[e.jsx(De,{size:16}),e.jsxs("span",{children:["Active Agents (",g.length,")"]})]}),e.jsx("div",{className:"active-agents-grid",children:g.map(o=>e.jsx(Zs,{agent:o,projectId:i,onSelect:f,onOpenTaskLogs:u},o.id))})]})}function Js({stats:n,activeAgents:i,projectId:f,isOpen:u,onToggle:d,onSelectAgent:g,onOpenTaskLogs:o}){return e.jsxs("section",{className:"agents-overview-bar","aria-label":"Agents overview",children:[e.jsxs("button",{type:"button",className:"agents-overview-bar__toggle","aria-expanded":u,onClick:d,children:[e.jsxs("span",{className:"agents-overview-bar__title-wrap",children:[u?e.jsx(Jt,{size:16,"aria-hidden":"true"}):e.jsx(Ft,{size:16,"aria-hidden":"true"}),e.jsx("span",{className:"agents-overview-bar__title",children:"Overview"})]}),e.jsxs("span",{className:"agents-overview-bar__meta text-secondary",children:[i.filter(c=>c.state==="active").length," active · ",i.filter(c=>c.state==="running").length," running"]})]}),u?e.jsxs("div",{className:"agents-overview-bar__content",children:[e.jsx(Us,{stats:n,className:"agents-overview-bar__metrics"}),e.jsx(qs,{agents:i,projectId:f,onAgentSelect:g,onOpenTaskLogs:o,className:"agents-overview-bar__active-panel"})]}):null]})}function dt({title:n="No agents found",description:i="Create an agent to get started",ctaLabel:f="Create Agent",onCtaClick:u}){return e.jsxs("div",{className:"agent-empty",children:[e.jsx(xt,{size:48,opacity:.3,className:"agent-empty-state__icon"}),e.jsx("p",{className:"agent-empty-state__title",children:n}),e.jsx("p",{className:"agent-empty-state__description text-secondary",children:i}),u?e.jsx("button",{type:"button",className:"btn btn-task-create btn-sm",onClick:u,children:f}):null]})}const _t=3,ut=1e3;function Qs({isOpen:n,onClose:i,onGenerated:f,projectId:u}){Pt(n);const[d,g]=a.useState(""),[o,c]=a.useState({type:"input"}),[v,N]=a.useState(null),[k,E]=a.useState(!1),C=a.useRef(null),w=a.useRef(null);a.useEffect(()=>{n&&o.type==="input"&&w.current?.focus()},[n,o.type]),a.useEffect(()=>{if(!n&&C.current){const p=C.current;C.current=null,nt(p,u).catch(()=>{})}},[n,u]),a.useEffect(()=>{if(!n)return;const p=I=>{I.key==="Escape"&&P()};return document.addEventListener("keydown",p),()=>document.removeEventListener("keydown",p)},[n]);const P=a.useCallback(()=>{if(C.current){const p=C.current;C.current=null,nt(p,u).catch(()=>{})}g(""),c({type:"input"}),N(null),E(!1),i()},[i,u]),T=a.useCallback(async()=>{if(!(!d.trim()||d.trim().length<_t)){N(null),c({type:"loading"});try{const{sessionId:p}=await Qt(d.trim(),u);C.current=p;const{spec:I}=await Xt(p,u);c({type:"preview",spec:I,sessionId:p})}catch(p){const I=p instanceof Error?p.message:"Failed to generate agent specification";I.includes("429")||I.toLowerCase().includes("rate limit")?N("Too many requests. Please wait a moment and try again."):N(I),c({type:"input"}),C.current=null}}},[d,u]),M=a.useCallback(async()=>{if(C.current){const p=C.current;C.current=null;try{await nt(p,u)}catch{}}await T()},[T,u]),S=a.useCallback(()=>{o.type==="preview"&&(C.current=null,f(o.spec),g(""),c({type:"input"}),N(null),E(!1),i())},[o,f,i]);if(!n)return null;const _=d.trim().length>=_t&&d.trim().length<=ut;return e.jsx("div",{className:"agent-dialog-overlay",onClick:p=>{p.target===p.currentTarget&&P()},children:e.jsxs("div",{className:"agent-dialog",role:"dialog","aria-modal":"true","aria-label":"Generate agent with AI",children:[e.jsxs("div",{className:"agent-dialog-header",children:[e.jsxs("span",{className:"agent-dialog-header-title",children:[e.jsx("span",{className:"agent-dialog-header-sparkle",children:"✨"}),"Generate Agent"]}),e.jsx("button",{className:"modal-close",onClick:P,"aria-label":"Close",children:"×"})]}),e.jsxs("div",{className:"agent-dialog-body",children:[v&&e.jsx("div",{className:"agent-dialog-error-banner",children:v}),o.type==="input"&&e.jsxs("div",{children:[e.jsx("p",{className:"agent-dialog-info",children:"Describe your agent's role and the AI will generate a complete specification including system prompt, suggested configuration, and more."}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-role-description",children:"Role Description"}),e.jsx("textarea",{ref:w,id:"agent-role-description",className:"input agent-dialog-textarea",rows:4,placeholder:'e.g. "Senior frontend code reviewer who specializes in React accessibility"',value:d,onChange:p=>g(p.target.value),onKeyDown:p=>{p.key==="Enter"&&!p.shiftKey&&_&&(p.preventDefault(),T())},maxLength:ut,"aria-describedby":"role-description-hint"}),e.jsxs("div",{id:"role-description-hint",className:"agent-dialog-hint",children:[e.jsx("span",{children:"Describe what your agent should do"}),e.jsxs("span",{children:[d.length,"/",ut]})]})]})]}),o.type==="loading"&&e.jsxs("div",{className:"agent-dialog-loading-center",children:[e.jsx("div",{className:"agent-dialog-spinner spin"}),e.jsx("p",{className:"agent-dialog-loading-text",children:"Generating agent specification..."})]}),o.type==="preview"&&e.jsxs("div",{children:[e.jsxs("div",{className:"agent-dialog-summary agent-dialog-summary--spaced",children:[e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Title"}),e.jsxs("span",{className:"agent-dialog-summary-row-value",children:[o.spec.icon," ",o.spec.title]})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Role"}),e.jsx("span",{children:o.spec.role})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Description"}),e.jsx("span",{className:"agent-dialog-summary-row-value agent-dialog-summary-row-value--body",children:o.spec.description})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Thinking"}),e.jsx("span",{className:"agent-dialog-summary-row-value agent-dialog-summary-row-value--capitalize",children:o.spec.thinkingLevel})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Max Turns"}),e.jsx("span",{children:o.spec.maxTurns})]})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{children:["System Prompt",e.jsx("button",{type:"button",className:"agent-dialog-expand-btn",onClick:()=>E(!k),children:k?"Collapse":"Expand"})]}),e.jsxs("div",{className:`agent-generation-prompt-box${k?"":" agent-generation-prompt-box--collapsed"}`,children:[o.spec.systemPrompt,!k&&o.spec.systemPrompt.length>500&&e.jsx("div",{className:"agent-generation-prompt-fade"})]})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[e.jsx("button",{className:"btn",onClick:P,children:"Cancel"}),o.type==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void T(),disabled:!_,children:"Generate"}),o.type==="preview"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn",onClick:()=>void M(),children:"Regenerate"}),e.jsx("button",{className:"btn btn-task-create",onClick:S,children:"Use This"})]})]})]})})}const $t=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],Lt=new Set(["triage","executor","reviewer","merger","scheduler","engineer","custom"]);function Xs({isOpen:n,onClose:i,onCreated:f,projectId:u,prefillDraft:d=null,agentOnboardingEnabled:g=!1,existingAgents:o=[],onPrefillDraft:c}){const[v,N]=a.useState(0),[k,E]=a.useState("presets"),[C,w]=a.useState(""),[P,T]=a.useState(""),[M,S]=a.useState(""),[_,p]=a.useState("custom"),[I,$]=a.useState(""),[ee,Ne]=a.useState(""),[oe,te]=a.useState(""),[le,ce]=a.useState(""),[z,y]=a.useState(""),[xe,ve]=a.useState(""),[A,se]=a.useState({model:"",thinkingLevel:"off",maxTurns:1e3}),[de,ye]=a.useState(null),[ae,V]=a.useState([]),[ue,G]=a.useState(!1),[U,J]=a.useState(null),[be,ie]=a.useState(!1),[W,Q]=a.useState(!1),[Ee,Me]=a.useState([]),[_e,ke]=a.useState(!1),[me,we]=a.useState([]),[X,$e]=a.useState([]),[H,F]=a.useState("model"),[re,K]=a.useState(""),[Ce,Y]=a.useState([]),[Se,Ae]=a.useState(!1),[l,x]=a.useState([]),[R,Z]=a.useState(!1);a.useEffect(()=>{n&&(ke(!0),Yt().then(s=>{Me(s.models),we(s.favoriteProviders),$e(s.favoriteModels)}).catch(()=>{}).finally(()=>ke(!1)))},[n]),a.useEffect(()=>{n&&(Z(!0),x([]),es(void 0,u).then(s=>{x(s)}).catch(()=>{x([])}).finally(()=>Z(!1)))},[n,u]),a.useEffect(()=>{if(!n)return;const s=ss;if(typeof s!="function"){Y([]),Ae(!1);return}Ae(!0),Y([]),s(u).then(b=>{Y(b)}).catch(()=>{Y([])}).finally(()=>Ae(!1))},[n,u]);const L=A.model.includes("/")?A.model:"",D=a.useCallback(s=>{const b=Lt.has(s.role)?s.role:"custom";w(s.title),T(s.description),S(s.icon),p(b),te(s.systemPrompt),se(he=>({...he,thinkingLevel:s.thinkingLevel,maxTurns:s.maxTurns})),ie(!1),N(1)},[]),Te=a.useCallback(s=>{se(b=>({...b,model:s}))},[]),Le=a.useCallback(s=>{F(s),s==="model"&&K("")},[]),Fe=a.useCallback(async s=>{const b=me,ne=b.includes(s)?b.filter(Re=>Re!==s):[s,...b];we(ne);try{await wt({favoriteProviders:ne,favoriteModels:X})}catch{we(b)}},[me,X]),Ie=a.useCallback(async s=>{const b=X,ne=b.includes(s)?b.filter(Re=>Re!==s):[s,...b];$e(ne);try{await wt({favoriteProviders:me,favoriteModels:ne})}catch{$e(b)}},[me,X]),Ye=a.useCallback(s=>{ye(s.id),w(s.name),S(s.icon),T(s.description??s.title),p(s.role),y(s.soul??""),te(s.instructionsText??""),N(1)},[]),je=a.useCallback(s=>{const b=s.runtimeHint?.trim()??"",he=s.model?.trim()||s.modelHint?.trim()||"";N(1),E("custom"),w(s.name??""),T(s.title??""),S(s.icon??""),p(Lt.has(s.role)?s.role:"custom"),$(s.reportsTo??""),te(s.instructionsText??""),ce(s.heartbeatProcedurePath??""),y(s.soul??""),ve(s.memory??""),V(Array.isArray(s.skills)?s.skills:[]),se(ne=>({...ne,model:b?"":he,thinkingLevel:s.thinkingLevel??ne.thinkingLevel,maxTurns:s.maxTurns??ne.maxTurns})),b?(F("runtime"),K(b)):(F("model"),K(""))},[]);if(a.useEffect(()=>{!n||!d||je(d)},[n,d,je]),!n)return null;const ge=()=>{N(0),E("presets"),w(""),T(""),S(""),p("custom"),$(""),Ne(""),te(""),ce(""),y(""),ve(""),se({model:"",thinkingLevel:"off",maxTurns:1e3}),F("model"),K(""),ye(null),V([]),J(null),ie(!1),Q(!1),i()},et=async()=>{if(C.trim()){G(!0),J(null);try{const s={};H==="runtime"?re.trim()&&(s.runtimeHint=re.trim()):A.model.trim()&&(s.model=A.model.trim()),A.thinkingLevel!=="off"&&(s.thinkingLevel=A.thinkingLevel),A.maxTurns!==1e3&&(s.maxTurns=A.maxTurns),await ns({name:C.trim(),role:_,...P.trim()?{title:P.trim()}:{},...M.trim()?{icon:M.trim()}:{},...I.trim()?{reportsTo:I.trim()}:{},...ee.trim()?{instructionsPath:ee.trim()}:{},...oe.trim()?{instructionsText:oe.trim()}:{},...le.trim()?{heartbeatProcedurePath:le.trim()}:{},...z.trim()?{soul:z.trim()}:{},...xe.trim()?{memory:xe.trim()}:{},...Object.keys(s).length>0?{runtimeConfig:s}:{},...ae.length>0?{metadata:{skills:ae}}:{}},u),ge(),f()}catch(s){J(s instanceof Error?s.message:"Failed to create agent")}finally{G(!1)}}},Ve=$t.find(s=>s.value===_),Pe=I.trim(),He=Pe?l.find(s=>s.id===Pe):void 0,Oe=re?Ce.find(s=>s.runtimeId===re):void 0,Ue=s=>e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{id:s,children:"Runtime Source"}),e.jsxs("div",{className:"agent-runtime-mode-toggle",role:"radiogroup","aria-labelledby":s,children:[e.jsxs("label",{className:`agent-runtime-mode-option${H==="model"?" agent-runtime-mode-option--active":""}`,children:[e.jsx("input",{type:"radio",name:s,value:"model",checked:H==="model",onChange:()=>Le("model")}),e.jsx("span",{children:"Built-in Model"})]}),e.jsxs("label",{className:`agent-runtime-mode-option${H==="runtime"?" agent-runtime-mode-option--active":""}`,children:[e.jsx("input",{type:"radio",name:s,value:"runtime",checked:H==="runtime",onChange:()=>Le("runtime")}),e.jsx("span",{children:"Plugin Runtime"})]})]})]}),H==="model"?e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{children:"Model"}),_e?e.jsx("div",{className:"agent-dialog-loading",children:"Loading models…"}):e.jsx(as,{id:"agent-model",label:"Model",value:L,onChange:Te,models:Ee,placeholder:"Select a model…",favoriteProviders:me,onToggleFavorite:Fe,favoriteModels:X,onToggleModelFavorite:Ie})]}):e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-runtime-hint",children:"Runtime"}),Se?e.jsx("div",{className:"agent-dialog-loading",children:"Loading runtimes…"}):e.jsxs("select",{id:"agent-runtime-hint",className:"select",value:re,onChange:b=>K(b.target.value),children:[e.jsx("option",{value:"",children:Ce.length>0?"Select a plugin runtime…":"No plugin runtimes available"}),Ce.map(b=>e.jsx("option",{value:b.runtimeId,children:b.description?`${b.name} — ${b.description}`:b.name},`${b.pluginId}:${b.runtimeId}`))]})]})]});return Rs.createPortal(e.jsxs("div",{className:"agent-dialog-overlay",onClick:s=>{s.target===s.currentTarget&&ge()},children:[e.jsxs("div",{className:"agent-dialog",role:"dialog","aria-modal":"true","aria-label":"Create new agent",children:[e.jsxs("div",{className:"agent-dialog-header",children:[e.jsx("span",{className:"agent-dialog-header-title",children:"New Agent"}),e.jsx("button",{className:"btn-icon",onClick:ge,"aria-label":"Close",children:"×"})]}),e.jsx("div",{className:"agent-dialog-steps",children:[0,1,2].map(s=>e.jsx("div",{className:`agent-dialog-step${s===v?" active":s<v?" completed":""}`,"aria-label":`Step ${s+1}`},s))}),e.jsxs("div",{className:"agent-dialog-body",children:[v===0&&e.jsxs("div",{children:[g&&e.jsx("div",{className:"agent-dialog-step-zero-actions",children:e.jsx("button",{type:"button",className:"btn agent-dialog-interview-btn",onClick:()=>Q(!0),children:"AI Interview"})}),e.jsxs("div",{className:"agent-dialog-tabs",role:"tablist","aria-label":"Agent setup mode",children:[e.jsx("button",{id:"agent-dialog-tab-presets",type:"button",role:"tab","aria-controls":"agent-dialog-panel-presets","aria-selected":k==="presets",tabIndex:k==="presets"?0:-1,className:`agent-dialog-tab${k==="presets"?" active":""}`,onClick:()=>E("presets"),"data-testid":"agent-dialog-tab-presets",children:"Preset personas"}),e.jsx("button",{id:"agent-dialog-tab-custom",type:"button",role:"tab","aria-controls":"agent-dialog-panel-custom","aria-selected":k==="custom",tabIndex:k==="custom"?0:-1,className:`agent-dialog-tab${k==="custom"?" active":""}`,onClick:()=>E("custom"),"data-testid":"agent-dialog-tab-custom",children:"Custom agent"})]}),k==="presets"&&e.jsx("div",{id:"agent-dialog-panel-presets",className:"agent-dialog-tab-panel",role:"tabpanel","aria-labelledby":"agent-dialog-tab-presets",children:e.jsxs("div",{className:"agent-presets",children:[e.jsx("div",{className:"agent-presets-header",children:"Choose a preset persona to prefill role, identity, soul, and instructions"}),e.jsx("div",{className:"agent-presets-grid",children:Es.map(s=>e.jsxs("button",{type:"button",className:`agent-preset-card${de===s.id?" selected":""}`,"data-testid":`preset-${s.id}`,onClick:()=>Ye(s),title:s.title,children:[e.jsx("span",{className:"agent-preset-icon",children:e.jsx(Qe,{agent:{id:s.id,icon:s.icon,name:s.name},size:28})}),e.jsx("span",{className:"agent-preset-name",children:s.name}),e.jsx("span",{className:"agent-preset-role",children:s.role}),s.description&&e.jsx("span",{className:"agent-preset-description",children:s.description})]},s.id))})]})}),k==="custom"&&e.jsxs("div",{id:"agent-dialog-panel-custom",className:"agent-dialog-tab-panel",role:"tabpanel","aria-labelledby":"agent-dialog-tab-custom",children:[e.jsxs("div",{className:"agent-dialog-section",children:[e.jsx("div",{className:"agent-dialog-section-header",children:"Identity"}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-name",children:["Name ",!de&&e.jsx("span",{className:"agent-dialog-required",children:"*"})]}),e.jsx("input",{id:"agent-name",type:"text",className:"input",placeholder:"e.g. Frontend Reviewer",value:C,onChange:s=>w(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field agent-dialog-field--title",children:[e.jsxs("label",{htmlFor:"agent-title",children:["Title ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-title",type:"text",className:"input",placeholder:"e.g. Senior Code Reviewer",value:P,onChange:s=>T(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-icon",children:["Icon ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-icon",type:"text",className:"input",placeholder:"e.g. 🤖",value:M,onChange:s=>S(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{children:"Role"}),e.jsx("div",{className:"agent-role-grid",children:$t.map(s=>e.jsxs("button",{type:"button",className:`agent-role-option${_===s.value?" selected":""}`,onClick:()=>p(s.value),children:[e.jsx("span",{className:"agent-role-option-icon",children:s.icon}),e.jsx("span",{className:"agent-role-option-label",children:s.label})]},s.value))})]})]}),e.jsxs("div",{className:"agent-dialog-section",children:[e.jsx("div",{className:"agent-dialog-section-header",children:"Configuration"}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-reports-to",children:["Reports To ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsxs("select",{id:"agent-reports-to",className:"select",value:I,onChange:s=>$(s.target.value),disabled:R,children:[e.jsx("option",{value:"",children:"No manager"}),l.map(s=>e.jsxs("option",{value:s.id,children:[s.name," (",s.id,")"]},s.id))]})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-soul",children:["Soul ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("textarea",{id:"agent-soul",className:"input",rows:2,placeholder:"Describe the agent's personality and communication style...",value:z,onChange:s=>y(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-memory",children:["Agent Memory ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("textarea",{id:"agent-memory",className:"input",rows:2,placeholder:"Private to this agent — durable preferences, operating habits, and context it should carry across tasks...",value:xe,onChange:s=>ve(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-instructions-path",children:["Instructions Path ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-instructions-path",type:"text",className:"input",placeholder:"e.g. .fusion/agents/reviewer.md",value:ee,onChange:s=>Ne(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-heartbeat-procedure-path",children:["Heartbeat Procedure Path ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-heartbeat-procedure-path",type:"text",className:"input",placeholder:"e.g. .fusion/agents/ceo-agent2736/HEARTBEAT.md",value:le,onChange:s=>ce(s.target.value)}),e.jsx("p",{className:"agent-dialog-optional agent-dialog-field-hint",children:"Path to the agent's heartbeat procedure path, typically .fusion/agents/ceo-agent2736/HEARTBEAT.md. Legacy id-only default paths still work."})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-instructions-text",children:["Inline Instructions ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("textarea",{id:"agent-instructions-text",className:"input",rows:4,placeholder:"Add custom behavior instructions...",value:oe,onChange:s=>te(s.target.value)})]})]}),e.jsxs("div",{className:"agent-dialog-section",children:[e.jsx("div",{className:"agent-dialog-section-header",children:"Runtime"}),Ue("agent-runtime-source-step-0")]}),e.jsxs("div",{className:"agent-dialog-ai-generate",children:[e.jsxs("button",{type:"button",className:"btn btn--ai-generate",onClick:()=>ie(!0),children:[e.jsx("span",{children:"✨"}),"Generate with AI"]}),e.jsx("p",{className:"agent-dialog-ai-hint",children:"Describe your agent's role and let AI generate a specification"})]})]})]}),v===1&&e.jsxs("div",{children:[Ue("agent-runtime-source-step-1"),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-thinking",children:"Thinking Level"}),e.jsxs("select",{id:"agent-thinking",className:"select",value:A.thinkingLevel,onChange:s=>se(b=>({...b,thinkingLevel:s.target.value})),children:[e.jsx("option",{value:"off",children:"Off"}),e.jsx("option",{value:"minimal",children:"Minimal"}),e.jsx("option",{value:"low",children:"Low"}),e.jsx("option",{value:"medium",children:"Medium"}),e.jsx("option",{value:"high",children:"High"})]})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-max-turns",children:"Max Turns"}),e.jsx("input",{id:"agent-max-turns",type:"number",className:"input",min:1,max:2e3,value:A.maxTurns,onChange:s=>se(b=>({...b,maxTurns:Math.max(1,parseInt(s.target.value,10)||1)}))})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx(Ms,{id:"agent-skills",label:"Skills",value:ae,onChange:V,projectId:u}),e.jsx("p",{className:"agent-dialog-optional agent-dialog-skills-hint",children:"Optional skills to assign to this agent"})]})]}),v===2&&e.jsxs("div",{children:[e.jsx("p",{className:"agent-dialog-info",children:"Review your agent configuration before creating."}),e.jsxs("div",{className:"agent-dialog-summary",children:[e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Name"}),e.jsxs("span",{className:"agent-dialog-summary-row-value",children:[M&&e.jsx("span",{className:"agent-dialog-icon-prefix",children:M}),C]})]}),e.jsxs("div",{className:"agent-dialog-summary-row agent-dialog-summary-row--editable agent-dialog-summary-row--title",children:[e.jsx("label",{className:"agent-dialog-summary-row-label",htmlFor:"agent-review-title",children:"Title"}),e.jsx("input",{id:"agent-review-title",type:"text",className:"input",placeholder:"e.g. Senior Code Reviewer",value:P,onChange:s=>T(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Role"}),e.jsxs("span",{children:[Ve?.icon," ",Ve?.label]})]}),Pe&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Reports To"}),e.jsx("span",{children:He?`${He.name} (${He.id})`:Pe})]}),e.jsxs("div",{className:"agent-dialog-summary-row agent-dialog-summary-row--editable",children:[e.jsx("label",{className:"agent-dialog-summary-row-label",htmlFor:"agent-review-soul",children:"Soul"}),e.jsx("textarea",{id:"agent-review-soul",className:"input",rows:2,placeholder:"Describe the agent's personality and communication style...",value:z,onChange:s=>y(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-summary-row agent-dialog-summary-row--editable",children:[e.jsx("label",{className:"agent-dialog-summary-row-label",htmlFor:"agent-review-heartbeat-procedure-path",children:"Heartbeat Procedure Path"}),e.jsx("input",{id:"agent-review-heartbeat-procedure-path",type:"text",className:"input",placeholder:"e.g. .fusion/agents/ceo-agent2736/HEARTBEAT.md",value:le,onChange:s=>ce(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-summary-row agent-dialog-summary-row--editable",children:[e.jsx("label",{className:"agent-dialog-summary-row-label",htmlFor:"agent-review-instructions-path",children:"Instructions Path"}),e.jsx("input",{id:"agent-review-instructions-path",type:"text",className:"input",placeholder:"e.g. .fusion/agents/reviewer.md",value:ee,onChange:s=>Ne(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-summary-row agent-dialog-summary-row--editable",children:[e.jsx("label",{className:"agent-dialog-summary-row-label",htmlFor:"agent-review-instructions-text",children:"Inline Instructions"}),e.jsx("textarea",{id:"agent-review-instructions-text",className:"input",rows:4,placeholder:"Add custom behavior instructions...",value:oe,onChange:s=>te(s.target.value)})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:H==="runtime"?"Runtime":"Model"}),e.jsx("span",{children:H==="runtime"?Oe?Oe.name:e.jsx("em",{className:"agent-dialog-summary-row-value--muted",children:"Not selected"}):L?e.jsxs(e.Fragment,{children:[e.jsx(ts,{provider:L.split("/")[0],size:"sm"})," ",(()=>{const s=L.indexOf("/"),b=L.slice(0,s),he=L.slice(s+1);return Ee.find(Re=>Re.provider===b&&Re.id===he)?.name||L})()]}):e.jsx("em",{className:"agent-dialog-summary-row-value--muted",children:"default"})})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Thinking"}),e.jsx("span",{className:"agent-dialog-summary-row-value--capitalize",children:A.thinkingLevel})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Max Turns"}),e.jsx("span",{children:A.maxTurns})]}),ae.length>0&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Skills"}),e.jsxs("span",{children:[ae.length," skill",ae.length!==1?"s":""," selected"]})]})]}),U&&e.jsx("p",{className:"agent-dialog-error",children:U})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[v>0&&e.jsx("button",{className:"btn",onClick:()=>N(s=>s-1),disabled:ue,children:"Back"}),e.jsx("button",{className:"btn",onClick:ge,disabled:ue,children:"Cancel"}),v<2?e.jsx("button",{className:"btn btn--primary",onClick:()=>N(s=>s+1),disabled:v===0&&!C.trim()&&!de,children:"Next"}):e.jsx("button",{className:"btn btn--primary",onClick:()=>void et(),disabled:ue||!C.trim(),children:ue?"Creating...":"Create"})]})]}),e.jsx(Qs,{isOpen:be,onClose:()=>ie(!1),onGenerated:D,projectId:u}),e.jsx(_s,{isOpen:W,onClose:()=>Q(!1),onUseDraft:s=>{c?.(s),c||je(s),Q(!1)},projectId:u,existingAgents:o,mode:"create"})]}),document.body)}function Ys(n){const i=n.match(/^---\s*\r?\n([\s\S]*?)\r?\n---(?:\r?\n([\s\S]*))?$/);if(!i)throw new Error("Missing YAML frontmatter delimiters (---)");const f=i[1].split(/\r?\n/),u=i[2]??"",d={name:""},g=[];let o=!1;for(const c of f){const N=c.trimEnd().trim();if(!N)continue;if(N.startsWith("skills:")){o=!0;continue}if(o&&N.startsWith("- ")){g.push(N.slice(2).trim());continue}o=!1;const[k,...E]=N.split(":"),w=E.join(":").trim().replace(/^['"]|['"]$/g,"");k==="name"&&(d.name=w),k==="title"&&(d.title=w),k==="icon"&&(d.icon=w),k==="role"&&(d.role=w),k==="reportsTo"&&(d.reportsTo=w)}if(!d.name)throw new Error("Missing required field: name");return g.length>0&&(d.skills=g),u.trim().length>0&&(d.instructionBody=u),d}function ea({isOpen:n,onClose:i,onImported:f,projectId:u,initialInputMethod:d="paste"}){Pt(n);const[g,o]=a.useState("input"),[c,v]=a.useState(d),[N,k]=a.useState(""),[E,C]=a.useState([]),[w,P]=a.useState("Unknown"),[T,M]=a.useState([]),[S,_]=a.useState([]),[p,I]=a.useState([]),[$,ee]=a.useState([]),[Ne,oe]=a.useState(!1),[te,le]=a.useState(!1),[ce,z]=a.useState(null),[y,xe]=a.useState(null),[ve,A]=a.useState(null),se=a.useRef(null),de=a.useRef(null),[ye,ae]=a.useState([]),[V,ue]=a.useState(""),[G,U]=a.useState(null),[J,be]=a.useState(!1),[ie,W]=a.useState(null),Q=a.useRef(!1);a.useEffect(()=>{c==="browse"&&!Q.current&&!J&&(Q.current=!0,be(!0),W(null),Ct().then(l=>{l.error?W(l.error):l.companies.length>0?ae(l.companies):W("No companies available")}).catch(l=>{W(l instanceof Error?l.message:"Failed to load companies")}).finally(()=>{be(!1)}))},[c,J]);const Ee=a.useCallback(()=>{Q.current=!0,W(null),ae([]),U(null),be(!0),Ct().then(l=>{l.error?W(l.error):l.companies.length>0?ae(l.companies):W("No companies available")}).catch(l=>{W(l instanceof Error?l.message:"Failed to load companies")}).finally(()=>{be(!1)})},[]),Me=a.useCallback(()=>{o("input"),v(d),k(""),C([]),P("Unknown"),M([]),_([]),I([]),ee([]),oe(!1),le(!1),z(null),xe(null),A(null),ae([]),ue(""),U(null),be(!1),W(null),Q.current=!1},[d]),_e=a.useCallback(()=>{Me(),i()},[Me,i]),ke=a.useCallback(l=>{const x=l.target.files?.[0];if(!x)return;const R=new FileReader;R.onload=Z=>{const L=Z.target?.result;v("file"),C([]),k(L),z(null)},R.onerror=()=>{z("Failed to read file")},R.readAsText(x),l.target.value=""},[]),me=a.useCallback(async l=>{const x=Array.from(l.target.files??[]);if(x.length!==0)try{const R=x.filter(L=>(L.webkitRelativePath||L.name).toLowerCase().endsWith("agents.md")).sort((L,D)=>{const Te=L.webkitRelativePath||L.name,Le=D.webkitRelativePath||D.name;return Te.localeCompare(Le)});if(R.length===0){z("Selected directory has no AGENTS.md files");return}const Z=[];for(const L of R){const D=await L.text();Z.push(Ys(D))}v("directory"),C(Z),k(""),z(null)}catch{z("Failed to parse AGENTS.md files from selected directory")}finally{l.target.value=""}},[]);function we(l){if(!u)return`/api${l}`;const x=l.includes("?")?"&":"?";return`/api${l}${x}projectId=${encodeURIComponent(u)}`}const X=a.useCallback(async()=>{if(c==="directory"&&E.length===0){z("Please select a directory containing AGENTS.md files");return}if(c==="browse"&&!G){z("Please select a company from the catalog");return}if(c!=="directory"&&c!=="browse"&&!N.trim()){z("Please provide manifest content");return}oe(!0),z(null);try{let l;c==="directory"?l={agents:E,dryRun:!0}:c==="browse"&&G?l={importSource:"companies.sh",companySlug:G.slug,dryRun:!0}:l={manifest:N,dryRun:!0};const x=await fetch(we("/agents/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)});if(!x.ok){const D=await x.json();throw new Error(D.error??`Parse failed (${x.status})`)}const R=await x.json(),Z=R.agents&&R.agents.length>0?R.agents:R.created.map(D=>({name:D,role:"custom"})),L=Array.isArray(R.skills)?R.skills:[];P(R.companyName??"Unknown"),M(Z),_(L),I(Z.map(D=>D.name)),ee(L.map(D=>D.name)),o("preview")}catch(l){z(l instanceof Error?l.message:"Failed to parse manifest")}finally{oe(!1)}},[c,E,N,G,u]),$e=a.useCallback(async()=>{le(!0),A(null);try{let l;c==="directory"?l={agents:E,skipExisting:!0,selectedAgents:p,selectedSkills:$}:c==="browse"&&G?l={importSource:"companies.sh",companySlug:G.slug,skipExisting:!0,selectedAgents:p,selectedSkills:$}:l={manifest:N,skipExisting:!0,selectedAgents:p,selectedSkills:$};const x=await fetch(we("/agents/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)});if(!x.ok){const Z=await x.json();throw new Error(Z.error??`Import failed (${x.status})`)}const R=await x.json();xe(R),o("result"),f()}catch(l){A(l instanceof Error?l.message:"Failed to import agents")}finally{le(!1)}},[c,E,N,G,p,$,u,f]),H=p.length,F=$.length,re=`${H} Agent${H!==1?"s":""}`,K=`${F} Skill${F!==1?"s":""}`,Ce=H>0&&F>0?`${re} + ${K}`:F>0?K:re,Y=H>0&&F>0?`Importing ${H} agent${H!==1?"s":""} and ${F} skill${F!==1?"s":""}...`:F>0?`Importing ${F} skill${F!==1?"s":""}...`:`Importing ${H} agent${H!==1?"s":""}...`,Se=l=>{I(x=>x.includes(l)?x.filter(R=>R!==l):[...x,l])},Ae=l=>{ee(x=>x.includes(l)?x.filter(R=>R!==l):[...x,l])};return n?e.jsx("div",{className:"agent-dialog-overlay",onClick:l=>{l.target===l.currentTarget&&_e()},children:e.jsxs("div",{className:"agent-dialog agent-import-dialog",role:"dialog","aria-modal":"true","aria-label":"Import agents",children:[e.jsxs("div",{className:"agent-dialog-header",children:[e.jsx("span",{className:"agent-dialog-header-title",children:"Import Agents"}),e.jsx("button",{className:"modal-close",onClick:_e,"aria-label":"Close",children:"×"})]}),e.jsxs("div",{className:"agent-dialog-body",children:[g==="input"&&e.jsxs("div",{className:"agent-import-input",children:[e.jsx("p",{className:"agent-import-description",children:"Import agents from an Agent Companies package. Browse the companies.sh catalog to discover published agents, upload an AGENTS.md file, select a directory, or paste manifest content."}),e.jsxs("div",{className:"agent-import-file-upload",children:[e.jsx("input",{ref:se,type:"file",accept:".md,.txt",onChange:ke,className:"agent-import-file-input","aria-label":"Upload agent manifest file"}),e.jsx("input",{ref:de,type:"file",webkitdirectory:"",multiple:!0,onChange:me,className:"agent-import-file-input","aria-label":"Select directory"}),e.jsxs("button",{type:"button",className:"btn agent-import-upload-btn",onClick:()=>se.current?.click(),children:[e.jsx(zt,{size:16}),"Choose File"]}),e.jsxs("button",{type:"button",className:"btn agent-import-upload-btn",onClick:()=>de.current?.click(),children:[e.jsx(Ls,{size:16}),"Select Directory"]}),e.jsxs("button",{type:"button",className:"btn agent-import-upload-btn",onClick:()=>{v("browse"),C([]),k(""),U(null),z(null)},children:[e.jsx(ls,{size:16}),"Browse Catalog"]}),e.jsx("span",{className:"agent-import-file-hint",children:".md and .txt files supported"})]}),c==="browse"&&e.jsxs("div",{className:"agent-import-browse",children:[e.jsxs("div",{className:"agent-import-browse-header",children:[e.jsxs("div",{className:"agent-import-browse-search",children:[e.jsx(is,{size:16,className:"agent-import-browse-search-icon"}),e.jsx("input",{type:"text",className:"agent-import-browse-search-input",placeholder:"Search companies...",value:V,onChange:l=>ue(l.target.value),"aria-label":"Search companies"})]}),G&&e.jsxs("div",{className:"agent-import-browse-selected",children:[e.jsx("span",{className:"agent-import-browse-selected-label",children:"Selected:"}),e.jsx("span",{className:"agent-import-browse-selected-name",children:G.name}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>U(null),children:"Change"})]})]}),J&&e.jsxs("div",{className:"agent-import-browse-loading",children:[e.jsx(lt,{size:20,className:"spin"}),e.jsx("span",{children:"Loading companies..."})]}),ie&&e.jsxs("div",{className:"agent-import-browse-error",children:[e.jsx(it,{size:16}),e.jsx("span",{children:ie}),e.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Ee,children:[e.jsx(Ge,{size:14}),"Retry"]})]}),!J&&!ie&&e.jsxs("div",{className:"agent-import-browse-list",children:[ye.filter(l=>V===""||l.name.toLowerCase().includes(V.toLowerCase())||(l.tagline?.toLowerCase().includes(V.toLowerCase())??!1)).map(l=>e.jsxs("div",{className:`agent-import-browse-item ${G?.slug===l.slug?"agent-import-browse-item--selected":""}`,onClick:()=>U(l),role:"button",tabIndex:0,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&U(l)},children:[e.jsxs("div",{className:"agent-import-browse-item-header",children:[e.jsx("span",{className:"agent-import-browse-item-name",children:l.name}),l.installs!==void 0&&e.jsxs("span",{className:"agent-import-browse-item-installs",children:[l.installs.toLocaleString()," installs"]})]}),l.tagline&&e.jsx("span",{className:"agent-import-browse-item-tagline",children:l.tagline}),l.repo&&e.jsx("span",{className:"agent-import-browse-item-repo",children:l.repo})]},l.slug)),ye.filter(l=>V===""||l.name.toLowerCase().includes(V.toLowerCase())||(l.tagline?.toLowerCase().includes(V.toLowerCase())??!1)).length===0&&e.jsx("p",{className:"agent-import-browse-empty",children:V?"No companies match your search":"No companies available"})]})]}),c!=="browse"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-import-divider",children:e.jsx("span",{children:"or paste manifest content"})}),e.jsx("textarea",{className:"agent-import-textarea",placeholder:`---
23
+ name: CEO
24
+ title: Chief Executive Officer
25
+ reportsTo: null
26
+ skills:
27
+ - review
28
+ ---
29
+ Agent instructions go here...`,value:N,onChange:l=>{v("paste"),C([]),k(l.target.value),z(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",c]}),ce&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(it,{size:14}),ce]})]}),g==="preview"&&e.jsxs("div",{className:"agent-import-preview",children:[e.jsxs("div",{className:"agent-import-company",children:[e.jsx("span",{className:"agent-import-company-label",children:"Company"}),e.jsx("span",{className:"agent-import-company-name",children:w})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(pt,{size:14}),e.jsxs("span",{children:[T.length," agent",T.length!==1?"s":""," found"]})]}),T.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>I(T.map(l=>l.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>I([]),children:"Clear agents"})]}),T.length>0?e.jsx("div",{className:"agent-import-agent-list",children:T.map((l,x)=>e.jsxs("div",{className:"agent-import-agent-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select agent ${l.name}`,checked:p.includes(l.name),onChange:()=>Se(l.name)})}),e.jsx("span",{className:"agent-import-agent-icon",children:l.icon||"🤖"}),e.jsxs("div",{className:"agent-import-agent-details",children:[e.jsx("span",{className:"agent-import-agent-name",children:l.name}),e.jsxs("span",{className:"agent-import-agent-meta",children:[l.title&&e.jsxs("span",{className:"agent-import-agent-title",children:[l.title," · "]}),e.jsx("span",{className:"agent-import-agent-role",children:l.role}),l.reportsTo&&e.jsxs("span",{className:"agent-import-agent-reports",children:[" · reports to ",l.reportsTo]}),l.skills&&l.skills.length>0&&e.jsxs("span",{className:"agent-import-agent-model",children:[" · skills: ",l.skills.join(", ")]})]}),l.instructionsText&&e.jsxs("span",{className:"agent-import-agent-instructions",children:[l.instructionsText.slice(0,100),l.instructionsText.length>100?"...":""]})]})]},x))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),S.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(pt,{size:14}),e.jsxs("span",{children:[S.length," skill",S.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ee(S.map(l=>l.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ee([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:S.map((l,x)=>e.jsxs("div",{className:"agent-import-skill-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select skill ${l.name}`,checked:$.includes(l.name),onChange:()=>Ae(l.name)})}),e.jsx("span",{className:"agent-import-skill-icon",children:"⚡"}),e.jsxs("div",{className:"agent-import-skill-details",children:[e.jsx("span",{className:"agent-import-skill-name",children:l.name}),l.description&&e.jsx("span",{className:"agent-import-skill-description",children:l.description})]})]},`${l.name}-${x}`))})]}),ve&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(it,{size:14}),ve]})]}),g==="result"&&y&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(qe,{size:32})}),e.jsx("h3",{className:"agent-import-result-title",children:"Import Complete"}),e.jsxs("p",{className:"agent-import-result-company",children:["From ",e.jsx("strong",{children:y.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[y.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[y.created.length," created"]})}),y.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[y.skipped.length," skipped (already exist)"]})}),y.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[y.errors.length," error",y.errors.length!==1?"s":""]})})]}),y.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:y.created.map((l,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(qe,{size:12}),e.jsx("span",{children:l.name})]},x))}),y.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:y.errors.map((l,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(St,{size:12}),e.jsxs("span",{children:[l.name,": ",l.error]})]},x))}),y.skills&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-import-result-divider"}),e.jsx("h4",{className:"agent-import-result-section-title",children:"Skills"}),e.jsxs("div",{className:"agent-import-result-stats",children:[y.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[y.skills.imported.length," skill",y.skills.imported.length!==1?"s":""," imported"]})}),y.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[y.skills.skipped.length," skill",y.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),y.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[y.skills.errors.length," skill",y.skills.errors.length!==1?"s":""," error",y.skills.errors.length!==1?"s":""]})}),y.skills.imported.length===0&&y.skills.skipped.length===0&&y.skills.errors.length===0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsx("span",{children:"No skills in package"})})]}),y.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:y.skills.imported.map((l,x)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(qe,{size:12}),e.jsx("span",{children:l.name})]},x))}),y.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:y.skills.errors.map((l,x)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(St,{size:12}),e.jsxs("span",{children:[l.name,": ",l.error]})]},x))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[g==="preview"&&e.jsx("button",{className:"btn",onClick:()=>o("input"),disabled:te,children:"Back"}),e.jsx("button",{className:"btn",onClick:_e,disabled:te,children:g==="result"?"Close":"Cancel"}),g==="input"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void X(),disabled:Ne||(c==="directory"?E.length===0:c==="browse"?!G:!N.trim()),children:Ne?e.jsxs(e.Fragment,{children:[e.jsx(lt,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),g==="preview"&&e.jsx("button",{className:"btn btn-task-create",onClick:()=>void $e(),disabled:te||H===0&&F===0,children:te?e.jsxs(e.Fragment,{children:[e.jsx(lt,{size:14,className:"spin"}),Y]}):`Import ${Ce}`})]})]})}):null}const Dt=220,ta=24,sa=24,aa=16;function Ht(n){return n.children.length===0?1:n.children.reduce((i,f)=>i+Ht(f),0)}function na(n){const i=Ht(n);return i*Dt+Math.max(0,i-1)*ta}function la(n){if(n.length===0)return Dt;const f=n.map(na).reduce((d,g)=>d+g,0),u=Math.max(0,n.length-1)*sa;return f+u+aa*2}function ia(n){const i=Number.isFinite(n.availableWidth)&&n.availableWidth>0?n.availableWidth:0;return i===0||n.tree.length<=1?"horizontal":la(n.tree)>i?"vertical":"horizontal"}const It=a.lazy(()=>ks(()=>import("./AgentDetailView-gy_5SUj2.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])).then(n=>({default:n.AgentDetailView}))),Ze=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],mt=[.1,.25,.5,1,2,3,5,10],gt=[.75,1,1.25,1.5];function vt(n){switch(n){case"running":return"agent-badge--running";case"active":return"agent-badge--active";case"paused":return"agent-badge--paused";case"error":return"agent-badge--error";case"idle":default:return"agent-badge--idle"}}function bt(n,i){switch(i){case"running":return`${n}--running`;case"active":return`${n}--active`;case"paused":return`${n}--paused`;case"error":return`${n}--error`;case"idle":default:return`${n}--idle`}}function Je(n){return n.children.length===0?1:n.children.reduce((i,f)=>i+Je(f),0)}function jt(n,i){return n.state==="error"?{title:void 0,label:"Error"}:{title:i.reason??i.label,label:i.stateDerived?null:i.label}}function Ot({node:n,onSelect:i,getHealthStatus:f,getRoleIcon:u,selectedAgentId:d}){const{agent:g,children:o}=n,c=f(g),v=jt(g,c),N=vt(g.state),k=bt("org-chart-node-card",g.state),E=Je(n),C={"--org-chart-subtree-leaves":String(E)},w=o.length>0?Je(o[0]):1,P=o.length>0?Je(o[o.length-1]):1,T={"--org-chart-first-child-leaves":String(w),"--org-chart-last-child-leaves":String(P)};return e.jsxs("div",{className:`org-chart-node${o.length>0?" org-chart-node--has-children":""}`,style:C,children:[e.jsxs("div",{className:`${k}${d===g.id?" agent-card--selected":""}`,onClick:()=>i(g.id),role:"button",tabIndex:0,onKeyDown:M=>{(M.key==="Enter"||M.key===" ")&&(M.key===" "&&M.preventDefault(),i(g.id))},children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:e.jsx(Qe,{agent:g,size:20})}),e.jsx("span",{className:"org-chart-node__name",children:g.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${N}`,children:g.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:c.color},title:v.title,children:[c.icon,v.label&&e.jsx("span",{className:"text-secondary",children:v.label})]})]})]}),o.length>0&&e.jsx("div",{className:"org-chart-children",style:T,role:"group","aria-label":`${g.name} employees`,children:o.map(M=>e.jsx(Ot,{node:M,onSelect:i,getHealthStatus:f,getRoleIcon:u,selectedAgentId:d},M.agent.id))})]})}function ga({addToast:n,projectId:i,onOpenTaskLogs:f,agentOnboardingEnabled:u=!1}){const[d,g]=a.useState(!1),c=rs()==="mobile",[v,N]=a.useState("all"),{agents:k,stats:E,isLoading:C,loadAgents:w,refreshAgents:P}=os(i,{filterState:v,showSystemAgents:d}),[T,M]=a.useState(!1),[S,_]=a.useState(null),[p,I]=a.useState(!1),[$,ee]=a.useState(null),[Ne,oe]=a.useState(null),te=c&&!!$,[le,ce]=a.useState("dashboard"),[z,y]=a.useState(null),[xe,ve]=a.useState(!1),[A,se]=a.useState(()=>{if(typeof window>"u")return"list";const t=At("fn-agent-view",i);return t==="list"||t==="board"||t==="org"?t:"list"}),[de,ye]=a.useState([]),[ae,V]=a.useState(!1),[ue,G]=a.useState(0),[U,J]=a.useState(!1),[be,ie]=a.useState(!1),[W,Q]=a.useState(1),Ee=a.useRef(null),Me=a.useRef(null),{confirm:_e}=cs(),ke=a.useRef(null),me=a.useId();a.useEffect(()=>{const t=At("fn-agent-view",i);if(t==="list"||t==="board"||t==="org"){se(t);return}se("list")},[i]),a.useEffect(()=>{ds("fn-agent-view",A,i)},[A,i]);const[we,X]=a.useState(null),$e=a.useRef(null),[H,F]=a.useState(null),[re,K]=a.useState(null),[Ce,Y]=a.useState({}),[Se,Ae]=a.useState(1),[l,x]=a.useState(!1),[R,Z]=a.useState(new Set),[L,D]=a.useState(new Map),Te=a.useRef(!0);a.useEffect(()=>(Te.current=!0,()=>{Te.current=!1}),[]),a.useEffect(()=>{us(i).then(t=>{Te.current&&Ae(t.heartbeatMultiplier??1)}).catch(()=>{})},[i]);const Le=a.useCallback(async t=>{const r=Number.isFinite(t)&&t>0?t:1;Ae(r),x(!0);try{await ms({heartbeatMultiplier:r},i),n(`Heartbeat speed set to ×${r.toFixed(1)}`,"success")}catch(m){n(`Failed to save heartbeat multiplier: ${fe(m)}`,"error")}finally{Te.current&&x(!1)}},[i,n]),Fe=a.useMemo(()=>L.size===0?k:k.map(t=>{const r=L.get(t.id);return r?{...t,state:r}:t}),[k,L]),Ie=a.useMemo(()=>Fe.filter(t=>d||!rt(t)),[Fe,d]),Ye=a.useMemo(()=>Fe.filter(t=>t.state!=="active"&&t.state!=="running"?!1:d||!rt(t)),[Fe,d]),je=a.useMemo(()=>{if(d)return de;const t=r=>rt(r.agent)?null:{...r,children:r.children.map(t).filter(m=>m!==null)};return de.map(t).filter(r=>r!==null)},[de,d]);a.useEffect(()=>{if(A!=="org")return;const t=Me.current;if(!t)return;const r=()=>{G(t.clientWidth)};r();const m=typeof ResizeObserver<"u"?new ResizeObserver(r):null;return m?.observe(t),window.addEventListener("resize",r),()=>{m?.disconnect(),window.removeEventListener("resize",r)}},[A,je.length]),a.useEffect(()=>{if(A!=="org")return;let t=!1;return V(!0),gs(i,{includeEphemeral:d}).then(r=>{t||ye(r)}).catch(r=>{t||(n(`Failed to load org chart: ${fe(r)}`,"error"),ye([]))}).finally(()=>{t||V(!1)}),()=>{t=!0}},[A,i,d,n]),a.useEffect(()=>{const t=setInterval(()=>{w()},3e4);return()=>{clearInterval(t)}},[w]),a.useEffect(()=>{if(!U)return;const t=m=>{const j=m.target;j&&(Ee.current?.contains(j)||ke.current?.contains(j)||J(!1))},r=m=>{m.key==="Escape"&&(J(!1),ke.current?.focus())};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",r),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",r)}},[U]);const ge=async(t,r)=>{if(!R.has(t)){Z(m=>new Set(m).add(t)),D(m=>{const j=new Map(m);return j.set(t,r),j});try{await Ss(t,r,i),n(`Agent state updated to ${r}`,"success"),await w(),D(m=>{const j=new Map(m);return j.delete(t),j})}catch(m){D(j=>{const O=new Map(j);return O.delete(t),O}),n(`Failed to update state: ${fe(m)}`,"error")}finally{Z(m=>{const j=new Set(m);return j.delete(t),j})}}},et=async(t,r)=>{if(await _e({title:"Delete Agent",message:`Delete agent "${r}"? This cannot be undone.`,danger:!0}))try{await Ts(t,i),n(`Agent "${r}" deleted`,"success"),await w()}catch(j){n(`Failed to delete agent: ${fe(j)}`,"error")}},Ve=async(t,r)=>{const m=k.find(j=>j.id===t);if(m){if(m.role===r){X(null);return}try{await Ke(t,{role:r},i),n(`Agent role updated to ${Ze.find(j=>j.value===r)?.label??r}`,"success"),X(null),w()}catch(j){n(`Failed to update role: ${fe(j)}`,"error")}}},Pe=(t,r)=>{t.key==="Escape"&&X(null)},He=async(t,r)=>{re===t.id&&(K(null),Y(m=>{const j={...m};return delete j[t.id],j})),F(t.id);try{await Ke(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:r}},i),n(`Heartbeat interval updated to ${Rt(r)} for ${t.name}`,"success"),w()}catch(m){n(`Failed to update heartbeat interval: ${fe(m)}`,"error")}finally{F(null)}},Oe=async t=>{const r=Ce[t.id]??"";if(r.trim()===""){n("Please enter a heartbeat interval in minutes","error");return}const m=Number(r);if(isNaN(m)){n("Heartbeat interval must be a valid number","error");return}if(m<=0){n("Heartbeat interval must be greater than 0","error");return}if(m>=1&&m<5){F(t.id);try{await Ke(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:Cs}},i),n(`Heartbeat interval set to 5 minutes (minimum). ${m} minute${m!==1?"s":""} was below the 5-minute minimum.`,"success"),K(null),Y(O=>{const q={...O};return delete q[t.id],q}),w()}catch(O){n(`Failed to update heartbeat interval: ${fe(O)}`,"error")}finally{F(null)}return}const j=Math.round(m*6e4);F(t.id);try{await Ke(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:j}},i),n(`Heartbeat interval updated to ${Rt(j)} for ${t.name}`,"success"),K(null),Y(O=>{const q={...O};return delete q[t.id],q}),w()}catch(O){n(`Failed to update heartbeat interval: ${fe(O)}`,"error")}finally{F(null)}},Ue=t=>{const r=ht(t.runtimeConfig?.heartbeatIntervalMs),m=Math.round(r/6e4);K(t.id),Y(j=>({...j,[t.id]:String(m)}))},s=a.useCallback((t,r)=>{ee(t),ce(r?.initialTab??"dashboard"),y(r?.initialRunId??null),ve(r?.preferActiveRun??!1)},[]),b=a.useCallback(()=>{ee(null),ce("dashboard"),y(null),ve(!1)},[]),he=a.useCallback(t=>{s(t)},[s]),ne=a.useCallback(t=>{oe(t),s(t)},[s]),Re=a.useCallback(async({agentId:t,deleted:r})=>{await P(),r&&$===t&&b()},[P,$,b]),Bt=a.useCallback(t=>{s(t),c&&ie(!1)},[c,s]),Gt=async(t,r)=>{D(m=>{const j=new Map(m);return j.set(t,"running"),j});try{await As(t,i,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),n(`Heartbeat run started for ${r}`,"success"),await w(),D(m=>{const j=new Map(m);return j.delete(t),j})}catch(m){D(j=>{const O=new Map(j);return O.delete(t),O}),n(`Failed to start heartbeat run: ${fe(m)}`,"error")}},tt=a.useCallback(t=>{se(t),t!=="org"&&Q(1),c&&$&&b()},[b,c,$]),ft=t=>Ze.find(r=>r.value===t)?.label??t,Vt=t=>Ze.find(r=>r.value===t)?.icon??"◆",Nt=gt[W],yt=a.useMemo(()=>ia({tree:je,availableWidth:ue}),[je,ue]),Ut=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],st=t=>ws(t),kt=C&&k.length===0,We=a.useCallback(()=>{M(!0)},[]);return e.jsxs("div",{className:"agents-view",children:[e.jsxs("div",{className:"agents-view-header",children:[e.jsxs("div",{className:"agents-view-title",children:[e.jsx(xt,{size:24}),e.jsx("h2",{children:"Agents"})]}),e.jsxs("div",{className:"agents-view-controls",children:[e.jsxs("div",{className:"view-toggle",children:[e.jsx("button",{className:`view-toggle-btn${A==="list"?" active":""}`,onClick:()=>tt("list"),title:"List view","aria-label":"List view","aria-pressed":A==="list",children:e.jsx(hs,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="board"?" active":""}`,onClick:()=>tt("board"),title:"Board view","aria-label":"Board view","aria-pressed":A==="board",children:e.jsx(De,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="org"?" active":""}`,onClick:()=>tt("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":A==="org",children:e.jsx(ps,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:ke,className:`btn-icon agent-controls-trigger${U?" agent-controls-trigger--active":""}`,onClick:()=>J(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":U,"aria-controls":me,children:e.jsx(zs,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void w(),title:"Refresh","aria-label":"Refresh",children:e.jsx(Ge,{size:16,className:C?"spin":void 0})}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>{I(!0),J(!1)},"aria-label":"Import",title:"Import",children:[e.jsx(zt,{size:16}),"Import"]}),e.jsxs("button",{className:"btn btn-task-create btn-sm",onClick:()=>{We(),J(!1)},"aria-label":"New Agent",title:"New Agent",children:[e.jsx(xs,{size:16}),"New Agent"]})]})]})]}),U&&e.jsxs("div",{ref:Ee,id:me,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsx("div",{className:"agent-controls",children:e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(vs,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:v,onChange:t=>N(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:d,onChange:t=>g(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]})}),e.jsx("div",{className:"agent-global-controls agent-controls-actions",children:e.jsxs("div",{className:"heartbeat-multiplier-group",children:[e.jsxs("div",{className:"heartbeat-multiplier-controls",children:[e.jsx("label",{htmlFor:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-label",children:"Heartbeat Speed"}),e.jsx("input",{id:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-slider touch-target",type:"range",min:.1,max:10,step:.1,value:Se,onChange:t=>{const r=Number(t.target.value);Le(Number.isFinite(r)&&r>0?r:1)},disabled:l}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",Se.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(mt.reduce((t,r)=>Math.abs(r-Se)<Math.abs(t-Se)?r:t,mt[0])),onChange:t=>{const r=Number(t.target.value);Le(Number.isFinite(r)&&r>0?r:1)},disabled:l,"aria-label":"Heartbeat speed preset",children:mt.map(t=>e.jsxs("option",{value:String(t),children:["×",t]},t))})]}),e.jsx("small",{className:"text-secondary",children:"Scales all agent heartbeat intervals. ×0.5 = twice as fast, ×2.0 = twice as slow. Default: ×1.0"})]})}),e.jsx(Gs,{agents:Ie})]}),e.jsx(Xs,{isOpen:T,onClose:()=>{M(!1),_(null)},onCreated:()=>{M(!1),_(null),w()},projectId:i,prefillDraft:S,agentOnboardingEnabled:u,existingAgents:k,onPrefillDraft:_}),e.jsx(ea,{isOpen:p,onClose:()=>I(!1),onImported:()=>void w(),projectId:i}),e.jsx(Js,{stats:E,activeAgents:Ye,projectId:i,isOpen:be,onToggle:()=>ie(t=>!t),onSelectAgent:Bt,onOpenTaskLogs:f}),A==="org"?e.jsx("div",{className:"agents-org-full-view",children:e.jsx("div",{className:"agents-view-content agents-view-content--org-full",children:$?e.jsxs("div",{className:"agents-org-detail-view","data-testid":"agents-org-detail-view",children:[e.jsx("button",{type:"button",className:"btn btn-sm agents-org-detail-back",onClick:b,"aria-label":"Back to org chart",children:"Back to org chart"}),e.jsx(a.Suspense,{fallback:null,children:e.jsx(It,{inline:!0,showInlineBackButton:!1,agentId:$,projectId:i,onClose:b,addToast:n,onChildClick:he,initialTab:le,initialRunId:z,preferActiveRun:xe},$)})]}):kt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ge,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):e.jsxs("div",{className:"agent-org-chart-shell","data-testid":"agent-org-chart-shell",children:[c?e.jsxs("div",{className:"agent-org-chart-controls","data-testid":"agent-org-chart-controls",children:[e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>Q(t=>Math.max(0,t-1)),disabled:W===0,"aria-label":"Zoom out org chart",title:"Zoom out",children:e.jsx(Bs,{size:16})}),e.jsxs("span",{className:"agent-org-chart-controls__zoom-label","aria-live":"polite",children:[Math.round(Nt*100),"%"]}),e.jsx("button",{type:"button",className:"btn-icon touch-target",onClick:()=>Q(t=>Math.min(gt.length-1,t+1)),disabled:W===gt.length-1,"aria-label":"Zoom in org chart",title:"Zoom in",children:e.jsx(Hs,{size:16})}),e.jsxs("button",{type:"button",className:"btn touch-target btn-sm agent-org-chart-controls__fit-btn",onClick:()=>Q(1),"aria-label":"Fit org chart",title:"Fit org chart",children:[e.jsx(bs,{size:16}),"Fit"]})]}):null,e.jsx("div",{ref:Me,className:"agent-org-chart-viewport","data-testid":"agent-org-chart-viewport",children:e.jsx("div",{className:`agent-org-chart-canvas agent-org-chart-canvas--zoom-${Math.round(Nt*100)}`,children:e.jsx("div",{className:`agent-org-chart${yt==="vertical"?" agent-org-chart--vertical":""}`,"data-testid":"agent-org-chart","data-layout-mode":yt,children:ae?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx(Ge,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):je.length===0?e.jsx(dt,{onCtaClick:We}):je.map(t=>e.jsx(Ot,{node:t,onSelect:ne,getHealthStatus:st,getRoleIcon:Vt,selectedAgentId:Ne},t.agent.id))})})})]})})}):e.jsxs("div",{className:"agents-split-layout",children:[e.jsx("div",{className:`agents-split-sidebar${te?" agents-split-sidebar--hidden-mobile":""}`,children:e.jsx("div",{className:"agents-view-content",children:kt?e.jsxs("div",{className:"agents-view-loading",role:"status","aria-live":"polite",children:[e.jsx(Ge,{size:18,className:"spin"}),e.jsx("span",{children:"Loading agents..."})]}):A==="board"?e.jsx("div",{className:"agent-board",children:Ie.length===0?e.jsx(dt,{onCtaClick:We}):Ie.map(t=>{const r=st(t),m=jt(t,r),j=vt(t.state),O=bt("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${O}${$===t.id?" agent-card--selected":""}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>s(t.id),role:"button",tabIndex:0,onKeyDown:q=>{(q.key==="Enter"||q.key===" ")&&(q.key===" "&&q.preventDefault(),s(t.id))},children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:e.jsx(Qe,{agent:t,size:20})}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:ft(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${j}`,children:t.state}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"agent-board-badge badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:r.color},title:m.title,children:[r.icon,m.label?` ${m.label}`:""]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:Ie.length===0?e.jsx(dt,{onCtaClick:We}):Ie.map(t=>{const r=st(t),m=jt(t,r),j=vt(t.state),O=bt("agent-card",t.state),q=ht(t.runtimeConfig?.heartbeatIntervalMs),Wt=js(q),Be=H===t.id;return e.jsxs("div",{className:`agent-card agent-card--clickable ${O}${$===t.id?" agent-card--selected":""}`,onClick:h=>{const B=h.target;if(B===h.currentTarget){s(t.id);return}const pe=B.closest('button, select, input, [role="button"]');pe&&pe!==h.currentTarget||s(t.id)},role:"button",tabIndex:0,onKeyDown:h=>{h.target===h.currentTarget&&(h.key==="Enter"||h.key===" ")&&(h.key===" "&&h.preventDefault(),s(t.id))},"aria-label":`Open details for ${t.name}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info",children:[we===t.id?e.jsx("select",{ref:$e,className:"select agent-role-select",value:t.role,onChange:h=>void Ve(t.id,h.target.value),onKeyDown:h=>Pe(h,t.id),onBlur:()=>X(null),autoFocus:!0,children:Ze.map(h=>e.jsxs("option",{value:h.value,children:[h.icon," ",h.label]},h.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:h=>{h.stopPropagation(),X(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.stopPropagation(),X(t.id))},children:e.jsx(Qe,{agent:t,size:20})}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(Ft,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${j}`,children:t.state}),e.jsxs("span",{className:"badge",style:{color:r.color},title:m.title,children:[r.icon,m.label?` ${m.label}`:""]}),e.jsx("span",{className:"badge text-secondary",children:ft(t.role)}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"badge agent-approval-badge",title:"Pending approvals",children:[e.jsx("span",{className:"status-dot status-dot--pending"}),t.pendingApprovalCount]}):null,(()=>{const h=Ut(t);if(h.length===0)return null;const B=h.slice(0,2),pe=h.length-2;return e.jsxs(e.Fragment,{children:[B.map(at=>e.jsx("span",{className:"badge badge-skill",title:at,children:$s(at)},at)),pe>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",pe]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.state==="error"&&t.lastError?e.jsx(fs,{errorText:t.lastError,issueContext:{surface:"AgentsView list",agentId:t.id,agentName:t.name,agentState:t.state,taskId:t.taskId}}):null,t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),re===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:Ce[t.id]??"",onChange:h=>Y(B=>({...B,[t.id]:h.target.value})),onKeyDown:h=>{h.key==="Enter"?Oe(t):h.key==="Escape"&&(K(null),Y(B=>{const pe={...B};return delete pe[t.id],pe}))},disabled:Be,"aria-label":`Custom heartbeat interval in minutes for ${t.name}`}),e.jsx("span",{className:"text-secondary",children:"min"}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void Oe(t),disabled:Be,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn-sm",onClick:()=>{K(null),Y(h=>{const B={...h};return delete B[t.id],B})},disabled:Be,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:q,onChange:h=>{const B=h.target.value;B==="__custom__"?Ue(t):He(t,Number(B))},disabled:Be,"aria-label":`Set heartbeat interval for ${t.name}`,children:[Wt.map(h=>e.jsx("option",{value:h.value,children:h.label},h.value)),Ns.some(h=>h.value===q)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),Be&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const h=new Date(t.lastHeartbeatAt),B=new Date(h.getTime()+q),pe=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:h.toLocaleString(),children:["Last: ",h.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]}),pe&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:B.toLocaleString(),children:["Next: ",B.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[t.state==="idle"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"active"),disabled:R.has(t.id),title:"Activate",children:[e.jsx(ot,{size:14})," Start"]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>void Gt(t.id,t.name),disabled:R.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(De,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"paused"),disabled:R.has(t.id),title:"Pause",children:[e.jsx(Tt,{size:14})," Pause"]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"active"),disabled:R.has(t.id),title:"Resume",children:[e.jsx(ot,{size:14})," Resume"]}),t.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-sm",onClick:()=>s(t.id,{initialTab:"runs",initialRunId:null,preferActiveRun:!0}),title:"View live run details","aria-label":`View live run details for ${t.name}`,children:[e.jsx(De,{size:14})," Running"]}),e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"paused"),disabled:R.has(t.id),title:"Pause",children:[e.jsx(Tt,{size:14})," Pause"]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn-sm",onClick:()=>void ge(t.id,"active"),disabled:R.has(t.id),title:"Retry",children:[e.jsx(ot,{size:14})," Retry"]}),e.jsx("button",{className:"btn btn-sm agent-card-details-btn",onClick:()=>s(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:"Details"}),(t.state==="idle"||t.state==="paused")&&e.jsxs("button",{className:"btn btn-sm btn-danger",onClick:()=>void et(t.id,t.name),title:"Delete",children:[e.jsx(ys,{size:14})," Delete"]})]})]},t.id)})})})}),e.jsx("div",{className:`agents-split-detail${c&&!$?" agents-split-detail--hidden-mobile":""}`,children:$?e.jsx(a.Suspense,{fallback:null,children:e.jsx(It,{inline:!0,showInlineBackButton:c,agentId:$,projectId:i,onClose:b,addToast:n,onChildClick:he,initialTab:le,initialRunId:z,preferActiveRun:xe,onMutationSuccess:Re},$)}):e.jsxs("div",{className:"agents-detail-empty-state",children:[e.jsx(xt,{size:48}),e.jsx("h3",{children:"Select an agent"}),e.jsx("p",{children:"Choose an agent from the sidebar to view details"})]})})]})]})}export{ga as AgentsView};
@@ -1 +1 @@
1
- .agent-token-stats-panel{margin-bottom:var(--space-lg);padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);box-shadow:var(--shadow-sm)}.agent-token-stats-panel__header{margin-bottom:var(--space-md)}.agent-token-stats-panel__title{margin:0;font-size:calc(var(--space-md) + var(--space-xs));font-weight:600;color:var(--text)}.agent-token-stats-panel__totals{display:grid;grid-template-columns:repeat(auto-fit,minmax(calc(var(--space-2xl) * 4),1fr));gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-token-stats-panel__total-card{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.agent-token-stats-panel__total-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));text-transform:uppercase;letter-spacing:calc(var(--space-xs) / 8)}.agent-token-stats-panel__total-value{color:var(--text);font-size:calc(var(--space-lg) + var(--space-xs));line-height:1.2;font-family:var(--font-mono);font-weight:700}.agent-token-stats-panel__table-wrapper{overflow-x:auto}.agent-token-stats-panel__table{width:100%;border-collapse:collapse}.agent-token-stats-panel__table th,.agent-token-stats-panel__table td{padding:var(--space-sm);border-bottom:1px solid var(--border);color:var(--text);text-align:right;font-size:calc(var(--space-sm) + var(--space-xs))}.agent-token-stats-panel__table thead th{text-transform:uppercase;letter-spacing:calc(var(--space-xs) / 8);color:var(--text-muted);font-weight:600}.agent-token-stats-panel__table th:first-child,.agent-token-stats-panel__table td:first-child{text-align:left}.agent-token-stats-panel__agent-cell{display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5)}.agent-token-stats-panel__agent-name{color:var(--text)}.agent-token-stats-panel__agent-id{color:var(--text-muted);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-transform:none;letter-spacing:normal}.agent-token-stats-panel__total-cell{font-family:var(--font-mono);font-weight:700}.agent-token-stats-panel__empty{padding:var(--space-md);border:1px dashed var(--border);border-radius:var(--radius-sm);color:var(--text-muted);background:color-mix(in srgb,var(--surface) 85%,transparent);font-size:calc(var(--space-sm) + var(--space-xs))}@media(max-width:768px){.agent-token-stats-panel{padding:var(--space-sm)}.agent-token-stats-panel__totals{grid-template-columns:1fr}.agent-token-stats-panel__table th,.agent-token-stats-panel__table td{padding:var(--space-xs) var(--space-sm)}}.active-agents-panel{margin-top:var(--space-xl);margin-bottom:var(--space-lg)}.active-agents-panel-header{display:flex;align-items:center;gap:var(--space-sm);font-size:13px;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-md)}.active-agents-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:var(--space-md)}.live-agent-card{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:background .15s,border-color .15s}.live-agent-card:hover{background:var(--bg-hover);border-color:var(--border-strong, var(--border))}.live-agent-card:focus-visible{outline:2px solid var(--accent, var(--color-primary));outline-offset:2px}.live-agent-card-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.live-agent-card-name{display:flex;align-items:center;gap:var(--space-sm);font-weight:600;font-size:13px}.live-agent-task{font-family:var(--font-mono)}.live-agent-card-transcript{font-family:var(--font-mono);font-size:11px;line-height:1.5;color:var(--text-muted);max-height:120px;overflow-y:auto}.live-agent-card-empty{display:flex;flex-direction:column;gap:var(--space-xs)}.live-agent-card-status{font-style:normal;font-weight:500;color:var(--text-primary);opacity:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-status-sub{font-style:italic;opacity:.6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-footer{display:flex;align-items:center;justify-content:space-between;font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding-top:var(--space-sm);border-top:1px solid var(--border)}.live-agent-streaming-dot{color:var(--color-success);animation:pulse 1.5s infinite}.live-agent-card-footer-actions{display:flex;align-items:center;gap:var(--space-sm)}.live-agent-card-footer-meta{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap;min-width:0}.live-agent-card-next-heartbeat{color:var(--text-muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-logs-btn{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);font-size:11px;color:var(--text-secondary);background:transparent;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background .15s,color .15s,border-color .15s}.live-agent-card-logs-btn:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-strong, var(--border))}@media(max-width:768px){.active-agents-grid{grid-template-columns:1fr}.live-agent-card{min-width:0;overflow:hidden}}.agents-overview-bar{border-bottom:1px solid var(--border);background:var(--surface);padding:var(--space-md) var(--space-lg);display:flex;flex-direction:column;gap:var(--space-sm)}.agents-overview-bar__toggle{width:100%;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text);padding:var(--space-sm) var(--space-md);display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast)}.agents-overview-bar__toggle:hover{background:var(--card-hover)}.agents-overview-bar__toggle:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.agents-overview-bar__title-wrap{display:inline-flex;align-items:center;gap:var(--space-xs)}.agents-overview-bar__title{font-weight:600}.agents-overview-bar__meta{font-size:calc(var(--space-sm) + var(--space-xs))}.agents-overview-bar__content{display:flex;flex-direction:column;gap:var(--space-md)}.agents-overview-bar__metrics{margin-bottom:0}.agents-overview-bar__active-panel{margin-top:0;margin-bottom:0}@media(max-width:768px){.agents-overview-bar{padding:var(--space-sm) var(--space-md)}.agents-overview-bar__toggle{min-height:calc(var(--space-2xl) + var(--space-sm))}}.agent-dialog-overlay{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(var(--space-xs));display:flex;align-items:center;justify-content:center;z-index:100;padding:calc(var(--space-lg) + var(--space-xs))}.agent-dialog{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;max-width:calc(var(--space-xl) * 21 + var(--space-md));max-height:calc(100vh - (var(--space-xl) + var(--space-lg)));max-height:calc(100dvh - (var(--space-xl) + var(--space-lg)));display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-lg)}.agent-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-lg) calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border)}.agent-dialog-header-title{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .75)}.agent-dialog-body{flex:1;overflow-y:auto;padding:calc(var(--space-lg) + var(--space-xs))}.agent-dialog-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-sm);padding:var(--space-lg) calc(var(--space-lg) + var(--space-xs));border-top:1px solid var(--border)}.agent-dialog-steps{display:flex;gap:calc(var(--space-sm) - var(--space-xs) * .5);padding:var(--space-md) calc(var(--space-lg) + var(--space-xs));justify-content:center}.agent-dialog-step{width:calc(var(--space-2xl) + var(--space-sm));height:var(--space-xs);border-radius:calc(var(--space-xs) * .5);background:var(--border);transition:background var(--transition-fast)}.agent-dialog-step.active{background:var(--todo)}.agent-dialog-step.completed{background:var(--color-success)}.agent-dialog-field{margin-bottom:var(--space-lg)}.agent-dialog-field label{display:block;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500;margin-bottom:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-dialog-field .input,.agent-dialog-field .select{width:100%;box-sizing:border-box}.agent-dialog-field--title .input{font-size:calc(var(--space-md) + var(--space-xs) * .25);line-height:var(--space-lg)}.agent-dialog-section{margin-bottom:var(--space-lg)}.agent-dialog-section-header{font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);margin-bottom:var(--space-md);padding-bottom:var(--space-xs);border-bottom:1px solid var(--border)}.agent-dialog-step-zero-actions{display:flex;justify-content:flex-end;margin-bottom:var(--space-sm)}.agent-dialog-interview-btn{font-weight:600}.agent-dialog-interview-btn:disabled{opacity:.7;cursor:not-allowed}.agent-dialog-tabs{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-sm);margin-bottom:var(--space-lg)}.agent-dialog-tab{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);padding:var(--space-sm) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.agent-dialog-tab:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.agent-dialog-tab:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-dialog-tab.active{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-dialog-tab-panel{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-runtime-mode-toggle{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.agent-runtime-mode-option{position:relative;margin:0}.agent-runtime-mode-option input{position:absolute;opacity:0;pointer-events:none}.agent-runtime-mode-option span{display:flex;align-items:center;justify-content:center;min-height:calc(var(--space-xl) + var(--space-lg));border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;padding:var(--space-sm) var(--space-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.agent-runtime-mode-option span:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.agent-runtime-mode-option input:focus-visible+span{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-runtime-mode-option--active span{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-role-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 3 + var(--space-sm)),1fr));gap:var(--space-sm)}.agent-role-option{display:flex;flex-direction:column;align-items:center;padding:var(--space-md) var(--space-sm);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast);font-family:var(--font-primary);color:var(--text)}.agent-role-option:hover{border-color:var(--text-muted);background:var(--card-hover)}.agent-role-option:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-role-option.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent);box-shadow:var(--focus-ring)}.agent-role-option-icon{font-size:calc(var(--space-lg) + var(--space-xs));line-height:1}.agent-role-option-label{font-size:calc(var(--space-sm) + var(--space-xs));margin-top:var(--space-xs)}.agent-dialog-icon-prefix{margin-right:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-dialog-ai-generate{margin-top:var(--space-sm);border-top:1px solid var(--border);padding-top:var(--space-md)}.btn--ai-generate{width:100%;display:flex;align-items:center;justify-content:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);background:var(--cta-bg, var(--todo));color:var(--cta-text, var(--text));font-weight:600;border:1px solid transparent}.btn--ai-generate:hover{opacity:.9;filter:brightness(1.1)}.agent-dialog-ai-hint{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-align:center;margin:calc(var(--space-sm) - var(--space-xs) * .5) 0 0}.agent-dialog-summary{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-dialog-summary-row{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;border-bottom:1px solid color-mix(in srgb,var(--border) 50%,transparent)}.agent-dialog-summary-row:last-child{border-bottom:none}.agent-dialog-summary-row-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-dialog-summary-row-label--fixed{flex:0 0 calc(var(--space-xl) * 4 - var(--space-xs) * 1.5)}.agent-dialog-summary-row-value{font-weight:600}.agent-dialog-summary-row-value--body{font-weight:400}.agent-dialog-summary--spaced{margin-bottom:var(--space-md)}.agent-dialog-summary-row-value--muted{font-style:italic;color:var(--text-muted)}.agent-dialog-summary-row-value--capitalize{text-transform:capitalize}.agent-dialog-summary-row--editable{flex-direction:column;align-items:stretch;gap:var(--space-xs)}.agent-dialog-summary-row--editable .agent-dialog-summary-row-label{margin-bottom:0}.agent-dialog-summary-row--title .input{font-size:calc(var(--space-md) + var(--space-xs) * .25);line-height:var(--space-lg)}.agent-presets{margin-bottom:var(--space-lg)}.agent-presets-header{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:600;color:var(--text-muted);margin-bottom:var(--space-md);display:flex;align-items:center;gap:var(--space-sm)}.agent-presets-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 5 + var(--space-lg) + var(--space-xs)),1fr));gap:var(--space-sm);margin-bottom:var(--space-lg);max-height:calc(var(--space-xl) * 16 + var(--space-lg));overflow-y:auto}.agent-preset-card{display:flex;flex-direction:column;align-items:center;padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),box-shadow var(--transition-fast),transform var(--transition-fast);background:var(--bg-secondary);font-family:var(--font-primary);color:var(--text)}.agent-preset-card:hover{border-color:var(--todo);background:var(--bg-tertiary)}.agent-preset-card:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-preset-card.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-preset-icon{font-size:var(--space-xl);margin-bottom:var(--space-xs)}.agent-preset-name{font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500;text-align:center;margin-bottom:var(--space-xs)}.agent-preset-role{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);text-transform:capitalize}.agent-preset-description{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-top:calc(var(--space-xs) * .5)}.agent-dialog-header-sparkle{margin-right:var(--space-sm)}.agent-dialog-error-banner{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25);padding:var(--space-sm) var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border-radius:var(--radius-md);margin-bottom:var(--space-md)}.agent-dialog-textarea{resize:vertical}.agent-dialog-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);margin-top:var(--space-xs);display:flex;justify-content:space-between;gap:var(--space-sm)}.agent-dialog-loading-center{display:flex;flex-direction:column;align-items:center;padding:var(--space-2xl) var(--space-lg);gap:var(--space-md)}.agent-dialog-spinner{width:var(--space-2xl);height:var(--space-2xl);border:calc(var(--space-xs) * .75) solid var(--border);border-top-color:var(--todo);border-radius:50%}.agent-dialog-loading-text{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin:0}.agent-dialog-expand-btn{background:none;border:none;color:var(--todo);cursor:pointer;font-size:calc(var(--space-sm) + var(--space-xs));margin-left:var(--space-sm);padding:0}.agent-dialog-expand-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.agent-generation-prompt-box{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-family:var(--font-mono);line-height:1.5;white-space:pre-wrap;word-break:break-word;overflow:auto;position:relative}.agent-generation-prompt-box--collapsed{max-height:calc(var(--space-xl) * 6 + var(--space-sm) + var(--space-xs) * .5);overflow:hidden}.agent-generation-prompt-fade{position:absolute;bottom:0;left:0;right:0;height:calc(var(--space-lg) + var(--space-xl));background:linear-gradient(transparent,var(--bg-secondary));pointer-events:none}.agent-dialog-required{color:var(--color-error)}.agent-dialog-optional{color:var(--text-muted);font-weight:400}.agent-dialog-error{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin-top:var(--space-md)}.agent-dialog-info{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin-top:0;margin-bottom:var(--space-md)}.agent-dialog-loading{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);padding:var(--space-sm) 0}.agent-dialog-field-hint{margin-top:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}@media(max-width:768px){.agent-dialog-overlay{padding:0;align-items:stretch;justify-content:stretch}.agent-dialog{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border-radius:0;border-left:0;border-right:0}.agent-dialog-header{padding:calc(var(--space-md) + env(safe-area-inset-top)) var(--space-md) var(--space-md)}.agent-dialog-footer{padding:var(--space-md) var(--space-md) calc(var(--space-md) + env(safe-area-inset-bottom))}.agent-dialog-steps{padding:var(--space-sm) var(--space-md);overflow-x:auto;flex-wrap:nowrap;flex-shrink:0}.agent-dialog-header,.agent-dialog-footer{flex-shrink:0}.agent-dialog-body{padding:var(--space-md);flex:1 1 auto;min-height:0;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.agent-dialog-summary-row--editable .input{min-height:calc(var(--space-lg) + var(--space-xl))}.agent-dialog-footer{flex-wrap:wrap;gap:var(--space-xs)}.agent-dialog-footer>.btn{flex:1 1 auto;min-width:0}.agent-dialog-step-zero-actions{justify-content:stretch}.agent-dialog-interview-btn{width:100%}}.experimental-agent-onboarding-modal__textarea{min-height:calc(var(--space-2xl) * 4)}.experimental-agent-onboarding-modal__summary{display:flex;flex-direction:column;gap:var(--space-lg);padding:var(--space-lg)}.experimental-agent-onboarding-modal__summary-section{display:flex;flex-direction:column;gap:var(--space-sm)}.experimental-agent-onboarding-modal__summary-section h4{margin:0;color:var(--text);font-size:calc(var(--space-md) + var(--space-xs) * .25)}.experimental-agent-onboarding-modal__summary-section p{margin:0;color:var(--text-muted)}.experimental-agent-onboarding-modal__summary-block{white-space:pre-wrap}@media(max-width:768px){.experimental-agent-onboarding-modal__textarea{min-height:calc(var(--space-2xl) * 3)}.experimental-agent-onboarding-modal__summary{gap:var(--space-md);padding:var(--space-md)}}.agent-import-skills-section{margin-top:var(--space-lg)}.agent-import-skill-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-2xl) * 6);overflow-y:auto}.agent-import-skill-item{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);background:var(--surface);border:1px solid var(--border)}.agent-import-skill-icon{flex-shrink:0}.agent-import-skill-details{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.agent-import-skill-name{font-weight:500;color:var(--text)}.agent-import-skill-description{color:var(--text-muted)}.agent-import-empty{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);text-align:center;padding:var(--space-lg)}.agent-import-result{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-sm)}.agent-import-result-icon{color:var(--color-success);margin-bottom:var(--space-xs)}.agent-import-result-title{margin:0;font-size:calc(var(--space-md) + var(--space-xs));font-weight:600}.agent-import-result-company{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin:0 0 var(--space-md) 0}.agent-import-result-stats{display:flex;gap:var(--space-lg);margin-bottom:var(--space-md);padding:var(--space-md);background:var(--bg-secondary);border-radius:var(--radius-md)}.agent-import-result-stat{display:flex;align-items:center;gap:var(--space-sm);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);padding:var(--space-xs) var(--space-sm)}.agent-import-result-stat--success{color:var(--color-success)}.agent-import-result-stat--skipped{color:var(--color-warning)}.agent-import-result-stat--error{color:var(--color-error)}.agent-import-result-stat--success:before,.agent-import-result-stat--skipped:before,.agent-import-result-stat--error:before{content:"";width:var(--space-sm);height:var(--space-sm);border-radius:50%;flex-shrink:0}.agent-import-result-stat--success:before{background:var(--color-success)}.agent-import-result-stat--skipped:before{background:var(--color-warning)}.agent-import-result-stat--error:before{background:var(--color-error)}.agent-import-result-agents{display:flex;flex-direction:column;gap:var(--space-xs);width:100%;text-align:left}.agent-import-result-agent{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);color:var(--color-success);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--color-success) 8%,transparent);border-radius:var(--radius-sm)}.agent-import-result-errors{display:flex;flex-direction:column;gap:var(--space-xs);width:100%;text-align:left;margin-top:var(--space-sm)}.agent-import-result-error{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--color-error);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--color-error) 8%,transparent);border-radius:var(--radius-sm)}.agent-import-result-divider{align-self:stretch;height:1px;background:var(--border);margin:var(--space-md) 0}.agent-import-result-section-title{font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;margin:0 0 var(--space-sm) 0}.agent-import-browse{margin-bottom:var(--space-md)}.agent-import-browse-header{display:flex;flex-direction:column;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-browse-search{position:relative;display:flex;align-items:center}.agent-import-browse-search-icon{position:absolute;left:var(--space-sm);color:var(--text-muted);pointer-events:none}.agent-import-browse-search-input{width:100%;padding:var(--space-sm) var(--space-sm) var(--space-sm) calc(var(--space-sm) + var(--space-lg));border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-import-browse-search-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.agent-import-browse-selected{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);background:color-mix(in srgb,var(--todo) 10%,transparent);border:1px solid color-mix(in srgb,var(--todo) 30%,transparent);border-radius:var(--radius-md)}.agent-import-browse-selected-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-browse-selected-name{flex:1;font-weight:500;color:var(--todo)}.agent-import-browse-loading{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl) 0;color:var(--text-muted)}.agent-import-browse-error{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 8%,transparent);border-radius:var(--radius-md);color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25)}.agent-import-browse-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);background:var(--surface)}.agent-import-browse-item{display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5);padding:var(--space-sm);cursor:pointer;border-bottom:1px solid var(--border);transition:background-color var(--transition-fast)}.agent-import-browse-item:last-child{border-bottom:none}.agent-import-browse-item:hover{background:var(--surface-hover)}.agent-import-browse-item:focus-visible{outline:none;background:var(--surface-hover);box-shadow:var(--focus-ring)}.agent-import-browse-item--selected{background:color-mix(in srgb,var(--todo) 10%,transparent);border-color:var(--todo)}.agent-import-browse-item-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-import-browse-item-name{font-weight:500;color:var(--text)}.agent-import-browse-item-installs{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);white-space:nowrap}.agent-import-browse-item-tagline{font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted);line-height:1.4}.agent-import-browse-item-repo{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-family:var(--font-mono)}.agent-import-browse-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25)}.agent-controls-actions{display:flex;gap:var(--space-sm)}.agent-global-controls{display:flex;align-items:center;padding:var(--space-md) var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-lg)}.heartbeat-multiplier-label{font-weight:500;color:var(--text);white-space:nowrap}.agent-import-dialog{max-width:calc(var(--space-xl) * 23 + var(--space-sm))}.agent-import-description{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);margin:0 0 var(--space-md) 0;line-height:1.5}.agent-import-description code{background:var(--surface-hover);padding:calc(var(--space-xs) * .25) var(--space-xs);border-radius:calc(var(--radius-sm) - var(--space-xs) * .25);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-file-upload{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-file-input{display:none}.agent-import-upload-btn{display:inline-flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-import-file-hint{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-divider{display:flex;align-items:center;gap:var(--space-md);margin-bottom:var(--space-md);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-divider:before,.agent-import-divider:after{content:"";flex:1;height:1px;background:var(--border)}.agent-import-textarea{width:100%;min-height:calc(var(--space-xl) * 5);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));line-height:1.5;resize:vertical}.agent-import-textarea:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.agent-import-company{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-company-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));text-transform:uppercase;letter-spacing:.04em}.agent-import-company-name{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-import-count{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);margin-bottom:var(--space-md)}.agent-import-selection-controls{display:flex;gap:var(--space-sm);flex-wrap:wrap;margin-bottom:var(--space-md)}.agent-import-agent-list{display:flex;flex-direction:column;gap:calc(var(--space-sm) - var(--space-xs) * .5);max-height:calc(var(--space-xl) * 11 + var(--space-lg));overflow-y:auto}.agent-import-agent-item{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-import-agent-icon{font-size:calc(var(--space-md) + var(--space-xs) * 1.5);line-height:1;flex-shrink:0}.agent-import-agent-details{display:flex;flex-direction:column;min-width:0}.agent-import-agent-name{font-weight:500;font-size:calc(var(--space-sm) + var(--space-xs) * 1.25)}.agent-import-agent-meta{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-import-agent-title{color:var(--text-muted)}.agent-import-agent-role{text-transform:capitalize}.agent-import-agent-model{color:var(--text-muted)}
1
+ .agent-token-stats-panel{margin-bottom:var(--space-lg);padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);box-shadow:var(--shadow-sm)}.agent-token-stats-panel__header{margin-bottom:var(--space-md)}.agent-token-stats-panel__title{margin:0;font-size:calc(var(--space-md) + var(--space-xs));font-weight:600;color:var(--text)}.agent-token-stats-panel__totals{display:grid;grid-template-columns:repeat(auto-fit,minmax(calc(var(--space-2xl) * 4),1fr));gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-token-stats-panel__total-card{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.agent-token-stats-panel__total-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));text-transform:uppercase;letter-spacing:calc(var(--space-xs) / 8)}.agent-token-stats-panel__total-value{color:var(--text);font-size:calc(var(--space-lg) + var(--space-xs));line-height:1.2;font-family:var(--font-mono);font-weight:700}.agent-token-stats-panel__table-wrapper{overflow-x:auto}.agent-token-stats-panel__table{width:100%;border-collapse:collapse}.agent-token-stats-panel__table th,.agent-token-stats-panel__table td{padding:var(--space-sm);border-bottom:1px solid var(--border);color:var(--text);text-align:right;font-size:calc(var(--space-sm) + var(--space-xs))}.agent-token-stats-panel__table thead th{text-transform:uppercase;letter-spacing:calc(var(--space-xs) / 8);color:var(--text-muted);font-weight:600}.agent-token-stats-panel__table th:first-child,.agent-token-stats-panel__table td:first-child{text-align:left}.agent-token-stats-panel__agent-cell{display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5)}.agent-token-stats-panel__agent-name{color:var(--text)}.agent-token-stats-panel__agent-id{color:var(--text-muted);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-transform:none;letter-spacing:normal}.agent-token-stats-panel__total-cell{font-family:var(--font-mono);font-weight:700}.agent-token-stats-panel__empty{padding:var(--space-md);border:1px dashed var(--border);border-radius:var(--radius-sm);color:var(--text-muted);background:color-mix(in srgb,var(--surface) 85%,transparent);font-size:calc(var(--space-sm) + var(--space-xs))}@media(max-width:768px){.agent-token-stats-panel{padding:var(--space-sm)}.agent-token-stats-panel__totals{grid-template-columns:1fr}.agent-token-stats-panel__table th,.agent-token-stats-panel__table td{padding:var(--space-xs) var(--space-sm)}}.active-agents-panel{margin-top:var(--space-xl);margin-bottom:var(--space-lg)}.active-agents-panel-header{display:flex;align-items:center;gap:var(--space-sm);font-size:13px;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-md)}.active-agents-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:var(--space-md)}.live-agent-card{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:background .15s,border-color .15s}.live-agent-card:hover{background:var(--bg-hover);border-color:var(--border-strong, var(--border))}.live-agent-card:focus-visible{outline:2px solid var(--accent, var(--color-primary));outline-offset:2px}.live-agent-card-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.live-agent-card-name{display:flex;align-items:center;gap:var(--space-sm);font-weight:600;font-size:13px}.live-agent-task{font-family:var(--font-mono)}.live-agent-card-transcript{font-family:var(--font-mono);font-size:11px;line-height:1.5;color:var(--text-muted);max-height:120px;overflow-y:auto}.live-agent-card-empty{display:flex;flex-direction:column;gap:var(--space-xs)}.live-agent-card-status{font-style:normal;font-weight:500;color:var(--text-primary);opacity:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-status-sub{font-style:italic;opacity:.6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-footer{display:flex;align-items:center;justify-content:space-between;font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding-top:var(--space-sm);border-top:1px solid var(--border)}.live-agent-streaming-dot{color:var(--color-success);animation:pulse 1.5s infinite}.live-agent-card-footer-actions{display:flex;align-items:center;gap:var(--space-sm)}.live-agent-card-footer-meta{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap;min-width:0}.live-agent-card-next-heartbeat{color:var(--text-muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-logs-btn{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);font-size:11px;color:var(--text-secondary);background:transparent;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background .15s,color .15s,border-color .15s}.live-agent-card-logs-btn:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-strong, var(--border))}@media(max-width:768px){.active-agents-grid{grid-template-columns:1fr}.live-agent-card{min-width:0;overflow:hidden}}.agents-overview-bar{border-bottom:1px solid var(--border);background:var(--surface);padding:var(--space-md) var(--space-lg);display:flex;flex-direction:column;gap:var(--space-sm)}.agents-overview-bar__toggle{width:100%;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text);padding:var(--space-sm) var(--space-md);display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast)}.agents-overview-bar__toggle:hover{background:var(--card-hover)}.agents-overview-bar__toggle:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.agents-overview-bar__title-wrap{display:inline-flex;align-items:center;gap:var(--space-xs)}.agents-overview-bar__title{font-weight:600}.agents-overview-bar__meta{font-size:calc(var(--space-sm) + var(--space-xs))}.agents-overview-bar__content{display:flex;flex-direction:column;gap:var(--space-md)}.agents-overview-bar__metrics{margin-bottom:0}.agents-overview-bar__active-panel{margin-top:0;margin-bottom:0}@media(max-width:768px){.agents-overview-bar{padding:var(--space-sm) var(--space-md)}.agents-overview-bar__toggle{min-height:calc(var(--space-2xl) + var(--space-sm))}}.agent-dialog-overlay{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(var(--space-xs));display:flex;align-items:center;justify-content:center;z-index:100;padding:calc(var(--space-lg) + var(--space-xs))}.agent-dialog{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;max-width:calc(var(--space-xl) * 21 + var(--space-md));max-height:calc(100vh - (var(--space-xl) + var(--space-lg)));max-height:calc(100dvh - (var(--space-xl) + var(--space-lg)));display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-lg)}.agent-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-lg) calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border)}.agent-dialog-header-title{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .75)}.agent-dialog-body{flex:1;overflow-y:auto;padding:calc(var(--space-lg) + var(--space-xs))}.agent-dialog-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-sm);padding:var(--space-lg) calc(var(--space-lg) + var(--space-xs));border-top:1px solid var(--border)}.agent-dialog-steps{display:flex;gap:calc(var(--space-sm) - var(--space-xs) * .5);padding:var(--space-md) calc(var(--space-lg) + var(--space-xs));justify-content:center}.agent-dialog-step{width:calc(var(--space-2xl) + var(--space-sm));height:var(--space-xs);border-radius:calc(var(--space-xs) * .5);background:var(--border);transition:background var(--transition-fast)}.agent-dialog-step.active{background:var(--todo)}.agent-dialog-step.completed{background:var(--color-success)}.agent-dialog-field{margin-bottom:var(--space-lg)}.agent-dialog-field label{display:block;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500;margin-bottom:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-dialog-field .input,.agent-dialog-field .select{width:100%;box-sizing:border-box}.agent-dialog-field--title .input{font-size:calc(var(--space-md) + var(--space-xs) * .25);line-height:var(--space-lg)}.agent-dialog-section{margin-bottom:var(--space-lg)}.agent-dialog-section-header{font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);margin-bottom:var(--space-md);padding-bottom:var(--space-xs);border-bottom:1px solid var(--border)}.agent-dialog-step-zero-actions{display:flex;justify-content:flex-end;margin-bottom:var(--space-sm)}.agent-dialog-interview-btn{font-weight:600}.agent-dialog-interview-btn:disabled{opacity:.7;cursor:not-allowed}.agent-dialog-tabs{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-sm);margin-bottom:var(--space-lg)}.agent-dialog-tab{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);padding:var(--space-sm) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.agent-dialog-tab:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.agent-dialog-tab:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-dialog-tab.active{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-dialog-tab-panel{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-runtime-mode-toggle{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.agent-runtime-mode-option{position:relative;margin:0}.agent-runtime-mode-option input{position:absolute;opacity:0;pointer-events:none}.agent-runtime-mode-option span{display:flex;align-items:center;justify-content:center;min-height:calc(var(--space-xl) + var(--space-lg));border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;padding:var(--space-sm) var(--space-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.agent-runtime-mode-option span:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.agent-runtime-mode-option input:focus-visible+span{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-runtime-mode-option--active span{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-role-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 3 + var(--space-sm)),1fr));gap:var(--space-sm)}.agent-role-option{display:flex;flex-direction:column;align-items:center;padding:var(--space-md) var(--space-sm);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast);font-family:var(--font-primary);color:var(--text)}.agent-role-option:hover{border-color:var(--text-muted);background:var(--card-hover)}.agent-role-option:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-role-option.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent);box-shadow:var(--focus-ring)}.agent-role-option-icon{font-size:calc(var(--space-lg) + var(--space-xs));line-height:1}.agent-role-option-label{font-size:calc(var(--space-sm) + var(--space-xs));margin-top:var(--space-xs)}.agent-dialog-icon-prefix{margin-right:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-dialog-ai-generate{margin-top:var(--space-sm);border-top:1px solid var(--border);padding-top:var(--space-md)}.btn--ai-generate{width:100%;display:flex;align-items:center;justify-content:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);background:var(--cta-bg, var(--todo));color:var(--cta-text, var(--text));font-weight:600;border:1px solid transparent}.btn--ai-generate:hover{opacity:.9;filter:brightness(1.1)}.agent-dialog-ai-hint{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-align:center;margin:calc(var(--space-sm) - var(--space-xs) * .5) 0 0}.agent-dialog-summary{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-dialog-summary-row{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;border-bottom:1px solid color-mix(in srgb,var(--border) 50%,transparent)}.agent-dialog-summary-row:last-child{border-bottom:none}.agent-dialog-summary-row-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-dialog-summary-row-label--fixed{flex:0 0 calc(var(--space-xl) * 4 - var(--space-xs) * 1.5)}.agent-dialog-summary-row-value{font-weight:600}.agent-dialog-summary-row-value--body{font-weight:400}.agent-dialog-summary--spaced{margin-bottom:var(--space-md)}.agent-dialog-summary-row-value--muted{font-style:italic;color:var(--text-muted)}.agent-dialog-summary-row-value--capitalize{text-transform:capitalize}.agent-dialog-summary-row--editable{flex-direction:column;align-items:stretch;gap:var(--space-xs)}.agent-dialog-summary-row--editable .agent-dialog-summary-row-label{margin-bottom:0}.agent-dialog-summary-row--title .input{font-size:calc(var(--space-md) + var(--space-xs) * .25);line-height:var(--space-lg)}.agent-presets{margin-bottom:var(--space-lg)}.agent-presets-header{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:600;color:var(--text-muted);margin-bottom:var(--space-md);display:flex;align-items:center;gap:var(--space-sm)}.agent-presets-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 5 + var(--space-lg) + var(--space-xs)),1fr));gap:var(--space-sm);margin-bottom:var(--space-lg);max-height:calc(var(--space-xl) * 16 + var(--space-lg));overflow-y:auto}.agent-preset-card{display:flex;flex-direction:column;align-items:center;padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),box-shadow var(--transition-fast),transform var(--transition-fast);background:var(--bg-secondary);font-family:var(--font-primary);color:var(--text)}.agent-preset-card:hover{border-color:var(--todo);background:var(--bg-tertiary)}.agent-preset-card:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-preset-card.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-preset-icon{font-size:var(--space-xl);margin-bottom:var(--space-xs)}.agent-preset-name{font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500;text-align:center;margin-bottom:var(--space-xs)}.agent-preset-role{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);text-transform:capitalize}.agent-preset-description{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-top:calc(var(--space-xs) * .5)}.agent-dialog-header-sparkle{margin-right:var(--space-sm)}.agent-dialog-error-banner{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25);padding:var(--space-sm) var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border-radius:var(--radius-md);margin-bottom:var(--space-md)}.agent-dialog-textarea{resize:vertical}.agent-dialog-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);margin-top:var(--space-xs);display:flex;justify-content:space-between;gap:var(--space-sm)}.agent-dialog-loading-center{display:flex;flex-direction:column;align-items:center;padding:var(--space-2xl) var(--space-lg);gap:var(--space-md)}.agent-dialog-spinner{width:var(--space-2xl);height:var(--space-2xl);border:calc(var(--space-xs) * .75) solid var(--border);border-top-color:var(--todo);border-radius:50%}.agent-dialog-loading-text{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin:0}.agent-dialog-expand-btn{background:none;border:none;color:var(--todo);cursor:pointer;font-size:calc(var(--space-sm) + var(--space-xs));margin-left:var(--space-sm);padding:0}.agent-dialog-expand-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.agent-generation-prompt-box{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-family:var(--font-mono);line-height:1.5;white-space:pre-wrap;word-break:break-word;overflow:auto;position:relative}.agent-generation-prompt-box--collapsed{max-height:calc(var(--space-xl) * 6 + var(--space-sm) + var(--space-xs) * .5);overflow:hidden}.agent-generation-prompt-fade{position:absolute;bottom:0;left:0;right:0;height:calc(var(--space-lg) + var(--space-xl));background:linear-gradient(transparent,var(--bg-secondary));pointer-events:none}.agent-dialog-required{color:var(--color-error)}.agent-dialog-optional{color:var(--text-muted);font-weight:400}.agent-dialog-error{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin-top:var(--space-md)}.agent-dialog-info{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin-top:0;margin-bottom:var(--space-md)}.agent-dialog-loading{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);padding:var(--space-sm) 0}.agent-dialog-field-hint{margin-top:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}@media(max-width:768px){.agent-dialog-overlay{padding:0;align-items:stretch;justify-content:stretch}.agent-dialog{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border-radius:0;border-left:0;border-right:0}.agent-dialog-header{padding:calc(var(--space-md) + env(safe-area-inset-top)) var(--space-md) var(--space-md)}.agent-dialog-footer{padding:var(--space-md) var(--space-md) calc(var(--space-md) + env(safe-area-inset-bottom))}.agent-dialog-steps{padding:var(--space-sm) var(--space-md);overflow-x:auto;flex-wrap:nowrap;flex-shrink:0}.agent-dialog-header,.agent-dialog-footer{flex-shrink:0}.agent-dialog-body{padding:var(--space-md);flex:1 1 auto;min-height:0;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.agent-dialog-summary-row--editable .input{min-height:calc(var(--space-lg) + var(--space-xl))}.agent-dialog-footer{flex-wrap:wrap;gap:var(--space-xs)}.agent-dialog-footer>.btn{flex:1 1 auto;min-width:0}.agent-dialog-step-zero-actions{justify-content:stretch}.agent-dialog-interview-btn{width:100%}}.agent-import-skills-section{margin-top:var(--space-lg)}.agent-import-skill-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-2xl) * 6);overflow-y:auto}.agent-import-skill-item{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);background:var(--surface);border:1px solid var(--border)}.agent-import-skill-icon{flex-shrink:0}.agent-import-skill-details{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.agent-import-skill-name{font-weight:500;color:var(--text)}.agent-import-skill-description{color:var(--text-muted)}.agent-import-empty{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);text-align:center;padding:var(--space-lg)}.agent-import-result{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-sm)}.agent-import-result-icon{color:var(--color-success);margin-bottom:var(--space-xs)}.agent-import-result-title{margin:0;font-size:calc(var(--space-md) + var(--space-xs));font-weight:600}.agent-import-result-company{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin:0 0 var(--space-md) 0}.agent-import-result-stats{display:flex;gap:var(--space-lg);margin-bottom:var(--space-md);padding:var(--space-md);background:var(--bg-secondary);border-radius:var(--radius-md)}.agent-import-result-stat{display:flex;align-items:center;gap:var(--space-sm);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);padding:var(--space-xs) var(--space-sm)}.agent-import-result-stat--success{color:var(--color-success)}.agent-import-result-stat--skipped{color:var(--color-warning)}.agent-import-result-stat--error{color:var(--color-error)}.agent-import-result-stat--success:before,.agent-import-result-stat--skipped:before,.agent-import-result-stat--error:before{content:"";width:var(--space-sm);height:var(--space-sm);border-radius:50%;flex-shrink:0}.agent-import-result-stat--success:before{background:var(--color-success)}.agent-import-result-stat--skipped:before{background:var(--color-warning)}.agent-import-result-stat--error:before{background:var(--color-error)}.agent-import-result-agents{display:flex;flex-direction:column;gap:var(--space-xs);width:100%;text-align:left}.agent-import-result-agent{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);color:var(--color-success);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--color-success) 8%,transparent);border-radius:var(--radius-sm)}.agent-import-result-errors{display:flex;flex-direction:column;gap:var(--space-xs);width:100%;text-align:left;margin-top:var(--space-sm)}.agent-import-result-error{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--color-error);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--color-error) 8%,transparent);border-radius:var(--radius-sm)}.agent-import-result-divider{align-self:stretch;height:1px;background:var(--border);margin:var(--space-md) 0}.agent-import-result-section-title{font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;margin:0 0 var(--space-sm) 0}.agent-import-browse{margin-bottom:var(--space-md)}.agent-import-browse-header{display:flex;flex-direction:column;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-browse-search{position:relative;display:flex;align-items:center}.agent-import-browse-search-icon{position:absolute;left:var(--space-sm);color:var(--text-muted);pointer-events:none}.agent-import-browse-search-input{width:100%;padding:var(--space-sm) var(--space-sm) var(--space-sm) calc(var(--space-sm) + var(--space-lg));border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-import-browse-search-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.agent-import-browse-selected{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);background:color-mix(in srgb,var(--todo) 10%,transparent);border:1px solid color-mix(in srgb,var(--todo) 30%,transparent);border-radius:var(--radius-md)}.agent-import-browse-selected-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-browse-selected-name{flex:1;font-weight:500;color:var(--todo)}.agent-import-browse-loading{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl) 0;color:var(--text-muted)}.agent-import-browse-error{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 8%,transparent);border-radius:var(--radius-md);color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25)}.agent-import-browse-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);background:var(--surface)}.agent-import-browse-item{display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5);padding:var(--space-sm);cursor:pointer;border-bottom:1px solid var(--border);transition:background-color var(--transition-fast)}.agent-import-browse-item:last-child{border-bottom:none}.agent-import-browse-item:hover{background:var(--surface-hover)}.agent-import-browse-item:focus-visible{outline:none;background:var(--surface-hover);box-shadow:var(--focus-ring)}.agent-import-browse-item--selected{background:color-mix(in srgb,var(--todo) 10%,transparent);border-color:var(--todo)}.agent-import-browse-item-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-import-browse-item-name{font-weight:500;color:var(--text)}.agent-import-browse-item-installs{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);white-space:nowrap}.agent-import-browse-item-tagline{font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted);line-height:1.4}.agent-import-browse-item-repo{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-family:var(--font-mono)}.agent-import-browse-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25)}.agent-controls-actions{display:flex;gap:var(--space-sm)}.agent-global-controls{display:flex;align-items:center;padding:var(--space-md) var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-lg)}.heartbeat-multiplier-label{font-weight:500;color:var(--text);white-space:nowrap}.agent-import-dialog{max-width:calc(var(--space-xl) * 23 + var(--space-sm))}.agent-import-description{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);margin:0 0 var(--space-md) 0;line-height:1.5}.agent-import-description code{background:var(--surface-hover);padding:calc(var(--space-xs) * .25) var(--space-xs);border-radius:calc(var(--radius-sm) - var(--space-xs) * .25);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-file-upload{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-file-input{display:none}.agent-import-upload-btn{display:inline-flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-import-file-hint{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-divider{display:flex;align-items:center;gap:var(--space-md);margin-bottom:var(--space-md);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-divider:before,.agent-import-divider:after{content:"";flex:1;height:1px;background:var(--border)}.agent-import-textarea{width:100%;min-height:calc(var(--space-xl) * 5);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));line-height:1.5;resize:vertical}.agent-import-textarea:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.agent-import-company{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-company-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));text-transform:uppercase;letter-spacing:.04em}.agent-import-company-name{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-import-count{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);margin-bottom:var(--space-md)}.agent-import-selection-controls{display:flex;gap:var(--space-sm);flex-wrap:wrap;margin-bottom:var(--space-md)}.agent-import-agent-list{display:flex;flex-direction:column;gap:calc(var(--space-sm) - var(--space-xs) * .5);max-height:calc(var(--space-xl) * 11 + var(--space-lg));overflow-y:auto}.agent-import-agent-item{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-import-agent-icon{font-size:calc(var(--space-md) + var(--space-xs) * 1.5);line-height:1;flex-shrink:0}.agent-import-agent-details{display:flex;flex-direction:column;min-width:0}.agent-import-agent-name{font-weight:500;font-size:calc(var(--space-sm) + var(--space-xs) * 1.25)}.agent-import-agent-meta{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-import-agent-title{color:var(--text-muted)}.agent-import-agent-role{text-transform:capitalize}.agent-import-agent-model{color:var(--text-muted)}
@@ -0,0 +1 @@
1
+ import{r as s,a as ys,j as t}from"./vendor-react-K0fH_qHe.js";import{i as nt,b1 as It,t as Jt,b2 as ks,b3 as zt,b4 as Cs,w as Ct,b5 as $e,b6 as Ns,b7 as js,b8 as Ms,b9 as Rs,ba as As,bb as Es,s as Yt,bc as Ts,bd as Ps,be as Ds,bf as $s,bg as Ls,bh as Fs,bi as Is,k as Xt,bj as zs,p as _s,bk as Us,bl as Os,u as Hs,bm as Bs,ab as Qt,ac as Zt,bn as Ws,bo as Gs,S as Vs,W as _t,P as et,I as Ye,am as Ks,bp as Ut,bq as Ot,B as st,a8 as qs,a9 as Js,a as Ys,br as Xs,bs as Qs,bt as Zs,aQ as en,bu as tn,bv as Ht,bw as sn,h as nn,j as Bt,m as an}from"./index-CQyVRLOb.js";import"./vendor-xterm-DzcZoU0P.js";const St="kb-chat-active-session";function Wt(n){const r=typeof n=="string"?n.trim():"",o=r.indexOf("/");return!r||o<=0||o>=r.length-1?{}:{modelProvider:r.slice(0,o),modelId:r.slice(o+1)}}function rn(n){const r=n?.toolCalls;if(!Array.isArray(r))return;const o=r.map(d=>{if(!d||typeof d!="object")return null;const c=d,S=typeof c.toolName=="string"?c.toolName:"";if(!S)return null;const R=c.args;return{toolName:S,...R&&typeof R=="object"?{args:R}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(d=>d!==null);return o.length>0?o:void 0}function on(n){const r=n?.fallback;if(!r||typeof r!="object")return;const o=r,d=typeof o.primaryModel=="string"?o.primaryModel:"",c=typeof o.fallbackModel=="string"?o.fallbackModel:"",S=o.triggerPoint;if(!(!d||!c||S!=="session-creation"&&S!=="prompt-time"))return{primaryModel:d,fallbackModel:c,triggerPoint:S}}function yt(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:rn(n.metadata),fallbackInfo:on(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function cn(n,r){const[o,d]=s.useState([]),[c,S]=s.useState(null),[R,A]=s.useState(!0),[D,y]=s.useState([]),[Y,p]=s.useState(!1),[K,C]=s.useState(!1),[Q,b]=s.useState(""),[E,m]=s.useState(""),[j,M]=s.useState([]),[T,I]=s.useState(""),[B,z]=s.useState(""),[G,v]=s.useState(!0),[h,u]=s.useState(new Map),i=s.useRef(null),f=s.useRef(!1),x=s.useRef(""),P=s.useRef(null),ye=s.useRef(o),W=s.useRef(c),ae=s.useRef(K);ye.current=o,W.current=c,ae.current=K,s.useEffect(()=>{x.current=T},[T]);const Fe=s.useRef(new Set),me=s.useRef(0),q=s.useRef(n);q.current!==n&&(q.current=n,me.current++),s.useEffect(()=>{const g=me.current;nt(void 0,n).then(k=>{if(me.current!==g)return;const w=new Map;for(const N of k)w.set(N.id,N);u(w)}).catch(()=>{})},[n]);const oe=s.useCallback(async()=>{A(!0);try{const k=[...(await It(n)).sessions].sort((w,N)=>new Date(N.updatedAt).getTime()-new Date(w.updatedAt).getTime());d(k)}catch{}finally{A(!1)}},[n]);s.useEffect(()=>{oe()},[oe]);const Ge=s.useRef(()=>{}),he=s.useRef(!1);s.useEffect(()=>{he.current=!1},[n]),s.useEffect(()=>{if(R||he.current||W.current)return;const g=Jt(St,n);if(!g){he.current=!0;return}const k=o.find(w=>w.id===g);if(k){he.current=!0,Ge.current(g,k);return}he.current=!0},[R,o,n]);const re=s.useCallback(async(g,k)=>{p(!0);try{const w=await ks(g,{limit:50,...k},n),N=w.messages.map(yt);k?.offset&&k.offset>0?y(ee=>[...N,...ee]):y(N),v(w.messages.length>=50)}catch{}finally{p(!1)}},[n]),je=s.useCallback(()=>{P.current?.(),P.current=null,x.current="",I(""),b(""),m(""),M([]),C(!1)},[]),fe=s.useCallback(g=>{if(i.current||!g)return!0;f.current=!1,C(!0);const{handlers:k}=zt({sessionId:g,tempUserMessageId:"",setStreamingText:b,setStreamingThinking:m,setStreamingToolCalls:M,cancelStreamingFlushesRef:P,addToast:r,onFallbackSession:(N,ee)=>{const F=Wt(N.fallbackModel);d(J=>J.map(Z=>Z.id===ee?{...Z,...F}:Z)),S(J=>J&&J.id===ee?{...J,...F}:J)},onDone:()=>{b(""),m(""),M([]),C(!1),ae.current=!1,i.current=null,re(g)},onError:N=>{b(""),m(""),M([]),C(!1),ae.current=!1,i.current=null;const ee=typeof N=="string"&&N.trim()?N:"Failed to get response";r?.(ee,"error"),re(g)}}),w=Cs(g,k,n);return i.current=w,!0},[r,re,n]),ce=s.useCallback((g,k)=>{const w=W.current?.id??null;if(g&&w===g&&!k)return;i.current&&(i.current.close(),i.current=null);const N=k??o.find(ee=>ee.id===g);S(N||null),je(),v(!0),g?re(g):y([]),N?.isGenerating&&(b(""),fe(N.id)),g?Ct(St,g,n):$e(St,n)},[fe,o,re,n,je]);Ge.current=ce;const ve=s.useCallback(async g=>{const k=await Ns(g,n);i.current&&(i.current.close(),i.current=null);const w={id:k.session.id,title:k.session.title,agentId:k.session.agentId,status:k.session.status,modelProvider:k.session.modelProvider,modelId:k.session.modelId,createdAt:k.session.createdAt,updatedAt:k.session.updatedAt};return d(N=>N.some(ee=>ee.id===w.id)?N:[w,...N]),je(),ce(w.id,w),y([]),w},[n,je,ce]),Ie=s.useCallback(async g=>{await js(g,{status:"archived"},n),d(k=>k.filter(w=>w.id!==g)),c?.id===g&&(S(null),y([]))},[c,n]),Me=s.useCallback(async g=>{c?.id===g&&i.current&&(i.current.close(),i.current=null),await Ms(g,n),d(k=>k.filter(w=>w.id!==g)),c?.id===g&&(S(null),y([]))},[c,n]),Re=s.useCallback(async()=>{!c||!G||await re(c.id,{offset:D.length})},[c,G,re,D.length]),ke=s.useCallback(()=>{c&&(f.current=!0,P.current?.(),P.current=null,i.current?.close(),i.current=null,Rs(c.id,n).catch(()=>{}),C(!1),b(""),m(""),M([]))},[c,n]),Ae=s.useCallback(()=>{x.current="",I("")},[]),ue=s.useRef(()=>{}),ie=As(),ge=s.useCallback((g,k)=>{if(!c)return;if(ae.current){x.current=g,I(g),r?.("Still waiting for previous response — message queued","warning");return}f.current=!1,i.current&&(i.current.close(),i.current=null);const w=`temp-${Date.now()}`,N={id:w,sessionId:c.id,role:"user",content:g,createdAt:new Date().toISOString()};y(F=>[...F,N]),b(""),m(""),M([]),C(!0);const{handlers:ee}=zt({sessionId:c.id,tempUserMessageId:w,setStreamingText:b,setStreamingThinking:m,setStreamingToolCalls:M,cancelStreamingFlushesRef:P,addToast:r,onFallbackSession:(F,J)=>{const Z=Wt(F.fallbackModel);d(te=>te.map(U=>U.id===J?{...U,...Z}:U)),S(te=>te&&te.id===J?{...te,...Z}:te)},onDone:({messageId:F,message:J,accumulated:Z})=>{const te=J?yt(J):{id:F||`msg-${Date.now()}`,sessionId:c.id,role:"assistant",content:Z.text,thinkingOutput:Z.thinking,toolCalls:Z.toolCalls.length>0?Z.toolCalls:void 0,fallbackInfo:Z.fallbackInfo,createdAt:new Date().toISOString()};Fe.current.add(te.id),y(O=>[...O,te]),b(""),m(""),M([]),C(!1),ae.current=!1,i.current=null,setTimeout(()=>{Fe.current.delete(te.id)},1e3),oe();const U=x.current.trim();U&&(x.current="",I(""),ue.current(U))},onError:(F,J)=>{y(U=>U.filter(O=>O.id!==J)),b(""),m(""),M([]),C(!1),ae.current=!1,i.current=null,console.error("[useChat] Stream error:",F);const Z=typeof F=="string"&&F.trim()?F:"Failed to get response";if(typeof F=="string"&&Ts(F)&&(ie.isHiddenNow()||ie.wasRecentlyHidden(5e3))?(console.info("[useChat] Suppressed tab-suspension stream error:",F),c?.id&&re(c.id)):r?.(Z,"error"),!f.current){const U=x.current.trim();U&&(x.current="",I(""),ue.current(U))}}});i.current=Es(c.id,g,ee,k,n)},[c,n,oe,r,re,ie]);ue.current=ge;const ze=B?o.filter(g=>g.title?.toLowerCase().includes(B.toLowerCase())||g.agentId.toLowerCase().includes(B.toLowerCase())):o;return s.useEffect(()=>{if(!W.current?.isGenerating||(i.current||fe(W.current.id),!ae.current||i.current||!W.current))return;const g=setInterval(async()=>{if(!ae.current||i.current||!W.current){clearInterval(g);return}try{(await It(n)).sessions.find(N=>N.id===W.current?.id)?.isGenerating||(clearInterval(g),await re(W.current.id),b(""),m(""),M([]),C(!1))}catch{}},3e3);return()=>clearInterval(g)},[fe,re,n,c]),s.useEffect(()=>{const g=me.current,k=n?`?projectId=${encodeURIComponent(n)}`:"",w=()=>me.current!==g,N=U=>{if(w())return;const O=JSON.parse(U.data);d($=>$.some(X=>X.id===O.id)?$:[O,...$])},ee=U=>{if(w())return;const O=JSON.parse(U.data);d($=>[...$.map(ne=>ne.id===O.id?O:ne)]),W.current?.id===O.id&&(S(O),O.isGenerating&&!i.current&&(b(""),fe(O.id)))},F=U=>{if(w())return;const{id:O}=JSON.parse(U.data);d($=>$.filter(X=>X.id!==O)),W.current?.id===O&&(S(null),y([]))},J=U=>{if(w())return;const O=JSON.parse(U.data),$=yt(O);if(!Fe.current.has($.id)){if(W.current?.id===$.sessionId&&ae.current&&!i.current&&$.role==="assistant"){y(X=>X.some(ne=>ne.id===$.id)?X:[...X,$]),b(""),m(""),M([]),C(!1);return}W.current?.id===$.sessionId&&!ae.current&&y(X=>{if(X.some(ne=>ne.id===$.id))return X;if($.role==="user"){const ne=X.findIndex(xe=>xe.role==="user"&&xe.id.startsWith("temp-")&&xe.content.trim()===$.content.trim());if(ne>=0){const xe=[...X];return xe[ne]=$,xe}}return[...X,$]})}},Z=U=>{if(w())return;const{id:O}=JSON.parse(U.data);y($=>$.filter(X=>X.id!==O))};return Yt(`/api/events${k}`,{events:{"chat:session:created":N,"chat:session:updated":ee,"chat:session:deleted":F,"chat:message:added":J,"chat:message:deleted":Z}})},[fe,n]),s.useEffect(()=>()=>{i.current&&(i.current.close(),i.current=null)},[]),{sessions:o,activeSession:c,sessionsLoading:R,messages:D,messagesLoading:Y,isStreaming:K,streamingText:Q,streamingThinking:E,streamingToolCalls:j,pendingMessage:T,selectSession:ce,createSession:ve,archiveSession:Ie,deleteSession:Me,sendMessage:ge,stopStreaming:ke,clearPendingMessage:Ae,loadMoreMessages:Re,hasMoreMessages:G,searchQuery:B,setSearchQuery:z,filteredSessions:ze,refreshSessions:oe,agentsMap:h}}const we="fusion:chat-active-room";function Nt(n){return[...n].sort((r,o)=>new Date(o.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function Xe(n,r){const o=n.findIndex(c=>c.id===r.id);if(o===-1)return Nt([r,...n]);const d=[...n];return d[o]=r,Nt(d)}function Se(n){try{return JSON.parse(n.data)}catch{return null}}function ln(n,r){const[o,d]=s.useState([]),[c,S]=s.useState(!0),[R,A]=s.useState(null),[D,y]=s.useState(null),[Y,p]=s.useState([]),[K,C]=s.useState([]),[Q,b]=s.useState(!1),E=s.useRef(o),m=s.useRef(D),j=s.useRef(0),M=s.useRef(n);E.current=o,m.current=D,M.current!==n&&(M.current=n,j.current+=1);const T=s.useCallback(async(h,u=!0)=>{if(!h){p([]),C([]),b(!1);return}u&&C([]),b(!0);try{const[i,f]=await Promise.all([Ps(h.id,n),Ds(h.id,{limit:100},n)]);p(i.members),C(f.messages)}catch{p([]),C([])}finally{b(!1)}},[n]),I=s.useCallback(async()=>{S(!0);try{const h=await $s({},n),u=Nt(h.rooms);d(u),A(null);const i=Jt(we,n);if(i){const f=u.find(x=>x.id===i)??null;f?(y(f),T(f,!0)):$e(we,n)}}catch(h){const u=h instanceof Error?h.message:"Failed to load chat rooms";A(u),r?.(u,"error")}finally{S(!1)}},[r,T,n]),B=s.useCallback(h=>{if(!h){y(null),$e(we,n),T(null,!0);return}const u=E.current.find(i=>i.id===h)??null;y(u),u&&(Ct(we,u.id,n),T(u,!0))},[T,n]),z=s.useCallback(async h=>{const i=(await Ls({name:h.name,memberAgentIds:h.memberAgentIds},n)).room;return d(f=>Xe(f,i)),y(i),Ct(we,i.id,n),await T(i,!0),i},[T,n]),G=s.useCallback(async h=>{await Fs(h,n),d(u=>u.filter(i=>i.id!==h)),m.current?.id===h&&(y(null),p([]),C([]),$e(we,n))},[n]),v=s.useCallback(async(h,u)=>{const i=m.current?.id;if(!i)throw new Error("Select a room before sending a message");await Is(i,{content:h,...u?.attachments?{attachments:u.attachments}:{}},n)},[n]);return s.useEffect(()=>{I()},[I]),s.useEffect(()=>{const h=j.current,u=n?`/api/events?projectId=${encodeURIComponent(n)}`:"/api/events";return Yt(u,{onReconnect:()=>{I()},events:{"chat:room:created":i=>{if(j.current!==h)return;const f=Se(i);f&&d(x=>Xe(x,f))},"chat:room:updated":i=>{if(j.current!==h)return;const f=Se(i);f&&(d(x=>Xe(x,f)),m.current?.id===f.id&&y(f))},"chat:room:deleted":i=>{if(j.current!==h)return;const f=Se(i);f?.id&&(d(x=>x.filter(P=>P.id!==f.id)),m.current?.id===f.id&&(y(null),p([]),C([]),$e(we,n)))},"chat:room:member:added":i=>{if(j.current!==h)return;const f=Se(i);!f||m.current?.id!==f.roomId||p(x=>x.some(P=>P.agentId===f.agentId)?x:[...x,f])},"chat:room:member:removed":i=>{if(j.current!==h)return;const f=Se(i);!f||m.current?.id!==f.roomId||p(x=>x.filter(P=>P.agentId!==f.agentId))},"chat:room:message:added":i=>{if(j.current!==h)return;const f=Se(i);f&&(d(x=>{const P=x.find(ye=>ye.id===f.roomId);return P?Xe(x,{...P,updatedAt:f.createdAt}):x}),m.current?.id===f.roomId&&C(x=>x.some(P=>P.id===f.id)?x:[...x,f]))},"chat:room:message:updated":i=>{if(j.current!==h)return;const f=Se(i);!f||m.current?.id!==f.roomId||C(x=>x.map(P=>P.id===f.id?f:P))},"chat:room:message:deleted":i=>{if(j.current!==h)return;const f=Se(i);f?.id&&C(x=>x.filter(P=>P.id!==f.id))}}})},[n,I]),s.useEffect(()=>{D&&(o.some(h=>h.id===D.id)||(y(null),p([]),C([]),$e(we,n)))},[D,n,o]),{rooms:o,roomsLoading:c,roomsError:R,activeRoom:D,activeRoomMembers:Y,messages:K,messagesLoading:Q,selectRoom:B,createRoom:z,deleteRoom:G,sendRoomMessage:v,refreshRooms:I}}function dn(n,r=[]){const o=n.trim().replace(/^#/,"");if(!o)return{ok:!1,error:"Room name is required."};if(/[A-Z]/.test(o))return{ok:!1,error:"Use lowercase letters only."};const d=o.toLowerCase();return d.length>80?{ok:!1,error:"Room names can be at most 80 characters."}:/^[a-z0-9_-]+$/.test(d)?/^[-_]|[-_]$/.test(d)?{ok:!1,error:"Room names cannot start or end with a hyphen or underscore."}:r.some(c=>c.toLowerCase()===d)?{ok:!1,error:"A room with this name already exists."}:{ok:!0,name:d}:{ok:!1,error:"Use lowercase letters, numbers, hyphens, or underscores only."}}function un({isOpen:n,onClose:r,onCreate:o,projectId:d,existingRoomNames:c=[]}){const[S,R]=s.useState(""),[A,D]=s.useState([]),[y,Y]=s.useState(""),[p,K]=s.useState([]),[C,Q]=s.useState(!1),[b,E]=s.useState(null),[m,j]=s.useState(!1),M=s.useRef(null),T=s.useRef(null);s.useEffect(()=>{n&&(T.current=document.activeElement instanceof HTMLElement?document.activeElement:null,Q(!0),E(null),nt(void 0,d).then(u=>D(u)).catch(()=>{D([]),E("Failed to load agents.")}).finally(()=>Q(!1)))},[n,d]),s.useEffect(()=>{if(!n){R(""),Y(""),K([]),E(null),j(!1);return}const u=window.requestAnimationFrame(()=>M.current?.focus());return()=>window.cancelAnimationFrame(u)},[n]),s.useEffect(()=>{if(!n)return;const u=i=>{i.key==="Escape"&&r()};return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[n,r]),s.useEffect(()=>{n||T.current?.focus()},[n]);const I=s.useMemo(()=>dn(S,c),[S,c]),B=s.useMemo(()=>{const u=y.trim().toLowerCase();return u?A.filter(i=>i.name.toLowerCase().includes(u)):A},[A,y]),z=s.useMemo(()=>A.filter(u=>p.includes(u.id)),[A,p]),G=I.ok&&p.length>0&&!m&&!C;if(!n)return null;const v=u=>{m||K(i=>i.includes(u)?i.filter(f=>f!==u):[...i,u])},h=async()=>{if(!I.ok){E(I.error);return}if(p.length===0){E("Select at least one member.");return}E(null),j(!0);try{await o({name:I.name,displayName:`#${I.name}`,memberAgentIds:p}),r()}catch(u){E(u instanceof Error?u.message:"Failed to create room.")}finally{j(!1)}};return ys.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:u=>u.target===u.currentTarget&&r(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":"Create room",onClick:u=>u.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:"Create room"}),t.jsx("button",{type:"button",className:"modal-close","aria-label":"Close",onClick:r,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:"Room name"}),t.jsxs("div",{className:"create-room-modal-name-field",children:[t.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),t.jsx("input",{ref:M,id:"create-room-name",className:"input",value:S,disabled:m,onChange:u=>{const i=u.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();R(i)}})]}),!I.ok&&t.jsx("div",{className:"form-error",children:I.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:"Members"}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:"Search agents",value:y,disabled:m,onChange:u=>Y(u.target.value)})]}),z.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:z.map(u=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>v(u.id),disabled:m,children:[u.name," ×"]},u.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:C?t.jsx("div",{className:"create-room-modal-empty",children:"Loading agents..."}):B.length===0?t.jsx("div",{className:"create-room-modal-empty",children:A.length===0?"No agents in this project yet.":"No agents match your search."}):B.map(u=>{const i=p.includes(u.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${i?" create-room-modal-member-row--selected":""}`,onClick:()=>v(u.id),disabled:m,children:[t.jsx(Xt,{agent:u,size:20}),t.jsx("span",{children:u.name}),t.jsx("span",{className:"create-room-modal-member-role",children:u.role})]},u.id)})}),b&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:b})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:m,children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void h(),disabled:!G,children:m?"Creating...":"Create room"})]})]})}),document.body)}function es(n){const r=new Date(n),d=new Date().getTime()-r.getTime(),c=Math.floor(d/1e3),S=Math.floor(c/60),R=Math.floor(S/60),A=Math.floor(R/24);return c<60?"just now":S<60?`${S}m ago`:R<24?`${R}h ago`:A<7?`${A}d ago`:r.toLocaleDateString()}function Gt(n,r){if(!n||!r)return null;const o=r.toLowerCase();if(o.includes("claude")){let c=r.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return c=c.replace(/\s+/g," "),c.length>30?c.slice(0,30)+"…":c}if(o.includes("gpt")||o.includes("openai")){const c=r.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return c.length>30?c.slice(0,30)+"…":c}if(o.includes("gemini")){const c=r.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 d=r.replace(/-/g," ").replace(/^\w/,c=>c.toUpperCase()).replace(/\s+/g," ").trim();return d.length>30?d.slice(0,30)+"…":d}function tt(n,r){return n.length<=r?n:`${n.slice(0,r)}…`}function mn(n){if(!n)return null;const r=Object.entries(n);return r.length===0?null:r.map(([o,d])=>{const c=typeof d=="string"?d:(()=>{try{return JSON.stringify(d)}catch{return String(d)}})();return`${o}=${tt(c,50)}`}).join(", ")}function hn(n){if(n===void 0)return null;if(typeof n=="string")return tt(n,200);try{return tt(JSON.stringify(n),200)}catch{return tt(String(n),200)}}function ts(n){if(!n||n.length===0)return null;const r=(p,K)=>{const C=p.status==="running",Q=p.status==="completed"&&p.isError,b=mn(p.args),E=hn(p.result),m=C?b:E?`result: ${E}`:b?`args: ${b}`:null,j=C?"running":Q?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${C?" chat-tool-call--running":""}${Q?" chat-tool-call--error":""}`,open:C,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",title:p.toolName,children:p.toolName}),m&&t.jsx("span",{className:"chat-tool-call-preview",title:m,children:m}),t.jsx("span",{className:"chat-tool-call-status-text",children:j})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[b&&t.jsxs("div",{className:"chat-tool-call-row",children:[t.jsx("span",{className:"chat-tool-call-label",children:"args"}),t.jsx("span",{className:"chat-tool-call-value",children:b})]}),E&&t.jsxs("div",{className:`chat-tool-call-row${Q?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:"result"}),t.jsx("span",{className:"chat-tool-call-value",children:E})]})]})]},`${p.toolName}-${K}`)},o="chat-tool-calls";if(n.length===1)return t.jsxs("div",{className:o,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(Ht,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),r(n[0],0)]});const d=n.filter(p=>p.status==="running").length,c=n.filter(p=>p.status==="completed"&&p.isError).length,S=d>0,R=Array.from(new Set(n.map(p=>p.toolName))),A=R.slice(0,5),D=Math.max(0,R.length-A.length),y=D>0?`${A.join(", ")}, +${D} more`:A.join(", "),Y=S?`(${d} running)`:c>0?`(${c} ${c===1?"error":"errors"})`:null;return t.jsx("div",{className:o,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:S,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(Ht,{size:12,"aria-hidden":"true"}),t.jsxs("span",{className:"chat-tool-calls-count",children:[n.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:y,children:y}),Y&&t.jsx("span",{className:"chat-tool-calls-group-status",children:Y})]}),n.map((p,K)=>r(p,K))]})})}const ss={pre:({children:n,...r})=>t.jsx("pre",{...r,className:"chat-markdown-pre",children:n}),table:({children:n,...r})=>t.jsx("table",{...r,className:"chat-markdown-table",children:n})},Le="__fn_agent__",fn=280,Qe=180,Ze=500,Vt="fusion:chat-sidebar-width",Kt="fusion:chat-scope",gn=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function qt(n){const r=/(^|[\s])\/([^\s]*)$/.exec(n);if(!r)return null;const o=r[1]??"",d=r[2]??"",c=r.index+o.length;return{filter:d,start:c,end:n.length}}function pn(n,r){const o=n.slice(0,r),d=/(^|[\s\n])@([\w-]*)$/.exec(o);if(!d)return null;const c=d[2]??"",S=o.length-c.length-1;return{filter:c,start:S,end:r}}function bn({projectId:n,onClose:r,onCreate:o}){const[d,c]=s.useState("agent"),[S,R]=s.useState([]),[A,D]=s.useState(!0),[y,Y]=s.useState(""),[p,K]=s.useState([]),[C,Q]=s.useState(!0),[b,E]=s.useState(""),[m,j]=s.useState([]),[M,T]=s.useState([]);s.useEffect(()=>{let v=!1;return D(!0),nt(void 0,n).then(h=>{v||R(h)}).catch(()=>{v||R([])}).finally(()=>{v||D(!1)}),()=>{v=!0}},[n]),s.useEffect(()=>{Q(!0),nn().then(v=>{K(v.models),j(v.favoriteProviders),T(v.favoriteModels)}).catch(()=>{K([]),j([]),T([])}).finally(()=>{Q(!1)})},[]);const I=s.useCallback(async v=>{const h=m,i=h.includes(v)?h.filter(f=>f!==v):[v,...h];j(i);try{await Bt({favoriteProviders:i,favoriteModels:M})}catch{j(h)}},[m,M]),B=s.useCallback(async v=>{const h=M,i=h.includes(v)?h.filter(f=>f!==v):[v,...h];T(i);try{await Bt({favoriteProviders:m,favoriteModels:i})}catch{T(h)}},[M,m]),z=v=>{if(v.preventDefault(),d==="agent"){if(!y)return;o({agentId:y});return}if(!b)return;const h=b.indexOf("/");if(h<=0)return;const u=b.slice(0,h),i=b.slice(h+1);o({agentId:Le,modelProvider:u,modelId:i})},G=d==="agent"?!y:!b;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:v=>v.stopPropagation(),children:[t.jsx("h3",{children:"New Chat"}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{c("agent"),E("")},children:"Agent"}),t.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:()=>{c("model"),Y("")},children:"Model"})]}),t.jsxs("form",{onSubmit:z,children:[d==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",A?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):S.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:S.map(v=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${y===v.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>Y(v.id),"data-testid":`agent-option-${v.id}`,children:[t.jsx(st,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:v.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:v.role})]},v.id))})]}),d==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:C?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(an,{models:p,value:b,onChange:E,label:"Model",placeholder:"Select a model",favoriteProviders:m,onToggleFavorite:I,favoriteModels:M,onToggleModelFavorite:B})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:G,children:"Create"})]})]})]})})}const kt=s.memo(function({message:r,forcePlain:o,agentName:d,hideAssistantIdentity:c,showAssistantModelTag:S,activeModelTag:R,activeModelProvider:A,activeSessionId:D,mentionAgentsByName:y,copyAction:Y}){const p=r.role==="assistant",K=s.useMemo(()=>{if(p)return null;const b=r.content,E=/@([\w-]+)/g,m=[];let j=0,M=E.exec(b);for(;M;){const[T,I=""]=M,B=M.index;B>j&&m.push(b.slice(j,B));const z=I.replace(/_/g," ").toLowerCase(),G=y.get(z);G?m.push(t.jsxs("span",{className:"chat-mention-chip",children:["@",G.name.replace(/\s+/g,"_")]},`${G.id}-${B}`)):m.push(T),j=B+T.length,M=E.exec(b)}return j<b.length&&m.push(b.slice(j)),m.length===0?b:m},[p,r.content,y]),C=s.useMemo(()=>{const b=r.attachments;if(!b||b.length===0||!D)return null;const E=`/api/chat/sessions/${encodeURIComponent(D)}/attachments/`;return t.jsx("div",{className:"chat-message-attachments",children:b.map(m=>{const j=m.mimeType.startsWith("image/"),M=m.id||m.filename,T=`${E}${encodeURIComponent(m.filename)}`;return j?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:T,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:T,alt:m.originalName})},M):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:T,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(tn,{size:14}),t.jsx("span",{children:m.originalName})]},M)})})},[r.attachments,D]),Q=s.useMemo(()=>p?o?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:r.content}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(Qt,{remarkPlugins:[Zt],components:ss,children:r.content})}):null,[p,o,r.content]);return t.jsxs("div",{className:`chat-message chat-message--${r.role}`,"data-testid":`chat-message-${r.id}`,children:[p&&!c&&t.jsxs("div",{className:"chat-message-avatar",children:[A?t.jsx(et,{provider:A,size:"sm"}):t.jsx(st,{size:14}),t.jsx("span",{children:d}),S&&R&&t.jsx("span",{className:"chat-model-tag",children:R})]}),p?Q:t.jsx("div",{className:"chat-message-content",children:K}),Y,ts(r.toolCalls),r.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:r.thinkingOutput})]}),C,t.jsx("div",{className:"chat-message-time",children:es(r.createdAt)})]})});function yn({projectId:n,addToast:r}){const{activeSession:o,sessionsLoading:d,messages:c,messagesLoading:S,isStreaming:R,streamingText:A,streamingThinking:D,streamingToolCalls:y,selectSession:Y,createSession:p,archiveSession:K,deleteSession:C,sendMessage:Q,stopStreaming:b,pendingMessage:E,clearPendingMessage:m,searchQuery:j,setSearchQuery:M,filteredSessions:T}=cn(n,r),[I,B]=s.useState(!1),[z,G]=s.useState(""),[v,h]=s.useState(null),[u,i]=s.useState(null),[f,x]=s.useState(!0),[P,ye]=s.useState(fn),[W,ae]=s.useState("direct"),[Fe,me]=s.useState(!1),q=ln(n,r),[oe,Ge]=s.useState(new Map),[he,re]=s.useState([]),[je,fe]=s.useState(!0),[ce,ve]=s.useState(!1),[Ie,Me]=s.useState(""),[Re,ke]=s.useState(0),[Ae,ue]=s.useState(""),[ie,ge]=s.useState(!1),[ze,g]=s.useState(0),[k,w]=s.useState(-1),[N,ee]=s.useState(!1),[F,J]=s.useState([]),[Z,te]=s.useState(!1),[U,O]=s.useState(!1),[$,X]=s.useState({}),[,ne]=s.useState(!1),[xe,ns]=s.useState({top:0,left:0}),_=zs({projectId:n}),at=s.useCallback(e=>{if(!e||!_.mentionActive)return;const a=e.getBoundingClientRect();ns({top:a.top-260,left:a.left+8})},[_.mentionActive]),jt=s.useRef(null),rt=s.useRef(!1),ot=s.useRef(null),pe=s.useRef(null),Ee=s.useRef(null),se=s.useRef(null),Mt=s.useRef(null),Rt=s.useRef([]),_e=s.useRef(0),Ue=s.useRef(new Map),V=_s()==="mobile";s.useEffect(()=>{try{const e=localStorage.getItem(Vt);if(!e)return;const a=Number.parseInt(e,10);if(Number.isNaN(a))return;const l=Math.max(Qe,Math.min(Ze,a));ye(l)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(Kt);(e==="direct"||e==="rooms")&&ae(e)}catch{}},[]),s.useEffect(()=>{try{localStorage.setItem(Kt,W)}catch{}},[W]);const{keyboardOverlap:Ve,viewportHeight:At,viewportOffsetTop:Et,keyboardOpen:Oe}=Us({enabled:V&&!!o}),Tt=Ve>0||Et>0,as=Oe&&Tt?{"--keyboard-overlap":`${Ve}px`,"--vv-offset-top":`${Et}px`,...At!==null?{"--vv-height":`${At}px`}:{}}:{},le=s.useMemo(()=>{const e=Ie.trim().toLowerCase();return(e?he.filter(l=>l.name.toLowerCase().includes(e)):he).slice(0,10)},[he,Ie]),He=s.useMemo(()=>Array.from(oe.values()),[oe]),Ce=s.useMemo(()=>He.filter(e=>Os(e.name,Ae)),[He,Ae]),it=s.useMemo(()=>{const e=new Map;for(const a of He)e.set(a.name.toLowerCase(),a);return e},[He]);s.useEffect(()=>{ke(0)},[le]),s.useEffect(()=>{g(0)},[Ae,ie]),s.useEffect(()=>()=>{pe.current!==null&&window.clearTimeout(pe.current)},[]);const Pt=s.useCallback(()=>{const e=Ee.current;if(!e)return;const l=e.scrollTop+e.clientHeight>=e.scrollHeight-50;O(!l),rt.current=!l},[]),Ke=s.useCallback(e=>{if(!e.isConnected)return;let a=0,l=0,L=-1;const H=6,de=()=>{if(e.isConnected){if(e.scrollTop=e.scrollHeight,e.scrollHeight===L?l+=1:(l=0,L=e.scrollHeight),a+=1,a>=H||l>=2){O(!1),rt.current=!1;return}window.requestAnimationFrame(de)}};de()},[]),Be=s.useCallback(()=>{const e=Ee.current;e&&Ke(e)},[Ke]);s.useLayoutEffect(()=>{const e=o?.id??null;if(!e){ot.current=null;return}const a={sessionId:e,loaded:!S,hasMessages:c.length>0},l=ot.current,L=l?.sessionId!==e,H=l?.sessionId===e&&!l.loaded&&a.loaded,de=l?.sessionId===e&&!l.hasMessages&&a.hasMessages;if(!(l===null||L||H||de))return;const be=Ee.current;be&&(Ke(be),ot.current=a)},[o?.id,c.length,S,Ke]),s.useEffect(()=>{rt.current||Be()},[c,A,D,R,Be]),s.useEffect(()=>{Ve<=0||!Ee.current||Be()},[Ve,Be]),Hs(V&&Oe),s.useEffect(()=>{const e=()=>h(null);if(v)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[v]),s.useEffect(()=>{if(!V||!Oe)return;const e=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[V,Oe]),s.useEffect(()=>{if(!V||!o)return;const e=()=>{const a=se.current;a&&document.activeElement===a&&(a.blur(),window.setTimeout(()=>{a.focus({preventScroll:!0})},0))};return document.addEventListener("visibilitychange",e),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",e),window.removeEventListener("pageshow",e)}},[V,o]),s.useEffect(()=>{let e=!1;const a=n;return nt(void 0,n).then(l=>{if(e||a!==n)return;const L=new Map;for(const H of l)L.set(H.id,H);Ge(L)}).catch(()=>{}),()=>{e=!0}},[n]),s.useEffect(()=>{let e=!1;return fe(!0),Bs(n).then(a=>{e||re(a)}).catch(()=>{e||re([])}).finally(()=>{e||fe(!1)}),()=>{e=!0}},[n]),s.useEffect(()=>{Rt.current=F},[F]),s.useEffect(()=>()=>{for(const e of Rt.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of Ue.current.values())window.clearTimeout(e);Ue.current.clear()},[]);const qe=s.useCallback(e=>{if(!e||e.length===0)return;const a=[];for(const l of Array.from(e)){if(!gn.includes(l.type))continue;const L=l.type.startsWith("image/");a.push({file:l,previewUrl:L?URL.createObjectURL(l):""})}a.length>0&&J(l=>[...l,...a])},[]),rs=s.useCallback(e=>{J(a=>{const l=a[e];return l?.previewUrl&&URL.revokeObjectURL(l.previewUrl),a.filter((L,H)=>H!==e)})},[]),os=s.useCallback(e=>{const a=e.clipboardData?.files;if(!a||a.length===0)return;const l=Array.from(a).filter(L=>L.type.startsWith("image/"));l.length!==0&&qe(l)},[qe]),is=s.useCallback(async e=>{try{await p(e),B(!1),V&&x(!1)}catch{r("Failed to create chat session","error")}},[p,r,V]),ct=s.useCallback(()=>{G(""),ve(!1),Me(""),ge(!1),ue(""),w(-1),J(e=>{for(const a of e)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[]),lt=s.useCallback(()=>{const e=z.trim(),a=F.map(l=>l.file);if(!(!e&&a.length===0||!o)){if(e==="/clear"){ct(),b(),m(),p({agentId:o.agentId,modelProvider:o.modelProvider??void 0,modelId:o.modelId??void 0}).catch(()=>{r("Failed to clear conversation","error")});return}ct(),Q(e,a)}},[z,F,o,ct,b,m,p,r,Q]),dt=s.useCallback(e=>{G(a=>{const l=qt(a);if(!l)return a;const L=`/skill:${e.name} `,H=a.slice(0,l.start)+L+a.slice(l.end);return window.requestAnimationFrame(()=>{se.current&&(se.current.style.height="auto",se.current.style.height=`${Math.min(se.current.scrollHeight,120)}px`,se.current.focus())}),H}),ve(!1),Me(""),ke(0)},[]),ut=s.useCallback(e=>{const a=se.current;if(!a||k<0)return;const l=a.selectionStart??_e.current,L=a.selectionEnd??l,H=Math.max(l,L),de=Math.min(k,H),be=`${`@${e.name.replace(/\s+/g,"_")}`} `,wt=z.slice(0,de)+be+z.slice(H),De=de+be.length;G(wt),ge(!1),ue(""),g(0),w(-1),window.requestAnimationFrame(()=>{se.current&&(se.current.style.height="auto",se.current.style.height=`${Math.min(se.current.scrollHeight,120)}px`,se.current.focus(),se.current.setSelectionRange(De,De))})},[k,z]),Dt=s.useCallback(e=>{if(_e.current=e.currentTarget.selectionStart??_e.current,_.mentionActive&&_.files.length>0){if(_.handleKeyDown(e,z),e.key==="Enter"||e.key==="Tab"){const a=_.files[_.selectedIndex];if(a){const l=_.selectFile(a,z);G(l),_.dismissMention(),ne(!1)}}return}if(ie&&e.key==="ArrowDown"){e.preventDefault(),Ce.length>0&&g(a=>(a+1)%Ce.length);return}if(ie&&e.key==="ArrowUp"){e.preventDefault(),Ce.length>0&&g(a=>a===0?Ce.length-1:a-1);return}if(ie&&e.key==="Enter"){e.preventDefault();const a=Ce[ze]??Ce[0];a&&ut(a);return}if(ie&&e.key==="Escape"){e.preventDefault(),ge(!1),ue(""),w(-1);return}if(ce&&e.key==="ArrowDown"){e.preventDefault(),le.length>0&&ke(a=>(a+1)%le.length);return}if(ce&&e.key==="ArrowUp"){e.preventDefault(),le.length>0&&ke(a=>a===0?le.length-1:a-1);return}if(ce&&(e.key==="Enter"||e.key==="Tab")&&le.length>0){e.preventDefault();const a=le[Re]??le[0];a&&dt(a);return}if(ce&&e.key==="Escape"){e.preventDefault(),ve(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),lt())},[ie,Ce,ze,ut,ce,le,Re,dt,lt,_,z]),Je=s.useCallback((e,a)=>{const l=pn(e,a);if(l){ge(!0),ue(l.filter),w(l.start);return}ge(!1),ue(""),w(-1)},[]),$t=s.useCallback(e=>{const a=e.target,l=a.value,L=a.selectionStart??l.length;_e.current=L,G(l);const H=qt(l);H?(ve(!0),Me(H.filter)):(ve(!1),Me("")),Je(l,L),_.detectMention(l,L),ne(_.mentionActive),_.mentionActive&&at(a),a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`},[Je]),mt=s.useCallback(e=>{const a=e.currentTarget,l=a.selectionStart??a.value.length;_e.current=l,Je(a.value,l),_.detectMention(a.value,l),ne(_.mentionActive),_.mentionActive&&at(a)},[Je,_,at]),cs=s.useCallback(e=>{e.key!=="Escape"&&mt(e)},[mt]),ls=s.useCallback(()=>{pe.current!==null&&window.clearTimeout(pe.current),pe.current=window.setTimeout(()=>{ve(!1),ge(!1),ue(""),w(-1),ne(!1),_.dismissMention(),pe.current=null},120)},[_]),ds=s.useCallback(()=>{pe.current!==null&&(window.clearTimeout(pe.current),pe.current=null),typeof window<"u"&&window.innerWidth<=768&&window.setTimeout(()=>{(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},0)},[]),us=s.useCallback(async e=>{h(null);try{await K(e),r("Conversation archived","success")}catch{r("Failed to archive conversation","error")}},[K,r]),ms=s.useCallback(async e=>{i(null),h(null);try{await C(e),r("Conversation deleted","success")}catch{r("Failed to delete conversation","error")}},[C,r]),We=s.useCallback(e=>{try{localStorage.setItem(Vt,String(e))}catch{}},[]),hs=s.useCallback(e=>{if(V)return;e.preventDefault(),e.stopPropagation();const a=e.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(e.pointerId);const l=e.clientX,L=P;let H=L;document.body.style.userSelect="none";const de=be=>{const wt=be.clientX-l,De=Math.max(Qe,Math.min(Ze,L+wt));H=De,ye(De),We(De)},Pe=be=>{typeof a.releasePointerCapture=="function"&&a.releasePointerCapture(be.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",de),document.removeEventListener("pointerup",Pe),We(H)};document.addEventListener("pointermove",de),document.addEventListener("pointerup",Pe)},[V,We,P]),fs=s.useCallback(e=>{if(V||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const a=e.shiftKey?50:10,l=e.key==="ArrowLeft"?-a:a,L=Math.max(Qe,Math.min(Ze,P+l));ye(L),We(L)},[V,We,P]),gs=s.useCallback(e=>{Y(e),V&&x(!1)},[Y,V]),ps=s.useCallback(()=>{Y(""),x(!0)},[Y]),bs=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(sn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>B(!0),children:[t.jsx(Ye,{size:16}),"New Chat"]})]}),Ne=Gt(o?.modelProvider,o?.modelId),Te=o?.modelProvider??null,ht=!!(o||R||c.length>0),Lt=o?.agentId===Le?Ne??"Fusion":o?.title||oe.get(o?.agentId??"")?.name||o?.agentId||"Chat",vs=!!(Ne&&Ne!==Lt),ft=oe.get(o?.agentId??"")?.name||(o?.agentId===Le?Ne??"Fusion":o?.agentId?.slice(0,30)??"Fusion"),gt=!1,pt=o?.agentId===Le,xs=E.length>50?`${E.slice(0,50)}…`:E,ws=s.useCallback(()=>{ee(e=>!e)},[]),bt=s.useCallback((e,a)=>{const l=Ue.current.get(e);l&&window.clearTimeout(l),X(H=>({...H,[e]:a}));const L=window.setTimeout(()=>{X(H=>{const{[e]:de,...Pe}=H;return Pe}),Ue.current.delete(e)},2e3);Ue.current.set(e,L)},[]),Ft=s.useCallback(async(e,a)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(a),bt(e,"success")}catch{bt(e,"error")}},[bt]),Ss=s.useCallback((e,a=!1)=>a?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:e}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(Qt,{remarkPlugins:[Zt],components:ss,children:e})}),[]),vt=o?.agentId===Le,xt=s.useCallback((e,a,l)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${$[e]==="success"?" chat-message-copy-action--success":""}${$[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":l??`chat-copy-response-${e}`,"aria-label":$[e]==="success"?"Response copied":$[e]==="error"?"Copy failed":"Copy response",onClick:()=>{Ft(e,a)},children:$[e]==="success"?t.jsx(Ws,{size:14}):t.jsx(Gs,{size:14})}),[$,Ft]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${f?"":" chat-sidebar--hidden"}`,style:V?void 0:{width:`${P}px`},children:[t.jsxs("div",{className:"chat-sidebar-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[t.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${W==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":W==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>ae("direct"),children:"Direct"}),t.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${W==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":W==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>ae("rooms"),children:"Rooms"})]}),W==="direct"?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-sidebar-search-container",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Vs,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:j,onChange:e=>M(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:d?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):T.length===0?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):T.map(e=>t.jsxs("div",{className:`chat-session-item${o?.id===e.id?" chat-session-item--active":""}`,onClick:()=>gs(e.id),onContextMenu:a=>{a.preventDefault(),h({sessionId:e.id,x:a.clientX,y:a.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:a=>{a.stopPropagation(),i(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(_t,{size:14})}),t.jsx("div",{className:"chat-session-title",children:e.title||"Untitled"}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||"No messages"}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[e.modelProvider&&t.jsx(et,{provider:e.modelProvider,size:"sm"}),t.jsx("span",{children:oe.get(e.agentId)?.name||(e.agentId===Le?Gt(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?es(e.updatedAt):""})]})]},e.id))})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[t.jsx("div",{className:"chat-sidebar-rooms-header",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>me(!0),children:[t.jsx(Ye,{size:14}),"Create room"]})}),q.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:"No rooms yet."}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:q.rooms.map(e=>{const a=q.activeRoom?.id===e.id,l=a?q.activeRoomMembers.length:"—";return t.jsxs("button",{type:"button",className:`chat-room-item${a?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{q.selectRoom(e.id),V&&x(!1)},children:[t.jsxs("span",{className:"chat-room-item-name",children:["#",e.name]}),t.jsxs("span",{className:"chat-room-item-meta",children:[l," ",l===1?"member":"members"]})]},e.id)})})]}),t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>B(!0),"data-testid":"chat-new-btn",children:[t.jsx(Ye,{size:14}),"New Chat"]})})]}),!V&&f&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":Qe,"aria-valuemax":Ze,"aria-valuenow":P,"aria-label":"Resize chat sidebar",tabIndex:0,onPointerDown:hs,onKeyDown:fs}),v&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:v.y,left:v.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>us(v.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Ks,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{h(null),i(v.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(_t,{size:14}),"Delete"]})]}),u&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>i(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Conversation?"}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:"This action cannot be undone. All messages in this conversation will be permanently deleted."}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>i(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void ms(u),children:"Delete"})]})]})}),W==="rooms"?t.jsxs("div",{className:"chat-thread",children:[q.activeRoom?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-room-thread-header",children:[V&&t.jsx("button",{className:"btn-icon",onClick:()=>{q.selectRoom(null),x(!0)},"data-testid":"chat-back-btn",children:t.jsx(Ut,{size:16})}),t.jsxs("div",{className:"chat-thread-header-title",children:["#",q.activeRoom.name]}),t.jsx("div",{className:"chat-room-thread-members",children:q.activeRoomMembers.map(e=>t.jsx(Xt,{agent:oe.get(e.agentId)??null},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:Ee,onScroll:Pt,children:[q.messagesLoading?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):q.messages.length===0?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):q.messages.map(e=>{const a=e.senderAgentId?oe.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):"You",l={id:e.id,sessionId:e.roomId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:e.attachments,createdAt:e.createdAt};return t.jsx(kt,{message:l,forcePlain:N,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:q.activeRoom?.id??null,mentionAgentsByName:it},e.id)}),t.jsx("div",{ref:jt})]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:"Select a room or create one"}),q.activeRoom&&t.jsx("div",{className:"chat-input-area",children:t.jsxs("div",{className:"chat-input-row",children:[t.jsx("div",{className:"chat-input-wrapper",children:t.jsx("textarea",{ref:se,className:"chat-input-textarea",placeholder:"Type a message...",value:z,onChange:$t,onKeyDown:Dt,rows:1,"data-testid":"chat-input"})}),t.jsx("button",{type:"button",className:"chat-input-send",onClick:()=>{const e=z.trim();e&&q.sendRoomMessage(e).then(()=>{G("")})},disabled:!z.trim(),"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(Ot,{size:16})})]})})]}):t.jsxs("div",{className:`chat-thread${Oe&&Tt?" chat-thread--keyboard-active":""}`,style:as,children:[(ht||!V)&&t.jsxs("div",{className:"chat-thread-header",children:[V&&ht&&t.jsx("button",{className:"btn-icon",onClick:ps,"data-testid":"chat-back-btn",children:t.jsx(Ut,{size:16})}),t.jsxs("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:[Te?t.jsx(et,{provider:Te,size:"md"}):t.jsx(st,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Lt}),vs&&t.jsx("span",{className:"chat-model-tag",children:Ne})]}),ht&&t.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${N?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":N?"Show all messages as rendered Markdown":"Show all messages as plain text",onClick:ws,children:N?t.jsx(qs,{size:14}):t.jsx(Js,{size:14})}),!V&&t.jsxs("button",{className:"btn btn-sm btn-primary chat-thread-header-new-chat",onClick:()=>B(!0),"data-testid":"chat-thread-new-chat-btn",children:[t.jsx(Ye,{size:14}),"New Chat"]})]}),t.jsxs("div",{className:"chat-messages",ref:Ee,onScroll:Pt,children:[R?t.jsxs(t.Fragment,{children:[c.map(e=>t.jsx(kt,{message:e,forcePlain:N,agentName:ft,hideAssistantIdentity:pt,showAssistantModelTag:gt,activeModelTag:Ne,activeModelProvider:Te,activeSessionId:o?.id??null,mentionAgentsByName:it,copyAction:vt&&e.role==="assistant"?xt(e.id,e.content):void 0},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!pt&&t.jsxs("div",{className:"chat-message-avatar",children:[Te?t.jsx(et,{provider:Te,size:"sm"}):t.jsx(st,{size:14}),t.jsx("span",{children:ft}),gt]}),A?Ss(A,N):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:D?"Thinking…":"Connecting…"}),vt&&A&&xt("__streaming__",A,"chat-copy-response-streaming"),ts(y),D&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:D})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):S?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):c.length===0&&!o?bs():c.length===0&&o?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):t.jsx(t.Fragment,{children:c.map(e=>t.jsx(kt,{message:e,forcePlain:N,agentName:ft,hideAssistantIdentity:pt,showAssistantModelTag:gt,activeModelTag:Ne,activeModelProvider:Te,activeSessionId:o?.id??null,mentionAgentsByName:it,copyAction:vt&&e.role==="assistant"?xt(e.id,e.content):void 0},e.id))}),t.jsx("div",{ref:jt})]}),U&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:Be,children:[t.jsx(Ys,{size:14}),"Latest"]}),o&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Mt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{qe(e.target.files),e.target.value=""}}),ce&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:je?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):le.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:Ie?"No skills found":"No skills available"}):le.map((e,a)=>t.jsxs("button",{type:"button",role:"option","aria-selected":a===Re,className:`chat-skill-menu-item${a===Re?" chat-skill-menu-item--highlighted":""}`,onMouseDown:l=>l.preventDefault(),onMouseEnter:()=>ke(a),onClick:()=>dt(e),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.relativePath,children:e.relativePath})]},e.id))}),F.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:F.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>rs(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":"Attach files",onClick:()=>Mt.current?.click(),children:t.jsx(Xs,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${Z?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),te(!0)},onDragLeave:()=>te(!1),onDrop:e=>{e.preventDefault(),te(!1),qe(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:se,className:"chat-input-textarea",placeholder:"Type a message...",value:z,onChange:$t,onKeyDown:Dt,onKeyUp:cs,onClick:mt,onBlur:ls,onFocus:ds,onPaste:os,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(Qs,{agents:He,filter:Ae,highlightedIndex:ze,visible:ie,onSelect:ut,position:"below"}),t.jsx(Zs,{visible:_.mentionActive&&!ie,position:xe,files:_.files,selectedIndex:_.selectedIndex,onSelect:e=>{const a=_.selectFile(e,z);G(a),_.dismissMention(),ne(!1),se.current?.focus()},loading:_.loading}),E&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${xs}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:m,children:"×"})]})]}),R?t.jsx("button",{className:"chat-input-stop",onClick:b,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(en,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{e.pointerType&&e.pointerType!=="mouse"&&e.preventDefault()},onMouseDown:e=>{e.preventDefault()},onClick:()=>{lt()},disabled:!z.trim()&&F.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(Ot,{size:16})})]})]})]}),t.jsx(un,{isOpen:Fe,onClose:()=>me(!1),projectId:n,existingRoomNames:q.rooms.map(e=>e.name),onCreate:async e=>{await q.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),me(!1)}}),I&&t.jsx(bn,{projectId:n,onClose:()=>B(!1),onCreate:is})]})}export{yn as ChatView};
@@ -0,0 +1 @@
1
+ .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%}}