@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
@@ -1,18 +0,0 @@
1
- import{r as t,j as e}from"./vendor-react-K0fH_qHe.js";import{c as ms,dt as mt,du as ht,dv as ft,dw as gt,L as O,R as hs,at as As,Z as xt,au as as,a1 as Ke,a as Bs,b as Os,dx as bt,dy as vt,dz as pt,D as _s,cD as jt,dA as Nt,J as G,dB as yt,dC as Is,dD as Vs,s as Ge,bd as St,p as Us,$ as ns,a0 as Es,aR as Fe,X as Js,F as Le,A as qe,dE as Ws,dF as Gs,dG as kt,cx as Ct,aQ as Rt,bE as wt,av as qs,B as Ys,a3 as Mt,a7 as Ft,a9 as At,dH as ds,q as Ks,dI as Et,bH as Tt,r as Pt,as as $t,a6 as Zs,dJ as Dt,C as ie,dK as Qs,dL as Lt,dM as zt,dN as Ht,dO as ze,ae as He,ag as Be,ah as Oe,ac as Xs,dP as Bt,dQ as Ot,n as _t,m as It,o as Ts,a4 as Vt,dR as Ut,dS as Jt,t as Wt,dT as us,a8 as Gt,dU as qt,Y as Yt,dV as Kt,dW as Zt,dX as et,dY as Qt,dZ as Xt,d_ as ea,d$ as sa}from"./index-D__RMku8.js";import{S as st}from"./star-BAT_ObKE.js";import{f as is,S as ta}from"./agentSkills-B-w5wFHh.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
- * @license lucide-react v1.7.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const aa=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]],Ye=ms("chart-column",aa);/**
7
- * @license lucide-react v1.7.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const na=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M17 12h-2l-2 5-2-10-2 5H7",key:"15hlnc"}]],ia=ms("square-activity",na);/**
12
- * @license lucide-react v1.7.0 - ISC
13
- *
14
- * This source code is licensed under the ISC license.
15
- * See the LICENSE file in the root directory of this source tree.
16
- */const ra=[["path",{d:"M16 17h6v-6",key:"t6n2it"}],["path",{d:"m22 17-8.5-8.5-5 5L2 7",key:"x473p"}]],la=ms("trending-down",ra);function Ps(s){return s<1e3?`${s}ms`:s<6e4?`${(s/1e3).toFixed(1)}s`:s<36e5?`${Math.floor(s/6e4)}m`:`${(s/36e5).toFixed(1)}h`}function ca(s){return`${Math.round(s*100)}%`}function $s(s){const n=Date.now(),i=new Date(s).getTime(),c=n-i;if(c<0){const m=Math.abs(c);return m<6e4?"in a moment":m<36e5?`in ${Math.floor(m/6e4)}m`:m<864e5?`in ${Math.floor(m/36e5)}h`:`in ${Math.floor(m/864e5)}d`}return c<6e4?"just now":c<36e5?`${Math.floor(c/6e4)}m ago`:c<864e5?`${Math.floor(c/36e5)}h ago`:`${Math.floor(c/864e5)}d ago`}function oa(s){switch(s){case"periodic":return"Periodic";case"post-task":return"Post-Task";case"manual":return"Manual";case"user-requested":return"User Requested";default:return s}}function $e(s){return s instanceof Error&&s.message?s.message:String(s)}function da(s){switch(s){case"improving":return"↑ Improving";case"declining":return"↓ Declining";case"stable":return"→ Stable";default:return"Insufficient data"}}function ua(s){switch(s){case"improving":return"trend-improving";case"declining":return"trend-declining";case"stable":return"trend-stable";default:return"trend-insufficient"}}function Ds(s,n=5){return e.jsx("span",{className:"rating-stars",children:Array.from({length:n},(i,c)=>e.jsx(st,{size:14,className:c<s?"star-filled":"star-empty",fill:c<s?"currentColor":"none"},c))})}function ma({agentId:s,projectId:n,addToast:i}){const[c,m]=t.useState([]),[x,C]=t.useState(null),[g,y]=t.useState(null),[E,S]=t.useState([]),[o,p]=t.useState(!0),[D,T]=t.useState(!0),[R,q]=t.useState(!1),[U,f]=t.useState(!1),[I,K]=t.useState(null),[j,M]=t.useState(0),[v,P]=t.useState(""),[F,V]=t.useState(""),_=t.useCallback(async()=>{try{const[l,r]=await Promise.all([mt(s,20,n),ht(s,void 0,n)]);m(l),C(r)}catch(l){i(`Failed to load reflections: ${$e(l)}`,"error")}finally{p(!1)}},[s,n,i]),Y=t.useCallback(async()=>{try{const[l,r]=await Promise.all([ft(s,n),gt(s,{limit:50},n)]);y(l),S(r)}catch(l){i(`Failed to load ratings: ${$e(l)}`,"error")}finally{T(!1)}},[s,n,i]);t.useEffect(()=>{_(),Y()},[_,Y]);const J=async()=>{q(!0);try{if(!await bt(s,n)){i("Not enough history to generate a reflection yet","error");return}i("Reflection generated successfully","success"),p(!0),await _()}catch(l){const r=$e(l),b=r.toLowerCase();b.includes("agent not found")||b.includes("not found")?i("This agent is no longer available. It may have been deleted.","error"):b.includes("insufficient history")?i("Not enough history to generate a reflection yet","error"):i(`Failed to generate reflection: ${r}`,"error")}finally{q(!1)}},w=async l=>{if(l.preventDefault(),j!==0){f(!0);try{await vt(s,{score:j,category:v||void 0,comment:F||void 0,raterType:"user"},n),M(0),P(""),V(""),i("Rating added","success"),await Y()}catch(r){i(`Failed to add rating: ${$e(r)}`,"error")}finally{f(!1)}}},L=async l=>{try{await pt(s,l,n),i("Rating deleted","success"),await Y()}catch(r){i(`Failed to delete rating: ${$e(r)}`,"error")}},d=l=>{K(r=>r===l?null:l)};if(o&&D)return e.jsx("div",{className:"reflections-tab",children:e.jsxs("div",{className:"reflections-loading-indicator",children:[e.jsx(O,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:"Loading evaluation..."})]})});const h=x&&x.totalTasksCompleted===0&&x.totalTasksFailed===0&&x.recentReflectionCount===0;return e.jsxs("div",{className:"reflections-tab",children:[e.jsxs("div",{className:"reflections-header",children:[e.jsxs("h3",{children:[e.jsx(Ye,{size:16}),"Performance, Reflections & Ratings"]}),e.jsx("button",{className:"btn btn-secondary",onClick:J,disabled:R,title:"Generate a manual reflection",children:R?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:14,className:"animate-spin"}),"Reflecting..."]}):e.jsxs(e.Fragment,{children:[e.jsx(hs,{size:14}),"Reflect Now"]})})]}),x&&!h&&e.jsxs("div",{className:"reflections-stats-grid",children:[e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(As,{size:16,style:{color:"var(--color-success)"}}),x.totalTasksCompleted]}),e.jsx("div",{className:"stat-label",children:"Tasks Completed"})]}),e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(la,{size:16,style:{color:"var(--color-error)"}}),x.totalTasksFailed]}),e.jsx("div",{className:"stat-label",children:"Tasks Failed"})]}),e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(xt,{size:16,style:{color:"var(--in-progress)"}}),Ps(x.avgDurationMs)]}),e.jsx("div",{className:"stat-label",children:"Avg Duration"})]}),e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(Ye,{size:16,style:{color:x.successRate>=.8?"var(--color-success)":x.successRate>=.5?"var(--color-warning)":"var(--color-error)"}}),ca(x.successRate)]}),e.jsx("div",{className:"stat-label",children:"Success Rate"})]}),e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(as,{size:16,style:{color:"var(--color-info)"}}),x.recentReflectionCount]}),e.jsx("div",{className:"stat-label",children:"Reflections"})]})]}),h&&e.jsxs("div",{className:"reflections-no-data",children:[e.jsx(Ye,{size:24,opacity:.3}),e.jsx("p",{children:"No performance data yet"})]}),e.jsxs("div",{className:"reflections-ratings-section",children:[e.jsx("h4",{children:"User Ratings"}),D?e.jsxs("div",{className:"reflections-loading-indicator",children:[e.jsx(O,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:"Loading ratings..."})]}):e.jsxs(e.Fragment,{children:[g&&e.jsxs("div",{className:"rating-summary-card",children:[e.jsxs("div",{className:"rating-score-display",children:[e.jsx("span",{className:"rating-average",children:g.averageScore.toFixed(1)}),Ds(Math.round(g.averageScore))]}),e.jsxs("div",{className:"rating-stats",children:[e.jsxs("span",{className:"rating-count",children:[g.totalRatings," ratings"]}),e.jsx("span",{className:`rating-trend-badge ${ua(g.trend)}`,children:da(g.trend)})]})]}),g&&Object.keys(g.categoryAverages).length>0&&e.jsxs("div",{className:"category-breakdown",children:[e.jsx("h4",{children:"Category Averages"}),Object.entries(g.categoryAverages).map(([l,r])=>e.jsxs("div",{className:"category-item",children:[e.jsx("span",{className:"category-name",children:l}),e.jsx("span",{className:"category-score",children:r.toFixed(1)})]},l))]}),e.jsxs("form",{className:"add-rating-form",onSubmit:w,children:[e.jsx("h4",{children:"Add Rating"}),e.jsx("div",{className:"star-selector",children:[1,2,3,4,5].map(l=>e.jsx("button",{type:"button",className:"star-btn touch-target",onClick:()=>M(l),title:`${l} star${l>1?"s":""}`,children:e.jsx(st,{size:24,fill:l<=j?"currentColor":"none",className:l<=j?"star-filled":"star-empty"})},l))}),e.jsxs("select",{value:v,onChange:l=>P(l.target.value),className:"select add-rating-category-select",children:[e.jsx("option",{value:"",children:"Select category..."}),e.jsx("option",{value:"quality",children:"Quality"}),e.jsx("option",{value:"speed",children:"Speed"}),e.jsx("option",{value:"communication",children:"Communication"}),e.jsx("option",{value:"reliability",children:"Reliability"}),e.jsx("option",{value:"other",children:"Other"})]}),e.jsx("textarea",{value:F,onChange:l=>V(l.target.value),placeholder:"Optional comment...",className:"input add-rating-comment-input",rows:3}),e.jsx("button",{type:"submit",className:"btn btn-task-create",disabled:j===0||U,children:U?"Submitting...":"Submit Rating"})]}),e.jsxs("div",{className:"rating-history",children:[e.jsx("h4",{children:"Rating History"}),E.length===0?e.jsx("p",{className:"no-ratings",children:"No ratings yet"}):E.map(l=>e.jsxs("div",{className:"rating-history-item",children:[e.jsxs("div",{className:"rating-item-header",children:[Ds(l.score),l.category&&e.jsx("span",{className:"rating-category-badge",children:l.category}),e.jsx("span",{className:"rating-time",children:$s(l.createdAt)}),e.jsx("button",{type:"button",className:"rating-delete-btn touch-target",onClick:()=>void L(l.id),title:"Delete rating",children:e.jsx(Ke,{size:14})})]}),l.comment&&e.jsx("p",{className:"rating-comment",children:l.comment})]},l.id))]})]})]}),e.jsxs("div",{className:"reflections-list",children:[e.jsx("h4",{children:"Reflection History"}),o?e.jsxs("div",{className:"reflections-loading-indicator",children:[e.jsx(O,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:"Loading reflections..."})]}):c.length===0?e.jsxs("div",{className:"reflection-empty",children:[e.jsx(as,{size:32,opacity:.3}),e.jsx("p",{children:"No reflections yet"}),e.jsx("p",{className:"text-secondary",children:"Trigger a reflection to get started"})]}):e.jsx("div",{className:"reflection-cards",children:c.map(l=>{const r=I===l.id;return e.jsxs("div",{className:`reflection-card ${r?"reflection-card--expanded":""}`,onClick:()=>d(l.id),role:"button",tabIndex:0,onKeyDown:b=>b.key==="Enter"&&d(l.id),children:[e.jsxs("div",{className:"reflection-card-header",children:[e.jsx("span",{className:`reflection-trigger-badge reflection-trigger-${l.trigger}`,children:oa(l.trigger)}),e.jsx("span",{className:"reflection-timestamp",children:$s(l.timestamp)}),e.jsx("span",{className:"reflection-chevron",children:r?e.jsx(Bs,{size:16}):e.jsx(Os,{size:16})})]}),e.jsx("div",{className:"reflection-summary",children:l.summary}),r&&e.jsxs("div",{className:"reflection-details",children:[l.insights.length>0&&e.jsxs("div",{className:"reflection-insights",children:[e.jsxs("h5",{children:[e.jsx(as,{size:14})," Insights"]}),e.jsx("ul",{children:l.insights.map((b,z)=>e.jsx("li",{children:b},z))})]}),l.suggestedImprovements.length>0&&e.jsxs("div",{className:"reflection-suggestions",children:[e.jsxs("h5",{children:[e.jsx(As,{size:14})," Suggested Improvements"]}),e.jsx("ul",{children:l.suggestedImprovements.map((b,z)=>e.jsx("li",{children:b},z))})]}),l.metrics&&e.jsxs("div",{className:"reflection-metrics",children:[e.jsx("h5",{children:"Metrics"}),e.jsxs("div",{className:"metrics-grid",children:[l.metrics.tasksCompleted!==void 0&&e.jsxs("div",{className:"metric",children:[e.jsx("span",{className:"metric-label",children:"Tasks:"}),e.jsx("span",{className:"metric-value",children:l.metrics.tasksCompleted})]}),l.metrics.tasksFailed!==void 0&&e.jsxs("div",{className:"metric",children:[e.jsx("span",{className:"metric-label",children:"Failed:"}),e.jsx("span",{className:"metric-value",children:l.metrics.tasksFailed})]}),l.metrics.avgDurationMs!==void 0&&e.jsxs("div",{className:"metric",children:[e.jsx("span",{className:"metric-label",children:"Avg Duration:"}),e.jsx("span",{className:"metric-value",children:Ps(l.metrics.avgDurationMs)})]}),l.metrics.errorCount!==void 0&&e.jsxs("div",{className:"metric",children:[e.jsx("span",{className:"metric-label",children:"Errors:"}),e.jsx("span",{className:"metric-value",children:l.metrics.errorCount})]})]})]})]})]},l.id)})})]})]})}function ae(...s){return s.filter(Boolean).join(" ")}function Ae(s){const n=Date.now(),i=new Date(s).getTime(),c=n-i;if(c<0){const m=Math.abs(c);return m<6e4?"in a moment":m<36e5?`in ${Math.floor(m/6e4)}m`:m<864e5?`in ${Math.floor(m/36e5)}h`:`in ${Math.floor(m/864e5)}d`}return c<6e4?"just now":c<36e5?`${Math.floor(c/6e4)}m ago`:c<864e5?`${Math.floor(c/36e5)}h ago`:`${Math.floor(c/864e5)}d ago`}const ha=[{id:"dashboard",label:"Dashboard",icon:ia},{id:"logs",label:"Logs",icon:Le},{id:"runs",label:"Runs",icon:qe},{id:"tasks",label:"Tasks",icon:Ws},{id:"employees",label:"Employees",icon:Gs},{id:"soul",label:"Soul",icon:kt},{id:"instructions",label:"Instructions",icon:Ct},{id:"memory",label:"Agent Memory",icon:Le},{id:"reflections",label:"Evaluation",icon:Ye},{id:"config",label:"Settings",icon:Rt}],fs={idle:{bg:"var(--state-idle-bg)",text:"var(--state-idle-text)",border:"var(--state-idle-border)"},active:{bg:"var(--state-active-bg)",text:"var(--state-active-text)",border:"var(--state-active-border)"},running:{bg:"var(--state-active-bg)",text:"var(--state-active-text)",border:"var(--state-active-border)"},paused:{bg:"var(--state-paused-bg)",text:"var(--state-paused-text)",border:"var(--state-paused-border)"},error:{bg:"var(--state-error-bg)",text:"var(--state-error-text)",border:"var(--state-error-border)"}},Ze={completed:{icon:ie,color:"var(--color-success)"},failed:{icon:Dt,color:"var(--color-error)"},active:{icon:O,color:"var(--in-progress)"},terminated:{icon:Fe,color:"var(--text-muted)"}},Ls={"long-term":"Long-term",daily:"Daily",dreams:"Dreams"},fa={"long-term":"Curated durable decisions, conventions, constraints, and pitfalls for this specific agent.",daily:"Raw daily observations and open loops recorded by this agent.",dreams:"Synthesized patterns and emerging themes distilled from this agent's daily memory."},ga=Zs(us),xa=700;function ba(s,n){return s.some(i=>i.path===n)?n:s.find(i=>i.layer==="long-term")?.path??s[0]?.path??""}function za({agentId:s,projectId:n,onClose:i,addToast:c,onChildClick:m,inline:x=!1,showInlineBackButton:C=!1,initialTab:g,initialRunId:y,preferActiveRun:E=!1,onMutationSuccess:S}){const[o,p]=t.useState(null),{confirm:D}=_s(),[T,R]=t.useState([]),[q,U]=t.useState(!0),[f,I]=t.useState(g??"dashboard"),[K,j]=t.useState(!1),[M,v]=t.useState(!1),[P,F]=t.useState(null),V=t.useRef(null),_=t.useRef(!1);jt(V,!x,"fusion:agent-detail-modal-size");const Y=t.useRef(i),J=t.useRef(c),w=t.useRef(null),L=t.useRef(!1),d=t.useRef(null),h=t.useRef(0),l=t.useRef(s),r=t.useRef(n);Y.current=i,J.current=c,w.current=o;const b=t.useCallback(async()=>{w.current===null&&U(!0);try{const X=await Nt(s,n);p(X)}catch(X){J.current(`Failed to load agent: ${G(X)}`,"error"),Y.current()}finally{U(!1)}},[s,n]),z=t.useCallback(async()=>{const N=h.current,X=s,ee=n,Z=()=>h.current!==N||s!==X||n!==ee;try{if(o?.taskId){F(null),d.current=null;const we=await yt(o.taskId,ee,{limit:100});if(Z())return;R(we.entries);return}const me=await Is(X,1,ee);if(Z())return;const le=me[0]??null;if(F(le),!le){d.current=null,R([]);return}if(d.current===le.id)return;const je=await Vs(X,le.id,ee);if(Z())return;R(je),d.current=le.id}catch(me){if(Z())return;console.error("Failed to load agent logs:",me)}},[o?.taskId,s,n]),ue=t.useCallback(N=>{L.current=N},[]),ce=t.useCallback(async(N=!1)=>{await S?.({agentId:s,deleted:N})},[s,S]),fe=t.useCallback(async()=>{await b(),await ce(!1)},[b,ce]);t.useEffect(()=>{b()},[b]),t.useEffect(()=>{const N=setInterval(()=>{b()},3e4);return()=>{clearInterval(N)}},[b]),t.useEffect(()=>{o&&f==="logs"&&z()},[o,f,z]),t.useEffect(()=>{f!=="logs"&&(d.current=null)},[f]),t.useEffect(()=>{if(f!=="logs"||o?.taskId||!P||P.status!=="active")return;const N=h.current,X=s,ee=P.id,Z=n?`?projectId=${encodeURIComponent(n)}`:"",me=Ge(`/api/agents/${encodeURIComponent(X)}/runs/${encodeURIComponent(ee)}/logs/stream${Z}`,{events:{"agent:log":le=>{if(h.current===N)try{const je=JSON.parse(le.data);R(we=>[...we,je])}catch{}}},onOpen:()=>{h.current===N&&j(!0)},onError:()=>{h.current===N&&j(!1)}});return()=>{me(),h.current===N&&j(!1)}},[f,o?.taskId,s,n,P]),t.useEffect(()=>{(l.current!==s||r.current!==n)&&(l.current=s,r.current=n,h.current++,R([]),j(!1),F(null),d.current=null,L.current=!1)},[s,n]),t.useEffect(()=>{const N=n?`?projectId=${encodeURIComponent(n)}`:"",X=h.current;return Ge(`/api/events${N}`,{events:{"agent:updated":ee=>{if(h.current===X)try{const Z=JSON.parse(ee.data);if(!Z||typeof Z!="object"||Z.id!==s||L.current)return;b()}catch{}}}})},[s,n,b]),t.useEffect(()=>{if(f!=="logs"||!o?.taskId){j(!1);return}const N=h.current,X=o.taskId,ee=n?`?projectId=${encodeURIComponent(n)}`:"",Z=Ge(`/api/tasks/${encodeURIComponent(X)}/logs/stream${ee}`,{events:{"agent:log":me=>{if(h.current===N)try{const le=JSON.parse(me.data);R(je=>[...je,le])}catch{}}},onOpen:()=>{h.current===N&&j(!0)},onError:()=>{h.current===N&&j(!1)}});return()=>{Z(),h.current===N&&j(!1)}},[o?.taskId,f,n]);const Q=async N=>{if(M||!w.current)return;const X=w.current.state;if(X!==N){v(!0),p(ee=>ee&&{...ee,state:N});try{await Ft(s,N,n),c(`Agent state updated to ${N}`,"success"),await fe()}catch(ee){p(Z=>Z&&{...Z,state:X}),c(`Failed to update state: ${G(ee)}`,"error")}finally{v(!1)}}},se=async()=>{if(!(!o||!await D({title:"Delete Agent",message:`Delete agent "${o.name}"? This cannot be undone.`,danger:!0})))try{await At(s,n),c(`Agent "${o.name}" deleted`,"success"),await ce(!0),i()}catch(X){c(`Failed to delete agent: ${G(X)}`,"error")}},A=()=>o?Mt(o):{label:"Unknown",icon:e.jsx(Ys,{size:14}),color:"var(--text-muted)",stateDerived:!1},re=()=>{o&&(navigator.clipboard.writeText(o.id),c("Agent ID copied to clipboard","success"))};if(q)return x?e.jsx("div",{className:"agent-detail-inline-loading",role:"region","aria-label":"Agent detail loading",children:e.jsxs("div",{className:"agent-detail-loading",children:[e.jsx(O,{className:"animate-spin",size:24}),e.jsx("span",{children:"Loading agent..."})]})}):e.jsx("div",{className:"agent-detail-overlay",onMouseDown:N=>{N.target===N.currentTarget&&(_.current=!0)},onMouseUp:N=>{_.current&&N.target===N.currentTarget&&i(),_.current=!1},role:"dialog","aria-modal":"true",children:e.jsx("div",{className:"agent-detail-modal",ref:V,children:e.jsxs("div",{className:"agent-detail-loading",children:[e.jsx(O,{className:"animate-spin",size:24}),e.jsx("span",{children:"Loading agent..."})]})})});if(!o)return null;const ge=fs[o.state],pe=A(),Qe=x?"agent-detail-inline":"agent-detail-modal";return e.jsx("div",{className:x?"agent-detail-inline-shell":"agent-detail-overlay",onClick:N=>!x&&N.target===N.currentTarget&&i(),role:x?"region":"dialog","aria-label":x?"Agent detail":void 0,"aria-modal":x?void 0:"true",children:e.jsxs("div",{className:Qe,ref:V,children:[e.jsxs("div",{className:"agent-detail-header",children:[e.jsxs("div",{className:"agent-detail-identity",children:[x&&C?e.jsxs("button",{type:"button",className:"btn agent-detail-inline-back",onClick:i,"aria-label":"Back to agents",children:[e.jsx(St,{size:16}),"Agents"]}):null,e.jsx("div",{className:"agent-detail-icon",children:e.jsx(Us,{agent:o,size:36})}),e.jsxs("div",{className:"agent-detail-info",children:[e.jsx("h2",{children:o.name}),e.jsxs("div",{className:"agent-detail-badges",children:[e.jsx("span",{className:"badge",style:{background:ge.bg,color:ge.text,border:`1px solid ${ge.border}`},children:o.state}),e.jsxs("span",{className:"badge",style:{color:pe.color},title:pe.reason??pe.label,children:[pe.icon,!pe.stateDerived&&pe.label]})]})]})]}),e.jsxs("div",{className:"agent-detail-header-actions",children:[e.jsxs("div",{className:"agent-detail-controls",children:[o.state==="idle"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-task-create btn--compact",onClick:()=>void Q("active"),disabled:M,children:[e.jsx(ns,{size:14}),"Start"]}),e.jsxs("button",{className:"btn btn--danger btn--compact",onClick:se,children:[e.jsx(Ke,{size:14}),"Delete"]})]}),o.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--compact agent-detail-mobile-icon-control",onClick:()=>void Q("paused"),disabled:M,"aria-label":"Pause",children:[e.jsx(Es,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:"Pause"})]}),e.jsxs("button",{className:"btn btn--danger btn--compact",onClick:()=>void Q("paused"),disabled:M,children:[e.jsx(Fe,{size:14}),"Stop"]})]}),o.state==="paused"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-task-create btn--compact agent-detail-mobile-icon-control",onClick:()=>void Q("active"),disabled:M,"aria-label":"Resume",children:[e.jsx(ns,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:"Resume"})]}),e.jsxs("button",{className:"btn btn--danger btn--compact",onClick:se,children:[e.jsx(Ke,{size:14}),"Delete"]})]}),o.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--compact agent-detail-mobile-icon-control",onClick:()=>void Q("paused"),disabled:M,"aria-label":"Pause",children:[e.jsx(Es,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:"Pause"})]}),e.jsxs("button",{className:"btn btn--danger btn--compact",onClick:()=>void Q("paused"),disabled:M,children:[e.jsx(Fe,{size:14}),"Stop"]})]}),o.state==="error"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-task-create btn--compact",onClick:()=>void Q("active"),disabled:M,children:[e.jsx(ns,{size:14}),"Retry"]}),e.jsxs("button",{className:"btn btn--danger btn--compact",onClick:()=>void Q("paused"),disabled:M,children:[e.jsx(Fe,{size:14}),"Stop"]})]})]}),e.jsxs("div",{className:"agent-detail-utility-actions",children:[e.jsx("button",{className:"btn-icon",onClick:()=>void b(),title:"Refresh","aria-label":"Refresh",children:e.jsx(hs,{size:16})}),!x&&e.jsx("button",{className:"btn-icon",onClick:i,"aria-label":"Close",title:"Close",children:e.jsx(Js,{size:20})})]})]})]}),e.jsx("div",{className:"agent-detail-tabs",children:ha.map(N=>e.jsxs("button",{className:ae("agent-detail-tab",f===N.id&&"active"),onClick:()=>I(N.id),children:[e.jsx(N.icon,{size:16}),N.label]},N.id))}),e.jsxs("div",{className:"agent-detail-content",children:[f==="dashboard"&&e.jsx(va,{agent:o,health:pe,onChildClick:m,projectId:n}),f==="logs"&&e.jsx(pa,{logs:T,isStreaming:K,hasTask:!!o.taskId||T.length>0||P!==null,fallbackLabel:!o.taskId&&P?`Latest run · ${P.id.slice(0,8)}`:null}),f==="runs"&&e.jsx(ja,{addToast:c,agentId:o.id,projectId:n,agentState:o.state,agentName:o.name,initialRunId:y,preferActiveRun:E}),f==="tasks"&&e.jsx(ka,{agentId:o.id,projectId:n,addToast:c}),f==="employees"&&e.jsx(Ea,{agentId:o.id,projectId:n,onChildClick:m}),f==="soul"&&e.jsx(Ra,{agent:o,projectId:n,addToast:c,onSaved:fe}),f==="instructions"&&e.jsx(Ma,{agent:o,projectId:n,addToast:c,onSaved:fe}),f==="memory"&&e.jsx(wa,{agent:o,projectId:n,addToast:c,onSaved:fe}),f==="reflections"&&e.jsx(ma,{agentId:o.id,projectId:n,addToast:c}),f==="config"&&e.jsx(Aa,{agent:o,projectId:n,addToast:c,onSaved:fe,onHasChangesChange:ue,onDelete:se},o.id)]}),!x&&e.jsxs("div",{className:"agent-detail-footer",children:[e.jsx("button",{className:"btn-icon",onClick:re,title:"Copy Agent ID",children:e.jsx(wt,{})}),e.jsx("span",{className:"agent-detail-id",onClick:re,children:o.id}),o.taskId&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"divider",children:"|"}),e.jsx("span",{className:"text-muted",children:"Working on:"}),e.jsxs("a",{href:`/tasks/${o.taskId}`,className:"link",children:[o.taskId,e.jsx(qs,{size:12})]})]})]})]})})}function va({agent:s,health:n,onChildClick:i,projectId:c}){const m=fs[s.state],[x,C]=t.useState([]),[g,y]=t.useState(!0),[E,S]=t.useState(null),[o,p]=t.useState([]),[D,T]=t.useState(null),[R,q]=t.useState(null),[U,f]=t.useState(!1),[I,K]=t.useState(null),j=typeof s.runtimeConfig?.runtimeHint=="string"?s.runtimeConfig.runtimeHint:"",M=(()=>{const d=s.runtimeConfig??{};if(j){const h=o.find(l=>l.runtimeId===j);return h?h.name:j}if(d.modelProvider&&d.modelId)return`${d.modelProvider}/${d.modelId}`;if(typeof d.model=="string"&&d.model.includes("/")){const h=d.model.indexOf("/");return d.model.slice(h+1)}return null})();t.useEffect(()=>{ds(s.id,c).then(S).catch(()=>S(null))},[s.id,c]),t.useEffect(()=>{Ks(c).then(p).catch(()=>p([]))},[c]),t.useEffect(()=>{let d=!1;return y(!0),Et(s.id,c).then(h=>{if(d)return;const l=h.length>0&&h[0]?.id===s.id?[...h].reverse():h;C(l)}).catch(()=>{d||C([])}).finally(()=>{d||y(!1)}),()=>{d=!0}},[s.id,c]);const v=t.useMemo(()=>{const d=s.completedRuns||[],h=new Date;h.setHours(0,0,0,0);const l=d.filter(b=>new Date(b.startedAt)>=h),r=d.filter(b=>b.status==="completed");return{totalRuns:d.length,todayRuns:l.length,successfulRuns:r.length,successRate:d.length>0?Math.round(r.length/d.length*100):0}},[s]),P=(s.completedRuns||[]).slice(0,5),F=Array.isArray(s.metadata?.skills)?s.metadata.skills:[],V=D?is(D):null,_=t.useCallback(async d=>{f(!0),K(null),q(null);try{const h=await Tt(d,c);q(h)}catch(h){K(G(h))}finally{f(!1)}},[c]),Y=t.useCallback(d=>{if(D===d){T(null),q(null),K(null),f(!1);return}T(d),_(d)},[_,D]),J=s.state==="active"||s.state==="running",w=Pt(s.runtimeConfig?.heartbeatIntervalMs),L=J&&s.lastHeartbeatAt?new Date(new Date(s.lastHeartbeatAt).getTime()+w).toISOString():null;return e.jsxs("div",{className:"dashboard-tab dashboard-summary-layout",children:[E?.isOverBudget&&e.jsxs("div",{className:"budget-warning-banner",role:"alert",children:[e.jsx("span",{children:"⚠️"}),e.jsxs("span",{children:[e.jsx("strong",{children:"Budget Exhausted:"})," This agent has exceeded its token budget and may operate with limited functionality."]})]}),e.jsxs("section",{className:"dashboard-summary-card dashboard-summary-hero",children:[e.jsxs("div",{className:"dashboard-summary-hero__heading",children:[e.jsx(Ys,{}),e.jsx("h3",{children:"Overview"}),e.jsx("strong",{children:s.name}),e.jsx("span",{className:"inline-badge",style:{background:m.bg,color:m.text},children:s.state})]}),e.jsxs("div",{className:"dashboard-summary-hero__meta",children:[e.jsxs("span",{className:"dashboard-summary-hero__health",title:n.reason??n.label,children:[n.icon," ",n.label]}),e.jsxs("span",{children:["Role: ",s.role]}),e.jsxs("span",{children:[e.jsx("span",{className:"dashboard-summary-label",children:j?"Runtime":"Model"}),e.jsxs("span",{children:[" ",M??"Auto"]})]}),F.length>0?e.jsxs("span",{className:"dashboard-summary-skills",children:[e.jsx("span",{className:"dashboard-summary-label",children:"Skills"}),e.jsx("span",{className:"dashboard-summary-skill-badges",role:"list","aria-label":"Assigned skills",children:F.map(d=>{const h=D===d;return e.jsx("button",{type:"button",className:ae("badge","badge-skill","dashboard-summary-skill-badge","dashboard-summary-skill-badge-btn",h&&"dashboard-summary-skill-badge--selected"),title:d,onClick:()=>Y(d),"aria-expanded":h,"aria-label":`View details for ${is(d)}`,children:is(d)},d)})})]}):e.jsx("span",{children:"Skills: —"})]}),D?e.jsxs("div",{className:"dashboard-summary-skill-detail","data-testid":"agent-skill-detail",children:[e.jsxs("div",{className:"dashboard-summary-skill-detail-header",children:[e.jsx("span",{className:"dashboard-summary-skill-detail-title",children:V}),e.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>Y(D),children:[e.jsx(Js,{size:14}),"Close"]})]}),U?e.jsxs("div",{className:"dashboard-summary-skill-detail-loading",role:"status","aria-live":"polite",children:[e.jsx(O,{size:14,className:"animate-spin"}),"Loading skill content..."]}):I?e.jsxs("div",{className:"dashboard-summary-skill-detail-error",role:"alert",children:[e.jsx($t,{size:14}),e.jsx("span",{children:I}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void _(D),children:"Retry"})]}):R?e.jsx("pre",{className:"dashboard-summary-skill-detail-content",children:R.skillMd||"(No SKILL.md found)"}):e.jsx("div",{className:"dashboard-summary-skill-detail-empty",children:"No skill content available"})]}):null]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:"Heartbeat & Health"}),e.jsxs("div",{className:"dashboard-summary-grid",children:[e.jsxs("div",{children:[e.jsx("p",{className:"dashboard-summary-label",children:"Last heartbeat"}),e.jsx("p",{children:s.lastHeartbeatAt?Ae(s.lastHeartbeatAt):"Never"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"dashboard-summary-label",children:"Next expected"}),e.jsx("p",{children:L?Ae(L):"Not scheduled"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"dashboard-summary-label",children:"Interval"}),e.jsx("p",{children:Zs(w)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"dashboard-summary-label",children:"Status"}),e.jsxs("p",{className:"dashboard-summary-health-row",children:[e.jsx("span",{className:ae("status-dot",s.state==="running"&&"status-dot--running")}),n.label,n.reason&&e.jsxs("span",{className:"text-secondary dashboard-summary-health-reason",title:n.reason,children:["(",n.reason,")"]})]})]})]})]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:"Current Work"}),s.taskId?e.jsxs("div",{className:"current-task",children:[e.jsx("a",{href:`/tasks/${s.taskId}`,className:"task-badge",children:s.taskId}),e.jsxs("a",{href:`/tasks/${s.taskId}`,className:"btn btn-sm",children:["View Task ",e.jsx(qs,{size:14})]})]}):e.jsx("p",{className:"text-muted",children:"No active assignment"})]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:"Recent Runs"}),e.jsxs("p",{className:"dashboard-summary-label",children:[v.successfulRuns,"/",v.totalRuns," successful (",v.successRate,"%)"]}),P.length===0?e.jsx("p",{className:"text-muted",children:"No runs yet"}):e.jsx("div",{className:"runs-list",children:P.map(d=>{const h=Ze[d.status]||Ze.terminated,l=h.icon;return e.jsxs("div",{className:"run-item",children:[e.jsx(l,{size:14,style:{color:h.color}}),e.jsx("span",{children:Ae(d.startedAt)}),e.jsxs("span",{className:"text-muted",children:[Math.max(0,Math.round((new Date(d.endedAt||d.startedAt).getTime()-new Date(d.startedAt).getTime())/1e3)),"s"]})]},d.id)})})]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:"Throughput"}),e.jsxs("div",{className:"stats-grid",children:[e.jsxs("div",{className:"stat-card",children:[e.jsx("div",{className:"stat-value",children:v.totalRuns}),e.jsx("div",{className:"stat-label",children:"Total Runs"})]}),e.jsxs("div",{className:"stat-card",children:[e.jsx("div",{className:"stat-value",children:v.todayRuns}),e.jsx("div",{className:"stat-label",children:"Runs Today"})]}),e.jsxs("div",{className:"stat-card",children:[e.jsxs("div",{className:"stat-value",children:[v.successRate,"%"]}),e.jsx("div",{className:"stat-label",children:"Success Rate"})]})]})]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:"Chain of Command"}),g?e.jsxs("div",{className:"chain-of-command-loading",role:"status","aria-live":"polite",children:[e.jsx(O,{size:14,className:"animate-spin"}),e.jsx("span",{children:"Loading reporting chain..."})]}):x.length<=1?e.jsx("p",{className:"text-muted",children:"No reporting chain"}):e.jsx("div",{className:"chain-of-command-path","aria-label":"Chain of command",children:x.map((d,h)=>{const l=h===x.length-1,r=!l;return e.jsxs("div",{className:"chain-of-command-item",children:[e.jsx("button",{type:"button",className:`chain-of-command-node${l?" chain-of-command-node--current":""}`,onClick:()=>r&&i?.(d.id),disabled:!r||!i,title:l?"Current agent":`View ${d.name}`,children:d.name}),!l&&e.jsx("span",{className:"chain-of-command-separator","aria-hidden":"true",children:"→"})]},d.id)})})]})]})}function pa({logs:s,isStreaming:n,hasTask:i,fallbackLabel:c}){return i?e.jsxs("div",{className:"logs-tab",children:[e.jsxs("div",{className:"logs-header",children:[e.jsxs("span",{className:"logs-count",children:[s.length," entries"]}),c&&e.jsx("span",{className:"text-muted logs-fallback-label",children:c}),n&&e.jsxs("span",{className:"streaming-indicator",children:[e.jsx("span",{className:"streaming-dot"}),"Live"]})]}),s.length===0?e.jsxs("div",{className:"logs-empty",children:[e.jsx(Le,{size:48,opacity:.3}),e.jsx("p",{children:"No log entries yet"}),e.jsx("p",{className:"text-muted",children:n?"Waiting for activity...":"Logs will appear here when the agent is active"})]}):e.jsx(Qs,{entries:s,loading:!1})]}):e.jsx("div",{className:"logs-tab",children:e.jsxs("div",{className:"logs-empty",children:[e.jsx(Le,{size:48,opacity:.3}),e.jsx("p",{children:"No activity yet"}),e.jsx("p",{className:"text-muted",children:"Agent logs will appear here from the current task or most recent run"})]})})}function ja({addToast:s,agentId:n,projectId:i,agentState:c,agentName:m,initialRunId:x,preferActiveRun:C}){const[g,y]=t.useState([]),{confirm:E}=_s(),[S,o]=t.useState(!0),[p,D]=t.useState(null),[T,R]=t.useState([]),[q,U]=t.useState(!1),[f,I]=t.useState(null),[K,j]=t.useState(!1),M=t.useRef(!1),v=t.useCallback(async()=>{try{const r=await Is(n,50,i);y(r)}catch(r){s(`Failed to load runs: ${G(r)}`,"error")}finally{o(!1)}},[n,i,s]);t.useEffect(()=>{v()},[v]);const P=g.some(r=>r.status==="active"),F=p?g.find(r=>r.id===p)?.status:void 0;t.useEffect(()=>{if(!P)return;const r=setInterval(()=>{v()},5e3);return()=>clearInterval(r)},[P,v]),t.useEffect(()=>{if(!p||F!=="active")return;const r=i?`?projectId=${encodeURIComponent(i)}`:"";return Ge(`/api/agents/${encodeURIComponent(n)}/runs/${encodeURIComponent(p)}/logs/stream${r}`,{events:{"agent:log":b=>{try{const z=JSON.parse(b.data);R(ue=>[...ue,z])}catch{}}}})},[p,F,n,i]);const V=t.useCallback(async r=>{if(p===r){D(null),R([]),I(null);return}D(r),U(!0),j(!0),R([]),I(null);try{const[b,z]=await Promise.all([Vs(n,r,i),Lt(n,r,i)]);R(b),I(z)}catch(b){s(`Failed to load run details: ${G(b)}`,"error"),R([]),I(null)}finally{U(!1),j(!1)}},[p,n,i,s]);t.useEffect(()=>{M.current=!1},[n,x,C]),t.useEffect(()=>{if(g.length===0||S||M.current)return;const r=x?g.find(b=>b.id===x):C?g.find(b=>b.status==="active"):null;M.current=!0,r&&V(r.id)},[x,C,g,S,V]);const _=async()=>{try{await Gt(n,i,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),s(`Heartbeat run started for ${m??n}`,"success"),o(!0),v()}catch(r){s(`Failed to start heartbeat run: ${G(r)}`,"error")}},Y=async()=>{if(await E({title:"Stop Active Run",message:"Stop the active run? The agent's work will be interrupted.",danger:!0}))try{await qt(n,i),s("Run stopped","success"),o(!0),v()}catch(b){s(`Failed to stop run: ${G(b)}`,"error")}},J=c==="active"||c==="idle";if(S&&g.length===0)return e.jsx("div",{className:"runs-tab",children:e.jsxs("div",{className:"runs-loading-row",children:[e.jsx(O,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:"Loading runs..."})]})});if(g.length===0)return e.jsxs("div",{className:"runs-tab",children:[J&&e.jsx("div",{className:"runs-toolbar",children:e.jsxs("button",{className:"btn btn--sm btn-task-create",onClick:()=>void _(),"aria-label":`Run now for ${m??n}`,children:[e.jsx(qe,{size:14})," Run Now"]})}),e.jsxs("div",{className:"runs-empty",children:[e.jsx(qe,{size:48,opacity:.3}),e.jsx("p",{children:"No runs yet"}),e.jsx("p",{className:"text-muted",children:"Heartbeat runs will appear here"})]})]});const w=[...g].sort((r,b)=>new Date(b.startedAt).getTime()-new Date(r.startedAt).getTime()),L=w.filter(r=>r.status==="active"),d=w.filter(r=>r.status!=="active"),h=r=>r?e.jsxs("div",{className:"run-usage",children:[e.jsxs("span",{children:["Input: ",r.inputTokens.toLocaleString()]}),e.jsxs("span",{children:["Output: ",r.outputTokens.toLocaleString()]}),r.cachedTokens>0&&e.jsxs("span",{children:["Cached: ",r.cachedTokens.toLocaleString()]})]}):null,l=(r,b,z)=>{const ue=Ze[r.status]||Ze.completed,ce=ue.icon,fe=r.endedAt?Na(new Date(r.startedAt),new Date(r.endedAt)):"In progress",Q=p===r.id;return e.jsxs("div",{children:[e.jsxs("div",{className:ae("run-card",z&&"run-card--active",Q&&"run-card--selected","run-card--clickable"),onClick:()=>void V(r.id),role:"button",tabIndex:0,"aria-expanded":Q,"aria-label":`${z?"Active":""} run ${r.id.slice(0,8)}, ${r.status}`,onKeyDown:se=>{(se.key==="Enter"||se.key===" ")&&(se.preventDefault(),V(r.id))},children:[e.jsxs("div",{className:"run-header",children:[e.jsxs("div",{className:"run-header-group",children:[Q?e.jsx(Bs,{size:14}):e.jsx(Os,{size:14}),z?e.jsxs("span",{className:"run-live-indicator",children:[e.jsx("span",{className:"live-dot"}),"Live Run"]}):e.jsxs("span",{className:"run-id",children:["#",b+1," ",r.id.slice(0,8)]})]}),e.jsxs("div",{className:"run-header-group",children:[r.invocationSource&&e.jsx("span",{className:"badge run-badge--compact",children:r.invocationSource}),z&&e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:se=>{se.preventDefault(),se.stopPropagation(),Y()},"aria-label":"Stop active run",children:[e.jsx(Fe,{size:12})," Stop"]}),e.jsxs("span",{className:ae("run-status",r.status),children:[e.jsx(ce,{size:14,style:{color:ue.color}}),r.status]}),r.heartbeatProcedureSource==="custom"&&e.jsx("span",{className:"badge run-badge--compact",children:"Heartbeat: custom"})]})]}),e.jsxs("div",{className:"run-details",children:[e.jsxs("span",{children:["Started ",Ae(r.startedAt)]}),e.jsx("span",{children:"•"}),e.jsx("span",{children:fe}),r.triggerDetail&&e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"•"}),e.jsx("span",{className:"text-muted",children:r.triggerDetail})]})]})]}),Q&&e.jsxs("div",{className:"run-logs-container",children:[K?e.jsxs("div",{className:"run-details-loading-state",children:[e.jsx(O,{size:14,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:"Loading details..."})]}):f&&e.jsxs("div",{className:"run-output-sections",children:[e.jsx("div",{className:"run-output-section",children:e.jsxs("details",{children:[e.jsx("summary",{className:"run-output-label run-output-summary",children:"System Prompt"}),f.systemPrompt?e.jsx("pre",{className:"run-output-panel",children:f.systemPrompt}):e.jsx("div",{className:"text-muted run-output-empty",children:"System prompt not captured for this run"})]})}),e.jsx("div",{className:"run-output-section",children:e.jsxs("details",{children:[e.jsx("summary",{className:"run-output-label run-output-summary",children:"Execution Prompt"}),f.executionPrompt?e.jsx("pre",{className:"run-output-panel",children:f.executionPrompt}):e.jsx("div",{className:"text-muted run-output-empty",children:"Execution prompt not captured for this run"})]})}),f.usageJson&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:"Token Usage"}),h(f.usageJson)]}),f.stdoutExcerpt&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:"Output"}),e.jsx("pre",{className:"run-output-panel",children:f.stdoutExcerpt.length>2e3?`${f.stdoutExcerpt.slice(0,2e3)}
17
-
18
- ... (truncated, ${f.stdoutExcerpt.length} chars total)`:f.stdoutExcerpt})]}),f.stderrExcerpt&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label run-output-label--error",children:"Errors"}),e.jsx(Yt,{errorText:f.stderrExcerpt,summaryPrefix:"Run error",issueContext:{surface:"AgentDetailView runs",agentId:n,agentName:m,agentState:c,runId:f.id,taskId:void 0,timestamp:f.startedAt}})]}),f.resultJson&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:"Result"}),e.jsx("pre",{className:"run-output-panel",children:JSON.stringify(f.resultJson,null,2)})]}),f.contextSnapshot&&Object.keys(f.contextSnapshot).length>0&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:"Context"}),e.jsx("div",{className:"run-context-grid",children:Object.entries(f.contextSnapshot).map(([se,A])=>e.jsxs("span",{className:"run-context-item",children:[e.jsxs("span",{className:"text-muted",children:[se,":"]})," ",e.jsx("span",{children:String(A)})]},se))})]}),!f.stdoutExcerpt&&!f.stderrExcerpt&&!f.resultJson&&e.jsx("div",{className:"text-muted run-output-empty",children:"No output captured"})]}),e.jsxs("div",{className:"run-agent-logs-section",children:[e.jsx("div",{className:"run-output-label",children:"Agent Logs"}),q?e.jsxs("div",{className:"run-details-loading-state",children:[e.jsx(O,{size:14,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:"Loading logs..."})]}):T.length===0?e.jsx("div",{className:"text-muted run-output-empty",children:"No logs available for this run"}):e.jsx(Qs,{entries:T,loading:!1})]})]})]},r.id)};return e.jsxs("div",{className:"runs-tab",children:[J&&e.jsxs("div",{className:"runs-toolbar runs-toolbar--between",children:[e.jsxs("span",{className:"runs-toolbar-meta",children:[g.length," run",g.length!==1?"s":"",P&&e.jsxs("span",{className:"run-live-indicator run-live-indicator--with-margin",children:[e.jsx("span",{className:"live-dot"}),"Live"]})]}),e.jsxs("div",{className:"run-header-group",children:[P&&e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void Y(),"aria-label":`Stop active run for ${m??n}`,children:[e.jsx(Fe,{size:14})," Stop Run"]}),e.jsxs("button",{className:"btn btn--sm btn-task-create",onClick:()=>void _(),"aria-label":`Run now for ${m??n}`,children:[e.jsx(qe,{size:14})," Run Now"]})]})]}),L.map((r,b)=>l(r,b,!0)),d.map((r,b)=>l(r,L.length+b,!1))]})}function Na(s,n){const i=Math.floor((n.getTime()-s.getTime())/1e3);return i<60?`${i}s`:i<3600?`${Math.floor(i/60)}m ${i%60}s`:`${Math.floor(i/3600)}h ${Math.floor(i%3600/60)}m`}const ya={triage:"Triage",todo:"Todo","in-progress":"In Progress","in-review":"In Review",done:"Done",archived:"Archived"};function Sa(s){const n=s.title?.trim()||s.description?.trim()||s.id;return n.length>80?`${n.slice(0,77)}...`:n}function ka({agentId:s,projectId:n,addToast:i}){const[c,m]=t.useState([]),[x,C]=t.useState(!0);return t.useEffect(()=>{let g=!1;return C(!0),zt(s,n).then(y=>{g||m(y)}).catch(y=>{g||(m([]),i(`Failed to load assigned tasks: ${G(y)}`,"error"))}).finally(()=>{g||C(!1)}),()=>{g=!0}},[s,n,i]),x?e.jsxs("div",{className:"agent-tasks-empty",children:[e.jsx(O,{size:16,className:"animate-spin"}),e.jsx("p",{children:"Loading assigned tasks..."})]}):c.length===0?e.jsxs("div",{className:"agent-tasks-empty",children:[e.jsx(Ws,{size:18}),e.jsx("p",{children:"No tasks assigned to this agent"})]}):e.jsx("div",{className:"agent-tasks-list",children:c.map(g=>e.jsxs("a",{className:"agent-task-item",href:`/tasks/${g.id}`,children:[e.jsxs("div",{className:"agent-task-row",children:[e.jsx("span",{className:"agent-task-id",children:g.id}),e.jsx("span",{className:`agent-task-column column-${g.column}`,children:ya[g.column]})]}),e.jsx("div",{className:"agent-task-title",title:g.title||g.description||g.id,children:Sa(g)}),e.jsxs("div",{className:"agent-task-status",children:[g.status??"idle"," · Updated ",Ae(g.updatedAt)]})]},g.id))})}const De=[{key:"maxRetries",label:"Max Retries",type:"number",placeholder:"3",hint:"Maximum number of automatic retries on task failure (0–10, default 3)",min:0,max:10},{key:"timeoutMs",label:"Task Timeout (ms)",type:"number",placeholder:"600000",hint:"Maximum time in ms before a task is considered timed out (minimum 60000ms, default 600000ms)",min:6e4,max:864e5},{key:"logLevel",label:"Log Level",type:"select",hint:"Verbosity of agent log output",options:[{value:"debug",label:"Debug"},{value:"info",label:"Info"},{value:"warn",label:"Warning"},{value:"error",label:"Error"}]}];function Ca(s){const n={};for(const i of De){const c=s[i.key]?.trim();if(c){if(i.type==="number"){const m=Number(c);if(Number.isNaN(m)||!Number.isFinite(m)){n[i.key]=`"${i.label}" must be a valid number`;continue}i.min!==void 0&&m<i.min&&(n[i.key]=`"${i.label}" must be at least ${i.min.toLocaleString()}`),i.max!==void 0&&m>i.max&&(n[i.key]=`"${i.label}" must be at most ${i.max.toLocaleString()}`)}if(i.type==="select"){const m=i.options?.map(x=>x.value)??[];m.length>0&&!m.includes(c)&&(n[i.key]=`"${i.label}" must be one of: ${m.join(", ")}`)}}}return n}function Ra({agent:s,projectId:n,addToast:i,onSaved:c}){const[m,x]=t.useState(s.soul??""),[C,g]=t.useState(!1),[y,E]=t.useState(!1),[S,o]=t.useState(!1),p=t.useRef(null);t.useEffect(()=>{x(s.soul??""),E(!1),o(!1)},[s.id,s.soul]),t.useEffect(()=>()=>{p.current&&clearTimeout(p.current)},[]);const D=m!==(s.soul??""),T=async()=>{if(m.length>1e4){i("Soul must be at most 10,000 characters","error");return}g(!0);try{await Kt(s.id,m,n),i("Soul saved","success"),E(!0),p.current&&clearTimeout(p.current),p.current=setTimeout(()=>E(!1),3e3),await c()}catch(R){i(`Failed to save soul: ${G(R)}`,"error")}finally{g(!1)}};return e.jsx("div",{className:"config-tab",children:e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Soul"}),e.jsx("p",{className:"config-description",children:"Define this agent's personality and identity."}),e.jsx("div",{className:"config-fields",children:e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-soul",children:"Agent Soul"}),e.jsx("div",{className:"agent-content-toolbar",children:e.jsxs("div",{className:"agent-content-mode-toggle",children:[e.jsxs("button",{className:`btn btn-sm ${S?"":"btn-primary"}`,onClick:()=>o(!1),disabled:!S,"aria-label":"Edit mode",children:[e.jsx(ze,{size:14}),"Edit"]}),e.jsxs("button",{className:`btn btn-sm ${S?"btn-primary":""}`,onClick:()=>o(!0),disabled:S,"aria-label":"Preview mode",children:[e.jsx(He,{size:14}),"Preview"]})]})}),S?m.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Be,{remarkPlugins:[Oe],children:m})}):e.jsx("div",{className:"agent-content-preview agent-content-placeholder",children:"No soul defined yet. Switch to Edit mode to define the agent's personality."}):e.jsx("textarea",{id:"agent-soul",className:"input config-textarea-mono",rows:12,placeholder:"Describe this agent's personality, tone, and behavioral traits...",value:m,onChange:R=>{x(R.target.value),E(!1)}}),!S&&e.jsx("span",{className:"config-hint",children:"Defines the agent's character and identity. Max 10,000 characters."})]})}),!S&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!D||C,onClick:()=>void T(),children:C?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:16,className:"animate-spin"}),"Saving…"]}):e.jsxs(e.Fragment,{children:[e.jsx(ie,{size:16}),"Save Soul"]})}),!D&&y&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(ie,{size:14}),"Soul saved"]})]})]})})}function wa({agent:s,projectId:n,addToast:i,onSaved:c}){const[m,x]=t.useState(s.memory??""),[C,g]=t.useState(!1),[y,E]=t.useState(!1),[S,o]=t.useState(!1),[p,D]=t.useState(!1),[T,R]=t.useState([]),[q,U]=t.useState(!1),[f,I]=t.useState(""),[K,j]=t.useState(""),[M,v]=t.useState(!1),[P,F]=t.useState(!1),[V,_]=t.useState(!1),[Y,J]=t.useState(!1),[w,L]=t.useState(""),d=t.useRef(null),h=t.useRef(null),l=s.state==="running",r=m!==(s.memory??""),b=t.useMemo(()=>T.find(A=>A.path===f),[T,f]),z=b?fa[b.layer]:"Select a memory file to view or edit.",ue=t.useCallback(async A=>{F(!0);try{const re=await Bt(s.id,A,n);I(re.path),j(re.content),v(!1),J(!1)}catch(re){i(`Failed to load agent memory file: ${G(re)}`,"error")}finally{F(!1)}},[s.id,n,i]),ce=t.useCallback(async(A="")=>{U(!0);try{const{files:re}=await Ot(s.id,n);if(R(re),re.length===0){I(""),j(""),v(!1);return}const ge=ba(re,A);await ue(ge)}catch(re){i(`Failed to load memory files: ${G(re)}`,"error"),R([]),I(""),j(""),v(!1)}finally{U(!1)}},[s.id,n,i,ue]);t.useEffect(()=>{x(s.memory??""),E(!1),o(!1),D(!1),L(""),J(!1),ce()},[s.id,s.memory,ce]),t.useEffect(()=>()=>{d.current&&clearTimeout(d.current),h.current&&clearTimeout(h.current)},[]);const fe=async()=>{if(m.length>5e4){i("Memory must be at most 50,000 characters","error");return}g(!0);try{await Qt(s.id,m,n),i("Memory saved","success"),E(!0),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>E(!1),3e3),await c()}catch(A){i(`Failed to save memory: ${G(A)}`,"error")}finally{g(!1)}},Q=async A=>{if(!(!A||A===f)){if(M){L("Save the current file before switching to another file.");return}L(""),await ue(A)}},se=async()=>{if(f){_(!0);try{await Xt(s.id,f,K,n),v(!1),J(!0),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>J(!1),3e3),L(""),await ce(f),i("Agent memory file saved","success"),await c()}catch(A){i(`Failed to save agent memory file: ${G(A)}`,"error")}finally{_(!1)}}};return e.jsx("div",{className:"config-tab",children:e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Agent Memory"}),e.jsx("p",{className:"config-description",children:"Store context that belongs to this agent only. Workspace memory, daily notes, dreams, and qmd search live in project settings under Project Memory."}),l&&e.jsx("p",{className:"config-hint config-hint--block-spacing",children:"Read-only while this agent is running."}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-memory",children:"Inline Memory"}),e.jsx("span",{className:"config-hint config-hint--block",children:"Short-form memory stored directly on the agent record and injected into prompts."}),e.jsx("div",{className:"agent-content-toolbar",children:e.jsxs("div",{className:"agent-content-mode-toggle",children:[!l&&e.jsxs("button",{className:`btn btn-sm ${S?"":"btn-primary"}`,onClick:()=>o(!1),disabled:!S,"aria-label":"Edit mode",children:[e.jsx(ze,{size:14}),"Edit"]}),e.jsxs("button",{className:`btn btn-sm ${S?"btn-primary":""}`,onClick:()=>o(!0),disabled:S,"aria-label":"Preview mode",children:[e.jsx(He,{size:14}),"Preview"]})]})}),S?m.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Be,{remarkPlugins:[Oe],children:m})}):e.jsx("div",{className:"agent-content-preview agent-content-placeholder",children:"No agent memory defined yet. Switch to Edit mode to add memory content."}):e.jsx("textarea",{id:"agent-memory","aria-label":"Agent Memory",className:"input config-textarea-mono",rows:10,placeholder:"Durable preferences, operating habits, and context this agent should carry across tasks...",value:m,readOnly:l,onChange:A=>{x(A.target.value),E(!1)}}),!S&&e.jsx("span",{className:"config-hint",children:"This is the inline memory field on the agent JSON record. Max 50,000 characters."})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-memory-file-select",children:"Memory Files"}),e.jsxs("span",{className:"config-hint config-hint--block",children:["Full OpenClaw memory files at ",e.jsxs("code",{children:["agent/",s.name||s.id,"/memory/"]})," (MEMORY.md, DREAMS.md, and daily notes)."]}),e.jsx("select",{id:"agent-memory-file-select",className:"select",value:f,disabled:q||P||V||T.length===0,onChange:A=>{Q(A.target.value)},children:T.length===0?e.jsx("option",{value:"",children:"No memory files found"}):T.map(A=>e.jsxs("option",{value:A.path,children:[Ls[A.layer]," • ",A.label]},A.path))}),q&&e.jsxs("span",{className:"config-hint config-hint--inline-loader",children:[e.jsx(O,{size:14,className:"animate-spin"}),"Loading memory files…"]}),b&&e.jsxs("div",{className:"config-hint config-hint--top-spacing",children:[e.jsx("strong",{children:Ls[b.layer]})," · ",z,e.jsx("br",{}),b.size.toLocaleString()," bytes · Updated ",Ae(b.updatedAt)]}),e.jsx("div",{className:"agent-content-toolbar config-textarea-top-spacing",children:e.jsxs("div",{className:"agent-content-mode-toggle",children:[!l&&e.jsxs("button",{className:`btn btn-sm ${p?"":"btn-primary"}`,onClick:()=>D(!1),disabled:!p,"aria-label":"Memory file edit mode",children:[e.jsx(ze,{size:14}),"Edit"]}),e.jsxs("button",{className:`btn btn-sm ${p?"btn-primary":""}`,onClick:()=>D(!0),disabled:p,"aria-label":"Memory file preview mode",children:[e.jsx(He,{size:14}),"Preview"]})]})}),p?K.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Be,{remarkPlugins:[Oe],children:K})}):e.jsx("div",{className:"agent-content-preview agent-content-placeholder",children:"No memory file content yet. Switch to Edit mode to add content."}):e.jsx("textarea",{className:"input config-textarea-mono",rows:14,placeholder:"Select a memory file to view and edit its content...",value:K,readOnly:l||!f||P,onChange:A=>{j(A.target.value),v(!0),J(!1),L("")}}),P&&e.jsxs("span",{className:"config-hint config-hint--inline-loader",children:[e.jsx(O,{size:14,className:"animate-spin"}),"Loading file content…"]}),w&&e.jsx("span",{className:"config-hint config-hint--top-spacing config-hint--block",children:w})]})]}),e.jsxs("div",{className:"config-actions",children:[!S&&e.jsx("button",{className:"btn btn-task-create",disabled:!r||C||l,onClick:()=>void fe(),children:C?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:16,className:"animate-spin"}),"Saving…"]}):e.jsxs(e.Fragment,{children:[e.jsx(ie,{size:16}),"Save Memory"]})}),!p&&e.jsx("button",{className:"btn",disabled:!M||V||!f||l,onClick:()=>void se(),children:V?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:16,className:"animate-spin"}),"Saving file…"]}):e.jsxs(e.Fragment,{children:[e.jsx(ie,{size:16}),"Save Memory File"]})}),!r&&y&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(ie,{size:14}),"Memory saved"]}),!M&&Y&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(ie,{size:14}),"Memory file saved"]})]})]})})}function Ma({agent:s,projectId:n,addToast:i,onSaved:c}){const[m,x]=t.useState(s.instructionsText??""),[C,g]=t.useState(s.instructionsPath??""),[y,E]=t.useState(!1),[S,o]=t.useState(""),[p,D]=t.useState(!1),[T,R]=t.useState(!1),[q,U]=t.useState(!1),[f,I]=t.useState(!1),[K,j]=t.useState(!1),[M,v]=t.useState(!1),P=t.useRef(null),F=t.useRef(null);t.useEffect(()=>{const w=C.trim();if(!w){o(""),R(!1);return}D(!0),Xs("project",w).then(L=>{o(L.content),R(!1)}).catch(L=>{const d=G(L);d.includes("ENOENT")||d.includes("Not found")||d.includes("not found")?(o(""),R(!1)):(i(`Failed to load instructions file: ${d}`,"error"),o(""))}).finally(()=>{D(!1)})},[C,i]),t.useEffect(()=>{x(s.instructionsText??""),g(s.instructionsPath??""),j(!1),v(!1),E(!1)},[s.id,s.instructionsText,s.instructionsPath]),t.useEffect(()=>()=>{P.current&&clearTimeout(P.current),F.current&&clearTimeout(F.current)},[]);const V=(()=>{const w=m??"",L=s.instructionsText??"",d=C?.trim()??"",h=s.instructionsPath?.trim()??"";return w!==L||d!==h})(),_=async()=>{U(!0);try{await Zt(s.id,{instructionsText:m||void 0,instructionsPath:C.trim()||void 0},n),i("Instructions saved","success"),j(!0),P.current&&clearTimeout(P.current),P.current=setTimeout(()=>j(!1),3e3),await c()}catch(w){i(`Failed to save instructions: ${G(w)}`,"error")}finally{U(!1)}},Y=async()=>{const w=C.trim();if(!w){i("No instructions file path set","error");return}I(!0);try{await et("project",w,S),i("Instructions file saved","success"),R(!1),v(!0),F.current&&clearTimeout(F.current),F.current=setTimeout(()=>v(!1),3e3),await c()}catch(L){i(`Failed to save instructions file: ${G(L)}`,"error")}finally{I(!1)}},J=!!C.trim();return e.jsxs("div",{className:"config-tab",children:[e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Custom Instructions"}),e.jsx("p",{className:"config-description",children:"Append custom instructions to this agent's system prompt at execution time. Use this to customize behavior, coding style, or project conventions without modifying built-in prompts."}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"instructions-text",children:"Inline Instructions"}),e.jsx("div",{className:"agent-content-toolbar",children:e.jsxs("div",{className:"agent-content-mode-toggle",children:[e.jsxs("button",{className:`btn btn-sm ${y?"":"btn-primary"}`,onClick:()=>E(!1),disabled:!y,"aria-label":"Edit mode","data-testid":"instructions-edit-toggle",children:[e.jsx(ze,{size:14}),"Edit"]}),e.jsxs("button",{className:`btn btn-sm ${y?"btn-primary":""}`,onClick:()=>E(!0),disabled:y,"aria-label":"Preview mode","data-testid":"instructions-preview-toggle",children:[e.jsx(He,{size:14}),"Preview"]})]})}),y?m.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Be,{remarkPlugins:[Oe],children:m})}):e.jsx("div",{className:"agent-content-preview agent-content-placeholder",children:"No inline instructions defined yet. Switch to Edit mode to add instructions."}):e.jsx("textarea",{id:"instructions-text",className:"input",rows:10,placeholder:"Enter custom instructions to append to this agent's system prompt...",value:m,onChange:w=>{x(w.target.value),j(!1)}}),!y&&e.jsx("span",{className:"config-hint",children:"Markdown formatting supported. Max 50,000 characters."})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"instructions-path",children:"Instructions File Path"}),e.jsx("input",{id:"instructions-path",type:"text",className:"input",placeholder:"e.g., .fusion/agents/my-agent-instructions.md",value:C,onChange:w=>{g(w.target.value),j(!1)}}),e.jsx("span",{className:"config-hint",children:"Path to a .md file (relative to project root). Contents are read and appended at execution time."})]})]}),!y&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!V||q,onClick:()=>void _(),children:q?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:16,className:"animate-spin"}),"Saving…"]}):e.jsxs(e.Fragment,{children:[e.jsx(ie,{size:16}),"Save Instructions"]})}),!V&&K&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(ie,{size:14}),"Instructions saved"]})]})]}),J&&e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Instructions File Editor"}),e.jsx("p",{className:"config-description",children:"Edit the instructions file directly. Changes are saved separately from the path configuration."}),e.jsx("div",{className:"config-fields",children:e.jsxs("div",{className:"config-field",children:[e.jsxs("div",{className:"config-inline-header",children:[e.jsx("label",{htmlFor:"instructions-file-content",children:"File Content"}),p&&e.jsxs("span",{className:"config-hint config-hint--inline-tight",children:[e.jsx(O,{size:12,className:"animate-spin"}),"Loading..."]}),T&&!p&&e.jsx("span",{className:"config-hint config-hint--warning",children:"Unsaved changes"})]}),e.jsx("textarea",{id:"instructions-file-content",className:"input config-textarea-mono",rows:20,placeholder:"File content will appear here when loaded...",value:S,readOnly:p,onChange:w=>{o(w.target.value),R(!0),v(!1)}}),e.jsx("span",{className:"config-hint",children:"Edit the markdown file content directly. Save separately using the button below."})]})}),e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!T||f,onClick:()=>void Y(),children:f?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:16,className:"animate-spin"}),"Saving…"]}):e.jsxs(e.Fragment,{children:[e.jsx(ie,{size:16}),"Save File"]})}),!T&&M&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(ie,{size:14}),"File saved"]})]})]})]})}function zs(s){const n=s??{},i={};return n.heartbeatIntervalMs!==void 0&&n.heartbeatIntervalMs!==null&&(i.heartbeatIntervalMs=String(Number(n.heartbeatIntervalMs)/1e3)),n.heartbeatTimeoutMs!==void 0&&n.heartbeatTimeoutMs!==null&&(i.heartbeatTimeoutMs=String(Number(n.heartbeatTimeoutMs)/1e3)),n.maxConcurrentRuns!==void 0&&n.maxConcurrentRuns!==null&&(i.maxConcurrentRuns=String(n.maxConcurrentRuns)),(n.messageResponseMode==="immediate"||n.messageResponseMode==="on-heartbeat")&&(i.messageResponseMode=n.messageResponseMode),i}function rs(s){return s?.enabled!==!1}function ls(s){return s?.autoClaimRelevantTasks!==!1}function cs(s){return s?.runMissedHeartbeatOnStartup===!0}function os(s){return s?.allowParallelExecution!==!1}function Hs(s){const n=(s??{}).budgetConfig,i={};return n&&(n.tokenBudget!==void 0&&n.tokenBudget!==null&&(i.tokenBudget=String(n.tokenBudget)),n.usageThreshold!==void 0&&n.usageThreshold!==null&&(i.usageThreshold=String(Number(n.usageThreshold)*100)),n.budgetPeriod!==void 0&&n.budgetPeriod!==null&&(i.budgetPeriod=String(n.budgetPeriod)),n.resetDay!==void 0&&n.resetDay!==null&&(i.resetDay=String(n.resetDay))),i}function Fa({agent:s,projectId:n,addToast:i,onSaved:c}){const[m,x]=t.useState(!1),[C,g]=t.useState(!1),[y,E]=t.useState(!1),[S,o]=t.useState(!1),[p,D]=t.useState(!1),[T,R]=t.useState(""),[q,U]=t.useState(!1),[f,I]=t.useState(null),[K,j]=t.useState(!1),M=t.useRef(null),v=s.heartbeatProcedurePath?.trim(),P=`.fusion/agents/${s.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||s.id.toLowerCase().replace(/[^a-z0-9]+/g,"-")||"agent"}-${s.id.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"agent"}/HEARTBEAT.md`,F=`.fusion/agents/${s.id}/HEARTBEAT.md`,V=s.id.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"agent",_=!!(v&&(v===P||v===F||new RegExp(`^\\.fusion/agents/[^/]+-${V}/HEARTBEAT\\.md$`).test(v))),Y=!!v,J=t.useCallback(async h=>{E(!0),I(null);try{const l=await Xs("project",h,n);R(l.content),U(!1)}catch(l){const r=G(l);I(r),i(`Failed to load heartbeat procedure file: ${r}`,"error")}finally{E(!1)}},[i,n]);t.useEffect(()=>{g(!1),D(!1),R(""),U(!1),I(null),E(!1),o(!1),j(!1)},[s.id,v]),t.useEffect(()=>()=>{M.current&&clearTimeout(M.current)},[]);const w=async()=>{v&&(g(!0),await J(v))},L=async()=>{if(v){o(!0);try{await et("project",v,T,n),U(!1),j(!0),i("Heartbeat procedure file saved","success"),M.current&&clearTimeout(M.current),M.current=setTimeout(()=>j(!1),3e3),await c()}catch(h){i(`Failed to save heartbeat procedure file: ${G(h)}`,"error")}finally{o(!1)}}},d=async()=>{x(!0);try{const h=await sa(s.id,n);i(h.procedureFileSeeded?`Heartbeat procedure file ready at ${h.heartbeatProcedurePath}`:`Heartbeat procedure path set to ${h.heartbeatProcedurePath}`,"success"),await c()}catch(h){i(`Failed to upgrade heartbeat procedure: ${G(h)}`,"error")}finally{x(!1)}};return e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Heartbeat Procedure"}),e.jsxs("p",{className:"config-description",children:["The per-tick procedure this agent runs every wake. Defaults to a per-agent markdown file (for example ",e.jsx("code",{children:".fusion/agents/ceo-agent2736/HEARTBEAT.md"}),") that you can edit. Legacy id-only default paths remain valid. Resets on every tick — no need to restart the agent after editing."]}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsxs("span",{className:"config-hint",children:["Current path: ",e.jsx("code",{children:v||"(none — using built-in default)"})]}),Y&&e.jsx("div",{className:"heartbeat-procedure-actions",children:e.jsx("button",{className:"btn btn-sm",onClick:()=>void w(),disabled:y,children:y?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:16,className:"animate-spin"}),"Loading file…"]}):e.jsxs(e.Fragment,{children:[e.jsx(Le,{size:16}),"View Heartbeat Markdown"]})})})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("button",{className:"btn",disabled:m||_,onClick:()=>void d(),"aria-label":"Upgrade agent to default heartbeat procedure file",children:m?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:16,className:"animate-spin"}),"Upgrading…"]}):_?e.jsxs(e.Fragment,{children:[e.jsx(ie,{size:16}),"Already on default"]}):"Upgrade to Default Heartbeat Procedure"}),e.jsxs("span",{className:"config-hint",children:["Sets ",e.jsx("code",{children:"heartbeatProcedurePath"})," to"," ",e.jsx("code",{children:P})," ","and seeds the file from the built-in template if it doesn't exist. Each agent gets its own per-agent file, so edits stay scoped to this agent. Operator edits to the file are preserved."]})]})]}),C&&Y&&v&&e.jsxs("div",{className:"config-fields heartbeat-procedure-viewer",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"heartbeat-procedure-file-content",children:"Heartbeat Procedure File"}),e.jsxs("div",{className:"agent-content-toolbar",children:[e.jsxs("div",{className:"agent-content-mode-toggle",children:[e.jsxs("button",{className:`btn btn-sm ${p?"":"btn-primary"}`,onClick:()=>D(!1),disabled:!p,"aria-label":"Heartbeat file edit mode",children:[e.jsx(ze,{size:14}),"Edit"]}),e.jsxs("button",{className:`btn btn-sm ${p?"btn-primary":""}`,onClick:()=>D(!0),disabled:p,"aria-label":"Heartbeat file preview mode",children:[e.jsx(He,{size:14}),"Preview"]})]}),y&&e.jsxs("span",{className:"config-hint heartbeat-procedure-status",children:[e.jsx(O,{size:12,className:"animate-spin"}),"Loading..."]}),q&&!y&&e.jsx("span",{className:"config-hint heartbeat-procedure-status heartbeat-procedure-status--warning",children:"Unsaved changes"})]}),p?T.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Be,{remarkPlugins:[Oe],children:T})}):e.jsx("div",{className:"agent-content-preview agent-content-placeholder",children:"No heartbeat procedure markdown content yet."}):e.jsx("textarea",{id:"heartbeat-procedure-file-content",className:"input",rows:16,value:T,readOnly:y,placeholder:"Heartbeat procedure markdown file content will appear here...",onChange:h=>{R(h.target.value),U(!0),j(!1)}}),f&&e.jsxs("span",{className:"config-error",children:["Failed to load file: ",f]}),e.jsxs("span",{className:"config-hint",children:["This editor writes directly to ",e.jsx("code",{children:v}),"."]})]}),!p&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!q||S||y,onClick:()=>void L(),children:S?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:16,className:"animate-spin"}),"Saving…"]}):e.jsxs(e.Fragment,{children:[e.jsx(ie,{size:16}),"Save Heartbeat File"]})}),!q&&K&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(ie,{size:14}),"File saved"]})]})]})]})}function Aa({agent:s,projectId:n,addToast:i,onSaved:c,onHasChangesChange:m,onDelete:x}){const[C,g]=t.useState(s.name),[y,E]=t.useState(s.role),[S,o]=t.useState(s.title??""),[p,D]=t.useState(s.icon??""),[T,R]=t.useState(s.reportsTo??""),[q,U]=t.useState([]),[f,I]=t.useState(!1),[K,j]=t.useState(!1),M=t.useRef(null),[v,P]=t.useState(()=>{const a={};for(const u of De){const k=s.metadata[u.key];k!=null&&(a[u.key]=String(k))}return a}),[F,V]=t.useState(()=>zs(s.runtimeConfig)),[_,Y]=t.useState(()=>rs(s.runtimeConfig)),[J,w]=t.useState(()=>ls(s.runtimeConfig)),[L,d]=t.useState(()=>cs(s.runtimeConfig)),[h,l]=t.useState(()=>os(s.runtimeConfig)),[r,b]=t.useState(()=>Hs(s.runtimeConfig)),[z,ue]=t.useState(s.bundleConfig?.mode??""),[ce,fe]=t.useState(s.bundleConfig?.entryFile??"AGENTS.md"),[Q,se]=t.useState(s.bundleConfig?.externalPath??""),[A,re]=t.useState(s.bundleConfig?.files??[]),[ge,pe]=t.useState(Array.isArray(s.metadata?.skills)?s.metadata.skills:[]),[Qe,N]=t.useState([]),[X,ee]=t.useState(!1),[Z,me]=t.useState([]),[le,je]=t.useState([]),[we,gs]=t.useState([]),[tt,xs]=t.useState(!1),_e=(()=>{const a=s.runtimeConfig??{};return a.modelProvider&&a.modelId?`${a.modelProvider}/${a.modelId}`:typeof a.model=="string"&&a.model.includes("/")?a.model:""})(),Ce=typeof s.runtimeConfig?.runtimeHint=="string"?s.runtimeConfig.runtimeHint:"",[xe,Xe]=t.useState(Ce?"runtime":"model"),[Ne,bs]=t.useState(_e),[Ee,es]=t.useState(Ce),Ie=T.trim(),vs=t.useMemo(()=>q.filter(a=>a.id!==s.id),[q,s.id]),at=!!Ie&&!vs.some(a=>a.id===Ie);t.useEffect(()=>{let a=!1;return I(!0),_t(void 0,n).then(u=>{a||U(u)}).catch(()=>{a||U([])}).finally(()=>{a||I(!1)}),()=>{a=!0}},[n]),t.useEffect(()=>{ee(!0),It().then(a=>{N(a.models),me(a.favoriteProviders),je(a.favoriteModels)}).catch(()=>{}).finally(()=>ee(!1))},[]);const nt=t.useCallback(async a=>{const u=Z,B=u.includes(a)?u.filter(ne=>ne!==a):[a,...u];me(B);try{await Ts({favoriteProviders:B,favoriteModels:le})}catch{me(u)}},[Z,le]),it=t.useCallback(async a=>{const u=le,B=u.includes(a)?u.filter(ne=>ne!==a):[a,...u];je(B);try{await Ts({favoriteProviders:Z,favoriteModels:B})}catch{je(u)}},[Z,le]);t.useEffect(()=>{xs(!0),Ks(n).then(gs).catch(()=>gs([])).finally(()=>xs(!1))},[n]);const[ye,ss]=t.useState(null),[ps,js]=t.useState(!1);t.useEffect(()=>{ds(s.id,n).then(ss).catch(()=>ss(null))},[s.id,n]);const rt=async()=>{js(!0);try{await ea(s.id,n),i("Budget usage reset successfully","success");const a=await ds(s.id,n);ss(a)}catch(a){i(`Failed to reset budget: ${G(a)}`,"error")}finally{js(!1)}},[Se,Ns]=t.useState(!1),[H,Re]=t.useState({}),[lt,Me]=t.useState(!1),[ts,Ve]=t.useState(null),ys=s.state==="idle"||s.state==="paused",Te=t.useRef(null),Ss=t.useRef(null),ks=t.useRef(null),Ue=t.useRef(0);t.useEffect(()=>()=>{Te.current&&clearTimeout(Te.current)},[]);const he=(()=>{if(C!==s.name||y!==s.role||S!==(s.title??"")||p!==(s.icon??"")||T!==(s.reportsTo??"")||z!==(s.bundleConfig?.mode??"")||ce!==(s.bundleConfig?.entryFile??"AGENTS.md")||Q!==(s.bundleConfig?.externalPath??"")||JSON.stringify(A)!==JSON.stringify(s.bundleConfig?.files??[]))return!0;for(const W of De){const de=v[W.key]?.trim()??"",$=s.metadata[W.key]!==void 0&&s.metadata[W.key]!==null?String(s.metadata[W.key]):"";if(de!==$)return!0}const a=s.runtimeConfig??{};if(_!==rs(s.runtimeConfig)||J!==ls(s.runtimeConfig)||L!==cs(s.runtimeConfig)||h!==os(s.runtimeConfig))return!0;for(const W of["heartbeatIntervalMs","heartbeatTimeoutMs","maxConcurrentRuns","messageResponseMode"]){const de=F[W]?.trim()??"";let $=a[W]!==void 0&&a[W]!==null?String(a[W]):"";if((W==="heartbeatIntervalMs"||W==="heartbeatTimeoutMs")&&$&&($=String(Number($)/1e3)),de!==$)return!0}const u=a.budgetConfig;for(const W of["tokenBudget","budgetPeriod","resetDay"]){const de=r[W]?.trim()??"",$=u?.[W]!==void 0&&u?.[W]!==null?String(u[W]):"";if(de!==$)return!0}const k=r.usageThreshold?.trim()??"",B=u?.usageThreshold!==void 0&&u?.usageThreshold!==null?String(Number(u.usageThreshold)*100):"";if(k!==B)return!0;const ne=Array.isArray(s.metadata?.skills)?s.metadata.skills:[];return JSON.stringify(ge)!==JSON.stringify(ne)||xe!==(Ce?"runtime":"model")||Ne!==_e||Ee!==Ce})(),Cs=t.useRef(null);t.useEffect(()=>{m&&Cs.current!==he&&(Cs.current=he,m(he))},[he,m]),t.useEffect(()=>()=>{m?.(!1)},[m]),t.useEffect(()=>{const a={id:s.id,updatedAt:s.updatedAt},u=Ss.current;(!u||u.id!==a.id||u.updatedAt!==a.updatedAt)&&(he||(Ss.current=a,V(zs(s.runtimeConfig)),Y(rs(s.runtimeConfig)),w(ls(s.runtimeConfig)),d(cs(s.runtimeConfig)),l(os(s.runtimeConfig)),b(Hs(s.runtimeConfig)),bs(_e),es(Ce),Xe(Ce?"runtime":"model")))},[s,he,_e,Ce]);const Rs=(a,u)=>{P(k=>({...k,[a]:u})),Me(!1),H[a]&&Re(k=>{const B={...k};return delete B[a],B})},Je=(a,u)=>{V(k=>({...k,[a]:u})),Me(!1),H[a]&&Re(k=>{const B={...k};return delete B[a],B})},ct=a=>{Y(a),Me(!1)},We=(a,u)=>{b(k=>({...k,[a]:u})),Me(!1),H[a]&&Re(k=>{const B={...k};return delete B[a],B})},be=t.useMemo(()=>{const a=Ca(v);for(const[$,ke]of Object.entries({heartbeatIntervalMs:{label:"Heartbeat Interval",min:1},heartbeatTimeoutMs:{label:"Heartbeat Timeout",min:5},maxConcurrentRuns:{label:"Max Concurrent Runs",min:1}})){const te=F[$]?.trim();if(!te)continue;const ve=Number(te);Number.isNaN(ve)||!Number.isFinite(ve)?a[$]=`"${ke.label}" must be a valid number`:ve<ke.min&&(a[$]=`"${ke.label}" must be at least ${ke.min.toLocaleString()}`)}const u=F.messageResponseMode?.trim();u&&!["immediate","on-heartbeat"].includes(u)&&(a.messageResponseMode='"Message Response Mode" must be either immediate or on-heartbeat');const k=r.tokenBudget?.trim();if(k){const $=Number(k);Number.isNaN($)||!Number.isFinite($)?a.tokenBudget='"Token Budget" must be a valid number':$<=0&&(a.tokenBudget='"Token Budget" must be greater than 0')}const B=r.usageThreshold?.trim();if(B){const $=Number(B);Number.isNaN($)||!Number.isFinite($)?a.usageThreshold='"Usage Threshold" must be a valid number':($<1||$>100)&&(a.usageThreshold='"Usage Threshold" must be between 1 and 100')}const ne=r.budgetPeriod?.trim();ne&&!["daily","weekly","monthly","lifetime"].includes(ne)&&(a.budgetPeriod='"Budget Period" must be one of: daily, weekly, monthly, lifetime');const W=r.resetDay?.trim(),de=ne||"lifetime";if(W){const $=Number(W);Number.isNaN($)||!Number.isFinite($)?a.resetDay='"Reset Day" must be a valid number':de==="weekly"?($<0||$>6||!Number.isInteger($))&&(a.resetDay='"Reset Day" must be between 0 (Sunday) and 6 (Saturday) for weekly period'):de==="monthly"&&($<1||$>31||!Number.isInteger($))&&(a.resetDay='"Reset Day" must be between 1 and 31 for monthly period')}return a},[v,F,r]),ws=t.useCallback(()=>{if(Object.keys(be).length>0)return null;const a={...s.metadata};for(const te of De){const ve=v[te.key]?.trim();ve?te.type==="number"?a[te.key]=Number(ve):a[te.key]=ve:delete a[te.key]}ge.length>0?a.skills=ge:delete a.skills;const u={...s.runtimeConfig};u.enabled=_,u.autoClaimRelevantTasks=J,u.runMissedHeartbeatOnStartup=L,u.allowParallelExecution=h;for(const te of["heartbeatIntervalMs","heartbeatTimeoutMs","maxConcurrentRuns"]){const ve=F[te]?.trim();if(!ve)delete u[te];else{const Fs=Number(ve);u[te]=te==="maxConcurrentRuns"?Fs:Fs*1e3}}const k=F.messageResponseMode?.trim();if(k?u.messageResponseMode=k:delete u.messageResponseMode,xe==="runtime")Ee.trim()?u.runtimeHint=Ee.trim():delete u.runtimeHint,delete u.modelProvider,delete u.modelId,delete u.model;else if(delete u.runtimeHint,Ne.trim()){const te=Ne.indexOf("/");te!==-1&&(u.modelProvider=Ne.slice(0,te),u.modelId=Ne.slice(te+1),u.model=Ne.trim())}else delete u.modelProvider,delete u.modelId,delete u.model;const B={},ne=r.tokenBudget?.trim(),W=r.usageThreshold?.trim(),de=r.budgetPeriod?.trim(),$=r.resetDay?.trim();ne&&(B.tokenBudget=Number(ne)),W&&(B.usageThreshold=Number(W)/100),de&&(B.budgetPeriod=de),$&&(B.resetDay=Number($)),Object.keys(B).length>0?u.budgetConfig=B:delete u.budgetConfig;let ke;return z&&(ke={mode:z,entryFile:ce||"AGENTS.md",files:A.length>0?A:["AGENTS.md"]},z==="external"&&Q.trim()&&(ke.externalPath=Q.trim())),{name:C.trim()||void 0,role:y,title:S.trim()||void 0,icon:p.trim()||void 0,reportsTo:T.trim()||void 0,metadata:a,runtimeConfig:u,bundleConfig:ke}},[s.metadata,s.runtimeConfig,h,J,r,ce,Q,A,z,v,_,F,p,Ne,C,T,y,L,xe,Ee,ge,S,be]),Pe=t.useCallback(async(a,u)=>{const k=ws();if(!k)return Re(be),a&&i("Please fix validation errors before saving","error"),u==="auto"&&Ve("Fix validation errors to save changes"),!1;const B=JSON.stringify(k);if(B===ks.current)return!1;const ne=++Ue.current;Re({}),Ve(null),Ns(!0);try{return await Vt(s.id,k,n),ne!==Ue.current?!1:(ks.current=B,u==="manual"&&i("Settings saved","success"),Ve(null),Me(!0),Te.current&&clearTimeout(Te.current),Te.current=setTimeout(()=>Me(!1),3e3),await c(),!0)}catch(W){if(ne===Ue.current){const de=G(W);Ve(de),i(`Failed to save settings: ${de}`,"error")}return!1}finally{ne===Ue.current&&Ns(!1)}},[i,s.id,ws,c,n,be]),ot=async()=>{await Pe(!0,"manual")},oe=t.useCallback(()=>{if(!(!he||Se)){if(Object.keys(be).length>0){Re(be);return}Pe(!1,"auto")}},[he,Se,Pe,be]);t.useEffect(()=>{if(!he||Se)return;if(Object.keys(be).length>0){Re(be);return}const a=setTimeout(()=>{Pe(!1,"auto")},xa);return()=>clearTimeout(a)},[he,Se,Pe,be]);const dt=t.useCallback(async a=>{j(!0);try{await Ut(s.id,a,n),await c(),i("Avatar uploaded","success")}catch(u){i(G(u),"error")}finally{j(!1),M.current&&(M.current.value="")}},[i,s.id,c,n]),ut=t.useCallback(async()=>{j(!0);try{await Jt(s.id,n),await c(),i("Avatar removed","success")}catch(a){i(G(a),"error")}finally{j(!1)}},[i,s.id,c,n]),Ms=Se?"Saving changes…":ts?`Save failed: ${ts}`:!he&&lt?"All changes saved":null;return e.jsxs("div",{className:"config-tab",children:[e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Agent Configuration"}),e.jsx("p",{className:"config-description",children:"Configure agent settings and behavior."}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-name",children:"Name"}),e.jsx("input",{id:"agent-name",type:"text",className:"input",value:C,onChange:a=>g(a.target.value),onBlur:()=>{oe()}})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-role",children:"Role"}),e.jsxs("select",{id:"agent-role",className:"select",value:y,onChange:a=>{E(a.target.value),oe()},children:[e.jsx("option",{value:"triage",children:"Triage"}),e.jsx("option",{value:"executor",children:"Executor"}),e.jsx("option",{value:"reviewer",children:"Reviewer"}),e.jsx("option",{value:"merger",children:"Merger"}),e.jsx("option",{value:"scheduler",children:"Scheduler"}),e.jsx("option",{value:"custom",children:"Custom"})]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-title",children:"Title"}),e.jsx("input",{id:"agent-title",type:"text",className:"input",placeholder:"e.g. Senior Code Reviewer",value:S,onChange:a=>o(a.target.value),onBlur:()=>{oe()}})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{children:"Avatar"}),e.jsxs("div",{className:"agent-avatar-editor",children:[e.jsx(Us,{agent:s,size:64,className:"agent-avatar-editor-preview"}),e.jsxs("div",{className:"agent-avatar-editor-actions",children:[e.jsx("input",{ref:M,id:"agent-avatar-upload",type:"file",accept:"image/png,image/jpeg,image/gif,image/webp",className:"visually-hidden",disabled:K,onChange:a=>{const u=a.target.files?.[0];u&&dt(u)}}),e.jsx("button",{type:"button",className:"btn btn-sm",disabled:K,onClick:()=>M.current?.click(),children:"Upload Avatar"}),s.imageUrl?e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void ut(),disabled:K,children:"Remove Avatar"}):null]})]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-icon",children:"Icon"}),e.jsx("input",{id:"agent-icon",type:"text",className:"input",placeholder:"e.g. 🤖",value:p,onChange:a=>D(a.target.value),onBlur:()=>{oe()}})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-reports-to",children:"Reports To"}),e.jsxs("select",{id:"agent-reports-to",className:"select",value:T,onChange:a=>{R(a.target.value),oe()},disabled:f,children:[e.jsx("option",{value:"",children:"No manager"}),at&&e.jsxs("option",{value:Ie,children:["Unknown manager (",Ie,")"]}),vs.map(a=>e.jsxs("option",{value:a.id,children:[a.name," (",a.id,")"]},a.id))]})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Skills"}),e.jsx("p",{className:"config-description",children:"Assign skills to this agent for specialized behavior."}),e.jsx("div",{className:"config-fields",children:e.jsx("div",{className:"config-field",children:e.jsx(ta,{id:"agent-skills",label:"Skills",value:ge,onChange:a=>{pe(a),oe()},projectId:n})})})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Model"}),e.jsx("p",{className:"config-description",children:"Choose either a built-in model or a plugin runtime for this agent. These options are mutually exclusive."}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{children:"Runtime Source"}),e.jsxs("div",{className:"config-runtime-tabs",role:"tablist","aria-label":"Runtime source",children:[e.jsx("button",{type:"button",className:`config-runtime-tab${xe==="model"?" active":""}`,role:"tab","aria-selected":xe==="model",tabIndex:xe==="model"?0:-1,onClick:()=>{Xe("model"),es(""),oe()},children:"Built-in Model"}),e.jsx("button",{type:"button",className:`config-runtime-tab${xe==="runtime"?" active":""}`,role:"tab","aria-selected":xe==="runtime",tabIndex:xe==="runtime"?0:-1,onClick:()=>{Xe("runtime"),oe()},children:"Plugin Runtime"})]})]}),xe==="model"?e.jsx("div",{className:"config-field",children:e.jsx(Wt,{models:Qe,value:Ne,onChange:a=>{bs(a),oe()},placeholder:"Use global default",label:"Agent Model",disabled:X,favoriteProviders:Z,onToggleFavorite:nt,favoriteModels:le,onToggleModelFavorite:it})}):e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-runtime-hint",children:"Runtime"}),tt?e.jsx("span",{className:"config-hint",children:"Loading runtimes…"}):e.jsxs("select",{id:"agent-runtime-hint",className:"select",value:Ee,onChange:a=>{es(a.target.value),oe()},children:[e.jsx("option",{value:"",children:we.length>0?"Select a plugin runtime…":"No plugin runtimes available"}),we.map(a=>e.jsx("option",{value:a.runtimeId,children:a.description?`${a.name} — ${a.description}`:a.name},`${a.pluginId}:${a.runtimeId}`))]})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Heartbeat Settings"}),e.jsx("p",{className:"config-description",children:"Configure how this agent's heartbeat is monitored. Leave a field empty to use system defaults."}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-enabled",children:[e.jsx("input",{id:"hb-enabled",type:"checkbox",checked:_,onChange:a=>{ct(a.target.checked),oe()}}),"Heartbeat Enabled"]}),e.jsx("span",{className:"config-hint",children:"When enabled, this agent receives scheduled heartbeat runs based on its interval."})]}),e.jsxs("div",{className:"config-field",children:[e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-autoClaimRelevantTasks",children:[e.jsx("input",{id:"hb-autoClaimRelevantTasks",type:"checkbox",checked:J,onChange:a=>{w(a.target.checked),oe()}}),"Auto-Claim Relevant Tasks"]}),e.jsx("span",{className:"config-hint",children:"When enabled (default), no-task heartbeats scan open unowned work and auto-claim tasks aligned with this agent's role and soul."})]}),e.jsxs("div",{className:"config-field",children:[e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-runMissedHeartbeatOnStartup",children:[e.jsx("input",{id:"hb-runMissedHeartbeatOnStartup",type:"checkbox",checked:L,onChange:a=>{d(a.target.checked),oe()}}),"Run Missed Heartbeat On Startup"]}),e.jsx("span",{className:"config-hint",children:"When enabled, if the server was down across this agent's scheduled heartbeat tick, fire a single catch-up heartbeat at startup. Default: off."})]}),e.jsxs("div",{className:"config-field",children:[e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-allowParallelExecution",children:[e.jsx("input",{id:"hb-allowParallelExecution",type:"checkbox",checked:h,onChange:a=>{l(a.target.checked),oe()}}),"Allow Parallel Execution"]}),e.jsx("span",{className:"config-hint",children:"When disabled, the heartbeat and task execution paths serialize for this agent (heartbeat will not start while the agent's task is executing, and vice versa). Permanent agents only."})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-heartbeatIntervalMs",children:"Heartbeat Interval (s)"}),e.jsx("input",{id:"hb-heartbeatIntervalMs",type:"text",inputMode:"numeric",className:ae("input",!!H.heartbeatIntervalMs&&"input--error"),placeholder:String(us/1e3),value:F.heartbeatIntervalMs??"",onChange:a=>Je("heartbeatIntervalMs",a.target.value)}),H.heartbeatIntervalMs?e.jsx("span",{className:"config-error",children:H.heartbeatIntervalMs}):e.jsxs("span",{className:"config-hint",children:["How often heartbeats are checked. Leave empty for system default (",us/1e3,"s / ",ga,")."]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-heartbeatTimeoutMs",children:"Heartbeat Timeout (s)"}),e.jsx("input",{id:"hb-heartbeatTimeoutMs",type:"text",inputMode:"numeric",className:ae("input",!!H.heartbeatTimeoutMs&&"input--error"),placeholder:"60",value:F.heartbeatTimeoutMs??"",onChange:a=>Je("heartbeatTimeoutMs",a.target.value)}),H.heartbeatTimeoutMs?e.jsx("span",{className:"config-error",children:H.heartbeatTimeoutMs}):e.jsx("span",{className:"config-hint",children:"Time without heartbeat before agent is considered unresponsive. Leave empty for system default (60s)"})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-maxConcurrentRuns",children:"Max Concurrent Runs"}),e.jsx("input",{id:"hb-maxConcurrentRuns",type:"text",inputMode:"numeric",className:ae("input",!!H.maxConcurrentRuns&&"input--error"),placeholder:"1",value:F.maxConcurrentRuns??"",onChange:a=>Je("maxConcurrentRuns",a.target.value)}),H.maxConcurrentRuns?e.jsx("span",{className:"config-error",children:H.maxConcurrentRuns}):e.jsx("span",{className:"config-hint",children:"Maximum simultaneous heartbeat runs for this agent. Leave empty for system default (1)."})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-messageResponseMode",children:"Message Response Mode"}),e.jsxs("select",{id:"hb-messageResponseMode",className:ae("select",!!H.messageResponseMode&&"input--error"),value:F.messageResponseMode??"",onChange:a=>Je("messageResponseMode",a.target.value),children:[e.jsx("option",{value:"",children:"System Default (On Heartbeat)"}),e.jsx("option",{value:"on-heartbeat",children:"On Heartbeat"}),e.jsx("option",{value:"immediate",children:"Immediate"})]}),H.messageResponseMode?e.jsx("span",{className:"config-error",children:H.messageResponseMode}):e.jsx("span",{className:"config-hint",children:"How this agent responds to incoming messages. 'Immediate' wakes the agent as soon as a message arrives. 'On Heartbeat' defers processing to the next scheduled heartbeat."})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Budget Settings"}),e.jsx("p",{className:"config-description",children:"Configure token budget limits for this agent. Leave all fields empty to disable budget tracking."}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"budget-tokenBudget",children:"Token Budget"}),e.jsx("input",{id:"budget-tokenBudget",type:"text",inputMode:"numeric",className:ae("input",!!H.tokenBudget&&"input--error"),placeholder:"No limit",value:r.tokenBudget??"",onChange:a=>We("tokenBudget",a.target.value)}),H.tokenBudget?e.jsx("span",{className:"config-error",children:H.tokenBudget}):e.jsx("span",{className:"config-hint",children:"Total token cap (input + output) for this agent. Leave empty for no limit."})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"budget-usageThreshold",children:"Usage Threshold (%)"}),e.jsx("input",{id:"budget-usageThreshold",type:"text",inputMode:"numeric",className:ae("input",!!H.usageThreshold&&"input--error"),placeholder:"80",value:r.usageThreshold??"",onChange:a=>We("usageThreshold",a.target.value)}),H.usageThreshold?e.jsx("span",{className:"config-error",children:H.usageThreshold}):e.jsx("span",{className:"config-hint",children:"Warning threshold as a percentage. Agent warns when usage reaches this level. Default: 80%."})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"budget-budgetPeriod",children:"Budget Period"}),e.jsxs("select",{id:"budget-budgetPeriod",className:ae("select",!!H.budgetPeriod&&"input--error"),value:r.budgetPeriod??"",onChange:a=>We("budgetPeriod",a.target.value),children:[e.jsx("option",{value:"",children:"No reset (lifetime)"}),e.jsx("option",{value:"daily",children:"Daily"}),e.jsx("option",{value:"weekly",children:"Weekly"}),e.jsx("option",{value:"monthly",children:"Monthly"})]}),H.budgetPeriod?e.jsx("span",{className:"config-error",children:H.budgetPeriod}):e.jsx("span",{className:"config-hint",children:"How often the budget counter resets. Leave empty for lifetime budget."})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"budget-resetDay",children:"Reset Day"}),e.jsx("input",{id:"budget-resetDay",type:"text",inputMode:"numeric",className:ae("input",!!H.resetDay&&"input--error"),placeholder:"Auto",value:r.resetDay??"",onChange:a=>We("resetDay",a.target.value)}),H.resetDay?e.jsx("span",{className:"config-error",children:H.resetDay}):e.jsx("span",{className:"config-hint",children:r.budgetPeriod==="weekly"?"Day of week (0=Sunday to 6=Saturday) for reset.":r.budgetPeriod==="monthly"?"Day of month (1-31) for reset.":"Day for reset (weekly: 0-6, monthly: 1-31). Leave empty for automatic."})]}),ye?.budgetLimit!=null&&e.jsxs("div",{className:"config-field",children:[e.jsx("label",{children:"Current Usage"}),e.jsxs("div",{className:"budget-progress-container",children:[e.jsx("div",{className:"budget-progress-bar",children:e.jsx("div",{className:ae("budget-progress-bar__fill",(ye.usagePercent??0)>=100?"budget-progress-bar__fill--red":(ye.usagePercent??0)>=80?"budget-progress-bar__fill--amber":"budget-progress-bar__fill--green"),style:{width:`${Math.min(ye.usagePercent??0,100)}%`}})}),e.jsxs("span",{className:"budget-progress-label",children:[(ye.currentUsage??0).toLocaleString()," / ",(ye.budgetLimit??0).toLocaleString()," tokens (",Math.round(ye.usagePercent??0),"% used)"]})]})]}),ye?.budgetLimit!=null&&e.jsx("div",{className:"config-field",children:e.jsx("button",{className:"btn btn-reset-budget",onClick:()=>void rt(),disabled:ps,children:ps?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:14,className:"animate-spin"}),"Resetting…"]}):e.jsxs(e.Fragment,{children:[e.jsx(hs,{size:14}),"Reset Budget Usage"]})})})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Instruction Bundle"}),e.jsx("p",{className:"config-description",children:"Configure the agent's instruction bundle. Leave empty to use inline instructions only."}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-mode",children:"Bundle Mode"}),e.jsxs("select",{id:"bundle-mode",className:"select",value:z,onChange:a=>ue(a.target.value),children:[e.jsx("option",{value:"",children:"None (use inline instructions)"}),e.jsx("option",{value:"managed",children:"Managed (system-managed directory)"}),e.jsx("option",{value:"external",children:"External (user-specified path)"})]}),e.jsxs("span",{className:"config-hint",children:[z==="managed"&&"Files will be stored in a system-managed directory within .fusion/agents/",z==="external"&&"Specify an external directory path for the instruction files",!z&&"Select a mode to enable instruction bundling"]})]}),z&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-entry-file",children:"Entry File"}),e.jsx("input",{id:"bundle-entry-file",type:"text",className:"input",placeholder:"AGENTS.md",value:ce,onChange:a=>fe(a.target.value)}),e.jsx("span",{className:"config-hint",children:"Primary instructions file name (default: AGENTS.md)"})]}),z==="external"&&e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-external-path",children:"External Path"}),e.jsx("input",{id:"bundle-external-path",type:"text",className:"input",placeholder:"e.g. .fusion/agents/my-agent",value:Q,onChange:a=>se(a.target.value)}),e.jsx("span",{className:"config-hint",children:"Absolute or relative path to the external directory"})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-files",children:"Files (comma-separated)"}),e.jsx("input",{id:"bundle-files",type:"text",className:"input",placeholder:"AGENTS.md, PROMPTS.md",value:A.join(", "),onChange:a=>re(a.target.value.split(",").map(u=>u.trim()).filter(Boolean))}),e.jsx("span",{className:"config-hint",children:"List of file names in the bundle directory"})]})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:"Advanced Settings"}),e.jsx("p",{className:"config-description",children:"Advanced configuration options for this agent. Leave a field empty to use system defaults."}),e.jsx("div",{className:"config-fields",children:De.map(a=>{const u=!!H[a.key];return e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:`adv-${a.key}`,children:a.label}),a.type==="select"?e.jsxs("select",{id:`adv-${a.key}`,className:ae("select",u&&"input--error"),value:v[a.key]??"",onChange:k=>Rs(a.key,k.target.value),children:[e.jsx("option",{value:"",children:"System Default"}),a.options?.map(k=>e.jsx("option",{value:k.value,children:k.label},k.value))]}):e.jsx("input",{id:`adv-${a.key}`,type:"text",inputMode:a.type==="number"?"numeric":void 0,className:ae("input",u&&"input--error"),placeholder:a.placeholder,value:v[a.key]??"",onChange:k=>Rs(a.key,k.target.value)}),u&&e.jsx("span",{className:"config-error",children:H[a.key]}),!u&&a.hint&&e.jsx("span",{className:"config-hint",children:a.hint})]},a.key)})}),e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!he||Se,onClick:()=>void ot(),children:Se?e.jsxs(e.Fragment,{children:[e.jsx(O,{size:16,className:"animate-spin"}),"Saving…"]}):e.jsxs(e.Fragment,{children:[e.jsx(ie,{size:16}),"Save Settings"]})}),Ms&&e.jsxs("span",{className:ae("config-saved-indicator",ts&&"config-saved-indicator--error"),children:[Se?e.jsx(O,{size:14,className:"animate-spin"}):e.jsx(ie,{size:14}),Ms]})]})]}),e.jsx(Fa,{agent:s,projectId:n,addToast:i,onSaved:c}),e.jsxs("div",{className:"config-section config-section--danger",children:[e.jsx("h3",{children:"Danger Zone"}),e.jsx("p",{className:"config-description",children:"Permanently delete this agent from the project."}),e.jsx("div",{className:"config-fields",children:e.jsxs("div",{className:"config-field",children:[e.jsxs("button",{className:"btn btn--danger",disabled:!ys||!x,onClick:()=>void x?.(),children:[e.jsx(Ke,{size:16}),"Delete Agent"]}),e.jsx("span",{className:"config-danger-note",children:ys?"Deletion is permanent and cannot be undone.":`Agent deletion is only available when state is idle or paused (current state: ${s.state}).`})]})})]})]})}function Ea({agentId:s,projectId:n,onChildClick:i}){const[c,m]=t.useState([]),[x,C]=t.useState(!0);return t.useEffect(()=>{C(!0),Ht(s,n).then(m).finally(()=>C(!1))},[s,n]),x?e.jsxs("div",{className:"detail-section",children:[e.jsx("div",{className:"detail-section-header",children:e.jsx("h3",{children:"Employees"})}),e.jsxs("div",{className:"detail-section-body detail-section-body--loading",children:[e.jsx(O,{size:16,className:"spin"}),e.jsx("span",{className:"text-muted",children:"Loading employees..."})]})]}):e.jsxs("div",{className:"detail-section",children:[e.jsxs("div",{className:"detail-section-header",children:[e.jsx("h3",{children:"Employees"}),e.jsxs("span",{className:"text-muted",children:["(",c.length,")"]})]}),e.jsx("div",{className:"detail-section-body",children:c.length===0?e.jsxs("div",{className:"agent-empty agent-empty--padded",children:[e.jsx(Gs,{size:32,opacity:.3}),e.jsx("p",{children:"No employees"}),e.jsx("p",{className:"text-muted",children:"This agent has no employees"})]}):e.jsx("div",{className:"agent-tree__children",children:c.map(g=>{const y=fs[g.state];return e.jsxs("div",{className:"agent-tree__node agent-is-child",onClick:()=>i?.(g.id),role:"button",tabIndex:0,onKeyDown:E=>{(E.key==="Enter"||E.key===" ")&&(E.key===" "&&E.preventDefault(),i?.(g.id))},style:{cursor:i?"pointer":"default"},children:[e.jsx("span",{className:"agent-tree__icon",children:g.icon??"🤖"}),e.jsx("span",{className:"agent-tree__name",children:g.name}),e.jsx("span",{className:"agent-tree__badge",style:{background:y?.bg??"var(--state-idle-bg)",color:y?.text??"var(--state-idle-text)",border:`1px solid ${y?.border??"var(--state-idle-border)"}`},children:g.state})]},g.id)})})})]})}export{za as AgentDetailView,Ae as relativeTime};
@@ -1 +0,0 @@
1
- .agent-detail-overlay{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:100;padding:var(--space-lg)}.agent-detail-modal{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;min-width:calc(var(--space-xl) * 20);max-width:calc(100vw - var(--space-2xl) - var(--space-xs) * 2);min-height:calc(var(--space-xl) * 13 + var(--space-sm));max-height:calc(100dvh - var(--space-2xl) - var(--space-xs) * 2);display:flex;flex-direction:column;overflow:hidden;resize:both;box-shadow:var(--shadow-lg)}.agent-detail-modal:not([style*=width]){width:min(calc(var(--space-xl) * 37 + var(--space-md)),calc(100vw - var(--space-2xl) - var(--space-xs) * 2))}.agent-detail-modal:not([style*=height]){height:min(85vh,calc(100dvh - var(--space-2xl) - var(--space-xs) * 2))}.agent-detail-inline-shell{width:100%;height:100%;min-height:0;display:flex;flex-direction:column;overflow:hidden}.agent-detail-inline{width:100%;height:100%;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--surface);border:1px solid var(--border)}.agent-detail-inline-loading{width:100%;height:100%;min-height:0;display:flex;align-items:center;justify-content:center;overflow:hidden}.agent-detail-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);padding:calc(var(--space-xl) * 2 + var(--space-md));color:var(--text-muted)}.agent-detail-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);padding:var(--space-md) calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border);background:var(--bg-secondary)}.agent-detail-identity{display:flex;align-items:center;gap:var(--space-md);flex-shrink:0;min-width:0}.agent-detail-inline-back{display:inline-flex;align-items:center;gap:var(--space-xs);min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs));padding:calc(var(--space-sm) - var(--space-xs) * .5) calc(var(--space-sm) + var(--space-xs) * .5);flex-shrink:0}.agent-detail-icon{width:calc(var(--space-lg) * 2 + var(--space-xs));height:calc(var(--space-lg) * 2 + var(--space-xs));display:flex;align-items:center;justify-content:center;color:var(--text);flex-shrink:0}.agent-detail-info{min-width:0}.agent-detail-info h2{font-size:calc(var(--space-md) + var(--space-xs));font-weight:600;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{display:flex;gap:var(--space-xs);margin-top:calc(var(--space-xs) * .5)}.agent-detail-header-actions{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-sm);flex:1 1 auto;min-width:0}.agent-detail-controls{display:flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25);flex-shrink:0}.btn--compact{padding:calc(var(--space-xs) + var(--space-xs) * .25) calc(var(--space-sm) + var(--space-xs) * .5);font-size:var(--space-md);gap:var(--space-xs)}.agent-detail-utility-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.agent-detail-import-btn{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-title{display:flex;align-items:center;gap:var(--space-lg)}.agent-detail-actions{display:flex;align-items:center;gap:var(--space-sm)}.agent-detail-tabs{display:flex;gap:var(--space-xs);padding:0 calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border);background:var(--bg-secondary)}.agent-detail-tab{display:flex;align-items:center;gap:var(--space-xs);padding:calc(var(--space-sm) + var(--space-xs) * .5) var(--space-md);background:none;border:none;border-bottom:calc(var(--space-xs) * .5) solid transparent;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) + var(--space-xs) * .25);cursor:pointer;transition:all var(--transition-fast)}.agent-detail-tab:hover{color:var(--text);background:var(--card-hover)}.agent-detail-tab.active{color:var(--todo);border-bottom-color:var(--todo)}.agent-detail-tab:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);background:color-mix(in srgb,var(--todo) 12%,transparent);color:var(--text);border-radius:var(--radius-sm)}.agent-detail-content{flex:1;overflow-y:auto;padding:var(--space-xl)}.agent-detail-footer{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md) var(--space-xl);border-top:1px solid var(--border);background:var(--bg-secondary);font-size:var(--space-md);color:var(--text-muted)}.agent-detail-id{font-family:var(--font-mono);cursor:pointer}.agent-detail-id:hover{color:var(--text)}.dashboard-tab{display:flex;flex-direction:column;gap:var(--space-xl)}.dashboard-summary-layout{padding-bottom:var(--space-md)}.dashboard-summary-health-reason{margin-left:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs))}.dashboard-summary-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.budget-warning-banner{display:flex;gap:var(--space-sm);align-items:flex-start;border:1px solid var(--color-warning);background:color-mix(in srgb,var(--color-warning) 12%,transparent);border-radius:var(--radius-md);padding:var(--space-md)}.dashboard-summary-hero__heading{display:flex;align-items:center;gap:var(--space-sm)}.dashboard-summary-hero__heading h3{margin:0;font-size:calc(var(--space-lg) + var(--space-xs) * .5);font-weight:600}.dashboard-summary-hero__meta{display:flex;flex-wrap:wrap;gap:var(--space-md);color:var(--text-muted)}.dashboard-summary-skills{display:inline-flex;align-items:center;gap:var(--space-sm)}.dashboard-summary-skill-badges{display:inline-flex;flex-wrap:wrap;gap:var(--space-xs)}.dashboard-summary-skill-badge{max-width:calc(var(--space-xl) * 8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-summary-skill-badge-btn{cursor:pointer}.dashboard-summary-skill-badge-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.dashboard-summary-skill-badge--selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 20%,transparent)}.dashboard-summary-skill-detail{margin-top:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.dashboard-summary-skill-detail-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.dashboard-summary-skill-detail-title{font-weight:600;color:var(--text)}.dashboard-summary-skill-detail-loading,.dashboard-summary-skill-detail-empty{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--text-muted)}.dashboard-summary-skill-detail-error{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-xs);color:var(--color-error)}.dashboard-summary-skill-detail-content{margin:0;padding:var(--space-sm);border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--card);color:var(--text);white-space:pre-wrap;word-break:break-word;max-height:calc(var(--space-2xl) * 6);overflow:auto}.dashboard-summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(calc(var(--space-xl) * 6 + var(--space-sm)),1fr));gap:var(--space-md)}.dashboard-summary-grid p{margin:0}.dashboard-summary-label{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted)}.dashboard-summary-health-row{display:inline-flex;align-items:center;gap:var(--space-xs)}.dashboard-summary-health-reason{margin-left:var(--space-xs);font-size:var(--space-md)}.runs-list{display:flex;flex-direction:column;gap:var(--space-sm)}.run-item{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:var(--space-sm)}.dashboard-section{background:var(--bg-secondary);border-radius:var(--radius-md);padding:calc(var(--space-lg) + var(--space-xs))}.dashboard-section h3{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:600;margin:0 0 var(--space-lg) 0;color:var(--text-muted);text-transform:uppercase;letter-spacing:calc(var(--space-xs) * .125)}.info-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 7 + var(--space-sm)),1fr));gap:var(--space-lg)}.info-item{display:flex;flex-direction:column;gap:var(--space-xs)}.info-label{font-size:var(--space-md);color:var(--text-muted)}.info-value{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:500}.inline-badge{display:inline-block;padding:calc(var(--space-xs) * .5) var(--space-sm);border-radius:var(--radius-sm);font-size:var(--space-md);text-transform:capitalize}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-lg)}.stat-card{background:var(--surface);border-radius:var(--radius-md);padding:var(--space-lg);text-align:center}.stat-value{font-size:calc(var(--space-lg) + var(--space-xs) * .5);font-weight:700;color:var(--todo)}.stat-label{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted);margin-top:var(--space-xs)}.current-task{display:flex;align-items:center;gap:var(--space-md)}.task-badge{font-family:var(--font-mono);background:var(--surface);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);font-size:calc(var(--space-md) + var(--space-xs) * .25)}.metadata-json{background:var(--surface);padding:var(--space-md);border-radius:var(--radius-sm);font-size:var(--space-md);overflow-x:auto;margin:0}.logs-tab{display:flex;flex-direction:column;height:100%}.logs-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--space-md);margin-bottom:var(--space-md);border-bottom:1px solid var(--border)}.logs-count{font-size:var(--space-md);color:var(--text-muted)}.streaming-indicator{display:flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25);font-size:var(--space-md);color:var(--color-success)}.streaming-dot{width:var(--space-sm);height:var(--space-sm);background:var(--color-success);border-radius:50%;animation:pulse 1.5s infinite}.logs-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:calc(var(--space-2xl) + var(--space-lg));color:var(--text-muted);text-align:center}.logs-empty p{margin:var(--space-sm) 0 0 0}.runs-tab{display:flex;flex-direction:column;gap:var(--space-md)}.runs-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:calc(var(--space-2xl) + var(--space-lg));color:var(--text-muted);text-align:center}.runs-empty p{margin:var(--space-sm) 0 0 0}.run-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg)}.run-card--active{border-color:var(--in-progress);background:color-mix(in srgb,var(--in-progress) 5%,transparent)}.run-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-sm)}.run-live-indicator{display:flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25);font-weight:600;color:var(--in-progress)}.live-dot{width:var(--space-sm);height:var(--space-sm);background:var(--in-progress);border-radius:50%;animation:pulse 1.5s infinite}.run-id{font-family:var(--font-mono);font-size:calc(var(--space-md) + var(--space-xs) * .25);color:var(--text-muted)}.run-status{display:flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25);font-size:calc(var(--space-md) + var(--space-xs) * .25);text-transform:capitalize}.run-status.active{color:var(--in-progress)}.run-status.completed{color:var(--color-success)}.run-status.failed{color:var(--color-error)}.run-status.terminated{color:var(--text-muted)}.run-details{display:flex;gap:var(--space-sm);font-size:var(--space-md);color:var(--text-muted)}.run-logs-container{padding:var(--space-md);background:var(--bg-secondary);border-top:1px solid var(--border);border-bottom:1px solid var(--border)}.run-details-loading-state{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) 0}.run-output-sections{margin-bottom:var(--space-md)}.run-output-section{margin-bottom:var(--space-sm)}.run-output-label{margin-bottom:var(--space-xs);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;letter-spacing:calc(var(--space-xs) * .1);text-transform:uppercase}.run-output-label--error{color:var(--color-error)}.run-output-panel{margin:0;max-height:calc(var(--space-2xl) * 6.25);overflow:auto;border-radius:var(--radius-sm);padding:var(--space-sm) var(--space-md);background:var(--surface);border:1px solid var(--border);white-space:pre-wrap;word-break:break-word;font-size:calc(var(--space-sm) + var(--space-xs));line-height:1.5}.run-output-panel--error{color:var(--color-error);border-color:color-mix(in srgb,var(--color-error) 35%,var(--border));background:color-mix(in srgb,var(--color-error) 10%,transparent)}.run-context-grid{display:flex;flex-wrap:wrap;gap:var(--space-xs) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs))}.run-context-item{line-height:1.5}.run-output-empty{padding:var(--space-sm) 0;font-style:italic;font-size:calc(var(--space-sm) + var(--space-xs))}.run-agent-logs-section{margin-top:var(--space-xs);padding-top:var(--space-sm);border-top:1px solid var(--border)}.agent-tasks-list{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-task-item{display:flex;flex-direction:column;gap:calc(var(--space-xs) + var(--space-sm) * .25);padding:var(--space-md) calc(var(--space-md) + var(--space-xs) * .5);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-secondary);text-decoration:none;transition:background var(--transition-fast),border-color var(--transition-fast)}.agent-task-item:hover{background:var(--card-hover);border-color:var(--text-dim)}.agent-task-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-task-id{font-family:var(--font-mono);font-size:var(--space-md);font-weight:600;color:var(--todo)}.agent-task-title{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:500;color:var(--text);line-height:1.4}.agent-task-status{font-size:var(--space-md);color:var(--text-muted)}.agent-task-column{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) var(--space-sm);border-radius:var(--radius-pill);font-size:calc(var(--space-sm) + var(--space-xs) * .5);font-weight:700;text-transform:uppercase;letter-spacing:calc(var(--space-xs) * .1)}.agent-task-column.column-triage{color:var(--triage);background:color-mix(in srgb,var(--triage) 18%,transparent)}.agent-task-column.column-todo{color:var(--todo);background:color-mix(in srgb,var(--todo) 18%,transparent)}.agent-task-column.column-in-progress{color:var(--in-progress);background:color-mix(in srgb,var(--in-progress) 18%,transparent)}.agent-task-column.column-in-review{color:var(--in-review);background:color-mix(in srgb,var(--in-review) 18%,transparent)}.agent-task-column.column-done{color:var(--done);background:color-mix(in srgb,var(--done) 18%,transparent)}.agent-task-column.column-archived{color:var(--text-muted);background:color-mix(in srgb,var(--text-muted) 18%,transparent)}.agent-tasks-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:calc(var(--space-2xl) + var(--space-lg));color:var(--text-muted);text-align:center}.agent-tasks-empty p{margin:0}.config-tab{display:flex;flex-direction:column;gap:var(--space-xl)}.config-section{background:var(--bg-secondary);border-radius:var(--radius-md);padding:calc(var(--space-md) + var(--space-sm))}.config-section h3{font-size:calc(var(--space-md) + var(--space-xs));font-weight:600;margin:0 0 var(--space-sm) 0}.config-section--danger{border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent)}.config-danger-note{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.agent-content-toolbar{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-sm) var(--space-lg);border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0}.agent-content-mode-toggle{display:flex;align-items:center;gap:var(--space-xs)}.agent-content-mode-toggle .btn{display:inline-flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.agent-content-preview{overflow-y:auto;padding:var(--space-lg);min-height:150px}.agent-content-placeholder{color:var(--text-muted);text-align:center;padding:var(--space-xl);min-height:150px;display:flex;align-items:center;justify-content:center}.config-description{font-size:calc(var(--space-md) + var(--space-xs) * .5);color:var(--text-muted);margin:0 0 calc(var(--space-md) + var(--space-sm)) 0}.config-fields{display:flex;flex-direction:column;gap:var(--space-lg)}.config-field{display:flex;flex-direction:column;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.config-field label{font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500}.agent-avatar-editor{display:flex;align-items:center;gap:var(--space-md)}.agent-avatar-editor-preview{background:var(--card)}.agent-avatar-editor-actions{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.config-runtime-tabs{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-sm);margin-bottom:var(--space-md)}.config-runtime-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)}.config-runtime-tab:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.config-runtime-tab:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.config-runtime-tab.active{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.config-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-style:italic}.config-error{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--color-error)}.input--error{border-color:var(--color-error)!important}.config-actions{display:flex;align-items:center;gap:var(--space-md);margin-top:calc(var(--space-md) + var(--space-sm));padding-top:var(--space-lg);border-top:1px solid var(--border)}.config-saved-indicator{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)}.config-saved-indicator--error{color:var(--color-error)}.heartbeat-procedure-actions{margin-top:var(--space-sm)}.heartbeat-procedure-viewer{margin-top:var(--space-lg)}.heartbeat-procedure-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin-left:auto}.heartbeat-procedure-status--warning{color:var(--color-warning)}.rating-summary-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:calc(var(--space-md) + var(--space-sm));display:flex;flex-direction:column;gap:var(--space-md)}.rating-score-display{display:flex;align-items:center;gap:var(--space-md)}.rating-average{font-size:var(--space-2xl);font-weight:700;line-height:1}.rating-stats{display:flex;align-items:center;gap:var(--space-md)}.rating-count{font-size:calc(var(--space-md) + var(--space-xs) * .5);color:var(--text-muted)}.rating-trend-badge{font-size:var(--space-md);padding:var(--space-xs) calc(var(--space-md) - var(--space-xs) * .5);border-radius:var(--radius-lg);font-weight:500}.trend-improving{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.trend-declining{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error)}.trend-stable{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.trend-insufficient{background:var(--bg-tertiary);color:var(--text-muted)}.category-breakdown{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg)}.category-breakdown h4{margin:0 0 var(--space-md) 0;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:600}.category-breakdown .category-item{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;border-bottom:1px solid var(--border)}.category-breakdown .category-item:last-child{border-bottom:none}.category-name{text-transform:capitalize;font-size:calc(var(--space-md) + var(--space-xs) * .25)}.category-score{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .25)}.add-rating-form{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.add-rating-form h4{margin:0;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:600}.star-selector{display:flex;gap:var(--space-xs)}.star-btn{background:none;border:none;padding:var(--space-xs);cursor:pointer;border-radius:var(--radius-sm);color:var(--text-muted);transition:background-color var(--transition-fast),color var(--transition-fast)}.star-btn:hover{background:var(--card-hover)}.star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.rating-stars{display:inline-flex;gap:var(--space-xs)}.rating-stars .star-filled{color:var(--color-warning)}.rating-stars .star-empty{color:var(--text-muted)}.add-rating-form .add-rating-category-select,.add-rating-form .add-rating-comment-input{width:100%}.add-rating-form .add-rating-comment-input{resize:vertical;min-height:calc(var(--space-xl) + var(--space-2xl))}.rating-history{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);max-height:calc(var(--space-xl) * 12 + var(--space-md));overflow-y:auto}.rating-history h4{margin:0 0 var(--space-md) 0;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:600}.rating-history .no-ratings{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);text-align:center;padding:var(--space-lg)}.rating-history-item{padding:var(--space-md) 0;border-bottom:1px solid var(--border)}.rating-history-item:last-child{border-bottom:none}.rating-item-header{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.rating-category-badge{font-size:calc(var(--space-sm) + var(--space-xs) * .5);padding:calc(var(--space-xs) * .5) var(--space-sm);background:var(--card-hover);border-radius:var(--radius-pill);text-transform:capitalize}.rating-time{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted);margin-left:auto}.rating-delete-btn{background:none;border:none;padding:var(--space-xs);cursor:pointer;color:var(--text-muted);border-radius:var(--radius-sm);transition:color var(--transition-fast),background-color var(--transition-fast)}.rating-delete-btn:hover{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.rating-comment{margin:var(--space-sm) 0 0 0;font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted);line-height:1.4}.runs-loading-row{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl)}.runs-toolbar{padding:var(--space-sm) var(--space-lg);border-bottom:1px solid var(--border)}.runs-toolbar--between{display:flex;justify-content:space-between;align-items:center}.runs-toolbar-meta{font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.run-card--clickable{cursor:pointer}.run-card--clickable:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.run-header-group{display:flex;align-items:center;gap:var(--space-sm)}.run-badge--compact{font-size:calc(var(--space-sm) + var(--space-xs) * .5);padding:calc(var(--space-xs) * .25) calc(var(--space-sm) * .75)}.run-output-summary{cursor:pointer;user-select:none}.run-live-indicator--with-margin{margin-left:var(--space-sm)}.detail-section-body--loading{display:flex;align-items:center;gap:var(--space-sm)}.agent-empty--padded{padding:var(--space-xl)}.logs-fallback-label{font-size:calc(var(--space-sm) + var(--space-xs))}.config-textarea-mono{font-family:var(--font-mono);font-size:calc(var(--space-md) + var(--space-xs) * .25);resize:vertical}.config-textarea-top-spacing{margin-top:var(--space-sm)}.config-hint--block-spacing{margin-bottom:var(--space-md)}.config-hint--block{display:block;margin-bottom:var(--space-sm)}.config-hint--top-spacing{margin-top:var(--space-sm)}.config-hint--inline-loader{display:inline-flex;gap:var(--space-xs);margin-top:var(--space-sm)}.config-inline-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-sm)}.config-hint--inline-tight{display:flex;align-items:center;gap:var(--space-xs)}.config-hint--warning{color:var(--color-warning)}@media(max-width:768px){.config-runtime-tabs{grid-template-columns:1fr}.agent-detail-overlay{padding:0;align-items:stretch}.agent-detail-modal{min-width:0!important;min-height:0!important;width:100vw!important;height:100dvh!important;max-width:100vw!important;max-height:100dvh;margin:0;border-radius:0;border:none;resize:none}.agent-detail-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:var(--space-xs);row-gap:0;padding:var(--space-sm) var(--space-md);padding-top:max(var(--space-sm),env(safe-area-inset-top,0))}.agent-detail-identity{grid-column:1;grid-row:1;flex:1 1 auto;min-width:0;gap:var(--space-sm)}.agent-detail-icon{width:calc(var(--space-lg) * 2);height:calc(var(--space-lg) * 2);flex-shrink:0}.agent-detail-icon svg{width:calc(var(--space-sm) + var(--space-xs) * 2);height:calc(var(--space-sm) + var(--space-xs) * 2)}.agent-detail-info h2{font-size:calc(var(--space-md) + var(--space-xs) * .75);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{flex-wrap:wrap}.agent-detail-header-actions{grid-column:2;grid-row:1;flex:0 0 auto;justify-content:flex-end;gap:calc(var(--space-xs) * .5)}.agent-detail-controls{flex:0 0 auto;gap:calc(var(--space-xs) * .5)}.agent-detail-controls .btn--compact{padding:calc(var(--space-sm) - var(--space-xs) * .5) calc(var(--space-md) - var(--space-xs) * .5);font-size:var(--space-md);min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-controls .agent-detail-mobile-icon-control{min-width:calc(var(--space-lg) + var(--space-md) + var(--space-xs));padding-left:calc(var(--space-sm) - var(--space-xs) * .5);padding-right:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-detail-controls .agent-detail-mobile-icon-control .agent-detail-control-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.agent-detail-controls .btn--compact svg{width:calc(var(--space-md) + var(--space-xs) * .5);height:calc(var(--space-md) + var(--space-xs) * .5)}.agent-detail-utility-actions{flex-shrink:0;margin-left:0}.agent-detail-utility-actions .btn-icon{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs));min-width:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-import-btn{min-width:calc(var(--space-xl) * 3 + var(--space-xs))}.agent-detail-title{flex:1 1 auto;min-width:0;gap:var(--space-md)}.agent-detail-actions{flex:1 1 100%;flex-wrap:wrap;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.agent-detail-actions .btn{padding:calc(var(--space-sm) - var(--space-xs) * .5) calc(var(--space-md) - var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-actions .btn svg{width:calc(var(--space-sm) + var(--space-xs) * 1.5);height:calc(var(--space-sm) + var(--space-xs) * 1.5)}.agent-detail-actions .btn-icon{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs));min-width:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-tabs{padding:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.agent-detail-tabs::-webkit-scrollbar{display:none}.agent-detail-tab{padding:var(--space-md) calc(var(--space-md) + var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);white-space:nowrap;min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-content{padding:var(--space-lg)}.agent-detail-footer{flex-wrap:wrap;gap:var(--space-sm);padding:var(--space-sm) var(--space-lg);padding-bottom:max(var(--space-sm),env(safe-area-inset-bottom,0));font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-detail-id{max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-tab{gap:var(--space-lg)}.dashboard-summary-skills,.dashboard-summary-skill-detail-header{flex-direction:column;align-items:flex-start}.dashboard-section{padding:var(--space-lg)}.info-grid{grid-template-columns:repeat(2,1fr);gap:var(--space-md)}.stats-grid{grid-template-columns:repeat(3,1fr);gap:var(--space-md)}.stat-value{font-size:calc(var(--space-lg) + var(--space-xs) * .5)}.logs-empty{padding:var(--space-2xl) var(--space-lg)}.run-card{padding:var(--space-md)}.run-header{flex-wrap:wrap;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.run-details{flex-wrap:wrap}.run-logs-container{padding:var(--space-sm)}.run-output-panel{max-height:calc(var(--space-2xl) * 5)}.run-context-grid{flex-direction:column;gap:var(--space-xs)}.run-details .text-muted{min-width:0;overflow-wrap:anywhere}.config-tab{gap:var(--space-lg)}.config-section{padding:var(--space-lg)}.config-section .input,.config-section .select,.config-section textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.config-actions{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.config-actions .btn{width:100%;justify-content:center}.heartbeat-procedure-status{margin-left:0}}@media(max-width:480px){.info-grid,.stats-grid{grid-template-columns:1fr}.agent-detail-actions{flex-direction:column;width:100%}.agent-detail-actions .btn{width:100%;justify-content:center}.agent-detail-actions .btn-icon{align-self:flex-end}.agent-detail-footer .divider,.agent-detail-footer .text-muted,.agent-detail-footer .link{display:none}}@media(max-width:768px){.agent-avatar-editor{flex-direction:column;align-items:flex-start}.agent-avatar-editor-actions{width:100%}.agent-avatar-editor-actions .btn{min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.agent-dialog-overlay{padding:0;align-items:stretch}.agent-dialog{width:100vw!important;height:100dvh;max-width:100%!important;max-height:100dvh;border-radius:0;border:none}.agent-dialog-header{padding:max(var(--space-md),env(safe-area-inset-top,0px)) var(--space-lg) var(--space-md) var(--space-lg);flex-shrink:0}.agent-dialog-body{padding:var(--space-lg);-webkit-overflow-scrolling:touch}.agent-dialog-footer{padding:var(--space-md) var(--space-lg);padding-bottom:max(var(--space-md),env(safe-area-inset-bottom,0px));flex-wrap:wrap;gap:var(--space-sm)}.agent-dialog-field .input,.agent-dialog-field .select,.agent-dialog-field textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.agent-dialog-summary-row{flex-direction:column;gap:calc(var(--space-xs) * .5)}.agent-dialog-summary-row>span:first-child,.agent-dialog-summary-row-label{width:auto}.agent-dialog-steps{padding:var(--space-sm) var(--space-lg)}.agent-dialog-step{flex:1;width:auto;height:calc(var(--space-xs) - var(--space-xs) * .25)}.agent-dialog-tabs{grid-template-columns:1fr;gap:calc(var(--space-sm) - var(--space-xs) * .5);margin-bottom:var(--space-md)}.agent-dialog-tab{min-height:calc(var(--space-lg) * 2 + var(--space-xs));text-align:left}.agent-import-file-upload{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.agent-import-textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-xl) * 4 + var(--space-xs))}.agent-import-agent-list{max-height:calc(100dvh - (var(--space-xl) * 10 + var(--space-lg)))}.agent-import-result-stats{flex-direction:column;gap:var(--space-sm);align-items:center}.agent-import-browse-list{max-height:calc(100dvh - (var(--space-xl) * 10 + var(--space-lg)))}.agent-import-skill-list{max-height:calc(100dvh - (var(--space-xl) * 15 + var(--space-md)))}}@media(max-width:480px){.agent-dialog-body{padding:var(--space-md)}.agent-dialog-footer{flex-direction:column}.agent-dialog-footer .btn{width:100%;justify-content:center}}.reflections-tab{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.reflections-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md)}.reflections-header h3{display:flex;align-items:center;gap:var(--space-sm);font-size:1rem;font-weight:600;color:var(--text)}.reflections-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--space-md)}.reflections-stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);text-align:center}.reflections-stat-card .stat-value{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);font-size:1.5rem;font-weight:700;color:var(--text);margin-bottom:var(--space-xs)}.reflections-stat-card .stat-label{font-size:.75rem;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em}.reflections-no-data{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl);color:var(--text-secondary);text-align:center}.reflections-list{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-loading-indicator{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-lg)}.reflections-ratings-section{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-ratings-section>h4,.reflections-list h4{font-size:.875rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-cards{display:flex;flex-direction:column;gap:var(--space-sm)}.reflection-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);cursor:pointer;transition:border-color .15s,background-color .15s}.reflection-card:hover{border-color:var(--border-active);background:var(--card-hover)}.reflection-card:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.reflection-card--expanded{border-color:var(--color-primary)}.reflection-card-header{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-sm)}.reflection-trigger-badge{font-size:.7rem;font-weight:600;padding:2px 6px;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.05em}.reflection-trigger-periodic{background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.reflection-trigger-post-task{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.reflection-trigger-manual{background:color-mix(in srgb,var(--color-primary) 15%,transparent);color:var(--color-primary)}.reflection-trigger-user-requested{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.reflection-timestamp{font-size:.75rem;color:var(--text-muted);flex:1}.reflection-chevron{color:var(--text-muted)}.reflection-summary{font-size:.875rem;color:var(--text);line-height:1.5}.reflection-details{margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--border);display:flex;flex-direction:column;gap:var(--space-md)}.reflection-insights h5,.reflection-suggestions h5{display:flex;align-items:center;gap:var(--space-xs);font-size:.8rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-insights ul,.reflection-suggestions ul{list-style:none;display:flex;flex-direction:column;gap:var(--space-xs)}.reflection-insights li,.reflection-suggestions li{font-size:.8rem;color:var(--text-secondary);padding-left:var(--space-md);position:relative}.reflection-insights li:before{content:"•";position:absolute;left:4px;color:var(--color-success)}.reflection-suggestions li:before{content:"→";position:absolute;left:0;color:var(--color-primary)}.reflection-metrics{background:var(--bg);border-radius:var(--radius-sm);padding:var(--space-sm)}.reflection-metrics h5{font-size:.75rem;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-xs)}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:var(--space-sm)}.metric{display:flex;flex-direction:column;gap:2px}.metric-label{font-size:.7rem;color:var(--text-muted)}.metric-value{font-size:.875rem;font-weight:600;color:var(--text)}.reflection-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);color:var(--text-secondary);text-align:center}.reflection-empty p{font-size:.875rem}@media(max-width:768px){.reflections-header{flex-wrap:wrap;align-items:flex-start}.reflections-header .btn{width:100%;justify-content:center}}.budget-progress-container{margin-top:4px}.budget-progress-bar{width:100%;height:8px;background:var(--bg-secondary, #161b22);border-radius:4px;overflow:hidden;margin-top:4px}.budget-progress-bar__fill{height:100%;border-radius:4px;transition:width .3s ease,background-color .3s ease}.budget-progress-bar__fill--green{background:var(--state-active-text, #3fb950)}.budget-progress-bar__fill--amber{background:var(--state-paused-text, #e3b541)}.budget-progress-bar__fill--red{background:var(--state-error-text, #f85149)}.budget-progress-label{font-size:.75rem;color:var(--text-secondary, #8b949e);margin-top:4px;display:block}.budget-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:12px;font-size:.75rem;font-weight:500}.budget-warning-banner{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:6px;background:var(--state-error-bg, rgba(248,81,73,.15));color:var(--state-error-text, #f85149);border:1px solid var(--state-error-border, #f85149);font-size:.875rem;margin-bottom:12px}.btn-reset-budget{margin-top:8px}.chat-sidebar-footer{display:none}@media(max-width:768px){.chat-view{flex-direction:column}.chat-sidebar{width:100%;min-width:100%;height:100%;max-height:none;border-right:none;border-bottom:1px solid var(--border);flex-direction:column}.chat-sidebar-header,.chat-sidebar-search{display:none}.chat-sidebar-list{flex:1;min-height:0;overflow-y:auto}.chat-sidebar-footer{display:flex;padding:var(--space-md);border-top:1px solid var(--border);background:var(--bg-secondary)}.chat-sidebar-footer-btn{flex:1;justify-content:center}.chat-sidebar--hidden{display:none}.chat-message{max-width:90%}.chat-new-dialog{width:95vw;margin:16px}.chat-thread-header{padding:8px 12px}.chat-skill-menu{left:var(--space-md);right:calc(var(--space-md) + var(--mobile-nav-height));min-width:0;max-width:none}}@media(max-width:768px){.file-mention-popup{max-height:200px}.file-mention-popup-item{min-height:36px;padding:10px 12px}.agent-mention-popup{max-width:280px;min-width:200px}}