@geminilight/mindos 0.6.56 → 0.6.57

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 (374) hide show
  1. package/_standalone/.mindos-build-version +1 -1
  2. package/_standalone/.next/BUILD_ID +1 -1
  3. package/_standalone/.next/app-path-routes-manifest.json +23 -21
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +8 -8
  10. package/_standalone/.next/routes-manifest.json +12 -0
  11. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error.html +2 -2
  14. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  22. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js +2 -6
  28. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/agents/custom/detect/route.js +1 -0
  41. package/_standalone/.next/server/app/api/agents/custom/detect/route.js.nft.json +1 -0
  42. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -0
  43. package/_standalone/.next/server/app/api/agents/custom/route.js +1 -0
  44. package/_standalone/.next/server/app/api/agents/custom/route.js.nft.json +1 -0
  45. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -0
  46. package/_standalone/.next/server/app/api/ask/route.js +3 -3
  47. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  48. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  52. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  54. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  56. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  58. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  60. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  61. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  62. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  64. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  66. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  72. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  75. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  77. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
  79. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  80. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  89. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  92. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  94. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  97. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  99. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  108. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  114. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/changes/page.js +1 -1
  116. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  117. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  119. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  120. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/echo/page.js +1 -1
  122. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/explore/page.js +1 -1
  125. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/help/page.js +1 -1
  128. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  129. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  131. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/login/page.js +1 -1
  134. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/page.js +1 -1
  137. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  138. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/setup/page.js +1 -1
  140. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  141. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/trash/page.js +3 -3
  143. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  144. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  145. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  146. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  147. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/wiki/page.js +1 -1
  149. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app-paths-manifest.json +23 -21
  152. package/_standalone/.next/server/chunks/2159.js +52 -0
  153. package/_standalone/.next/server/chunks/{2190.js → 3484.js} +1 -1
  154. package/_standalone/.next/server/chunks/530.js +29 -29
  155. package/_standalone/.next/server/chunks/6539.js +1 -1
  156. package/_standalone/.next/server/chunks/8388.js +3 -3
  157. package/_standalone/.next/server/chunks/953.js +2 -2
  158. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  159. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  160. package/_standalone/.next/server/pages/500.html +2 -2
  161. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  162. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  163. package/_standalone/.next/static/chunks/1053-5cb008a24930e271.js +29 -0
  164. package/_standalone/.next/static/chunks/1477.33df3cce509578c2.js +1 -0
  165. package/_standalone/.next/static/chunks/{1814.b08e9fb85dd3b13c.js → 1814.a7c127b2c73d1f70.js} +1 -1
  166. package/_standalone/.next/static/chunks/2549-e63cf57fa927a41d.js +1 -0
  167. package/_standalone/.next/static/chunks/{1007.c11404e50b39d165.js → 2647.e0b67d0c432ad7e7.js} +10 -10
  168. package/_standalone/.next/static/chunks/{2872.c8c8593be1ba4735.js → 2872.045858d00bd8307f.js} +2 -2
  169. package/_standalone/.next/static/chunks/362.3978790a2e636c3c.js +2 -0
  170. package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +1 -0
  171. package/_standalone/.next/static/chunks/54a60aa6.7a74f547ec1bdd5a.js +79 -0
  172. package/_standalone/.next/static/chunks/6087.4b6102dc0bcd07a7.js +1 -0
  173. package/_standalone/.next/static/chunks/6878-e2c5459e1c608f89.js +1 -0
  174. package/_standalone/.next/static/chunks/7249-8cd568ad23656622.js +11 -0
  175. package/_standalone/.next/static/chunks/8252-e5ae7ced3a41e0ed.js +1 -0
  176. package/_standalone/.next/static/chunks/{8753-ea9db680b0f70f25.js → 8658-16ff58b75ae37fbb.js} +1 -1
  177. package/_standalone/.next/static/chunks/{7322-d67d05067544864c.js → 9274-296ab35f9f09e42e.js} +1 -1
  178. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-2f4705aa66819b86.js +1 -0
  179. package/_standalone/.next/static/chunks/app/_global-error/page-2f4705aa66819b86.js +1 -0
  180. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-7bdeab5af8e4f5f2.js +1 -0
  181. package/_standalone/.next/static/chunks/app/agents/page-5d1446665ddb3801.js +1 -0
  182. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-2f4705aa66819b86.js +1 -0
  183. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-2f4705aa66819b86.js +1 -0
  184. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2f4705aa66819b86.js +1 -0
  185. package/_standalone/.next/static/chunks/app/api/a2a/route-2f4705aa66819b86.js +1 -0
  186. package/_standalone/.next/static/chunks/app/api/acp/config/route-2f4705aa66819b86.js +1 -0
  187. package/_standalone/.next/static/chunks/app/api/acp/detect/route-2f4705aa66819b86.js +1 -0
  188. package/_standalone/.next/static/chunks/app/api/acp/install/route-2f4705aa66819b86.js +1 -0
  189. package/_standalone/.next/static/chunks/app/api/acp/registry/route-2f4705aa66819b86.js +1 -0
  190. package/_standalone/.next/static/chunks/app/api/acp/session/route-2f4705aa66819b86.js +1 -0
  191. package/_standalone/.next/static/chunks/app/api/agent-activity/route-2f4705aa66819b86.js +1 -0
  192. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2f4705aa66819b86.js +1 -0
  193. package/_standalone/.next/static/chunks/app/api/agents/custom/route-2f4705aa66819b86.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/ask/route-2f4705aa66819b86.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2f4705aa66819b86.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/auth/route-2f4705aa66819b86.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/backlinks/route-2f4705aa66819b86.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/bootstrap/route-2f4705aa66819b86.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/changes/route-2f4705aa66819b86.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/export/route-2f4705aa66819b86.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2f4705aa66819b86.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/file/import/route-2f4705aa66819b86.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/file/raw/route-2f4705aa66819b86.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/file/route-2f4705aa66819b86.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/files/route-2f4705aa66819b86.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/git/route-2f4705aa66819b86.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/graph/route-2f4705aa66819b86.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/health/route-2f4705aa66819b86.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/inbox/route-2f4705aa66819b86.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/init/route-2f4705aa66819b86.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2f4705aa66819b86.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/mcp/install/route-2f4705aa66819b86.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2f4705aa66819b86.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2f4705aa66819b86.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/mcp/status/route-2f4705aa66819b86.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2f4705aa66819b86.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/monitoring/route-2f4705aa66819b86.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/recent-files/route-2f4705aa66819b86.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/restart/route-2f4705aa66819b86.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/search/route-2f4705aa66819b86.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2f4705aa66819b86.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2f4705aa66819b86.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/settings/route-2f4705aa66819b86.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2f4705aa66819b86.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2f4705aa66819b86.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2f4705aa66819b86.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2f4705aa66819b86.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/setup/ls/route-2f4705aa66819b86.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/setup/route-2f4705aa66819b86.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/skills/route-2f4705aa66819b86.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/sync/route-2f4705aa66819b86.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/tree-version/route-2f4705aa66819b86.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/uninstall/route-2f4705aa66819b86.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/update/route-2f4705aa66819b86.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/update-check/route-2f4705aa66819b86.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/update-status/route-2f4705aa66819b86.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/workflows/route-2f4705aa66819b86.js +1 -0
  238. package/_standalone/.next/static/chunks/app/echo/[segment]/{page-6710da1f581b2854.js → page-b0103509ce34444b.js} +4 -4
  239. package/_standalone/.next/static/chunks/app/echo/page-2f4705aa66819b86.js +1 -0
  240. package/_standalone/.next/static/chunks/app/{layout-d5f28933c5e14d74.js → layout-b3919384ec2eb979.js} +11 -11
  241. package/_standalone/.next/static/chunks/app/loading-2f4705aa66819b86.js +1 -0
  242. package/_standalone/.next/static/chunks/app/{page-45140253e07a135a.js → page-6436a99cda35132b.js} +1 -1
  243. package/_standalone/.next/static/chunks/app/setup/{page-9a81fa4d82c6351b.js → page-99fcfc460fa29733.js} +1 -1
  244. package/_standalone/.next/static/chunks/app/trash/page-8dc388695344fdd4.js +1 -0
  245. package/_standalone/.next/static/chunks/app/view/[...path]/loading-2f4705aa66819b86.js +1 -0
  246. package/_standalone/.next/static/chunks/app/view/[...path]/{page-62cfae628e31d411.js → page-b292b55305ecc021.js} +2 -2
  247. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2f4705aa66819b86.js +1 -0
  248. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2f4705aa66819b86.js +1 -0
  249. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2f4705aa66819b86.js +1 -0
  250. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2f4705aa66819b86.js +1 -0
  251. package/_standalone/.next/static/chunks/webpack-2c19436659aa657b.js +1 -0
  252. package/_standalone/.next/static/css/fd84c8316ead16eb.css +1 -0
  253. package/_standalone/.next/static/zOaEtgJbdRMncnCBucULp/_buildManifest.js +1 -0
  254. package/_standalone/.next/trace +64 -64
  255. package/_standalone/.next/types/routes.d.ts +3 -1
  256. package/_standalone/.next/types/validator.ts +18 -0
  257. package/_standalone/components/Editor.tsx +124 -6
  258. package/_standalone/components/MarkdownView.tsx +3 -1
  259. package/_standalone/components/WysiwygEditor.tsx +90 -0
  260. package/_standalone/components/agents/AgentsOverviewSection.tsx +100 -8
  261. package/_standalone/components/agents/CustomAgentModal.tsx +613 -0
  262. package/_standalone/components/settings/types.ts +4 -0
  263. package/_standalone/hooks/useEditorImageUpload.ts +113 -0
  264. package/_standalone/lib/image.ts +47 -0
  265. package/_standalone/tsconfig.tsbuildinfo +1 -1
  266. package/app/app/api/agents/custom/detect/route.ts +31 -0
  267. package/app/app/api/agents/custom/route.ts +150 -0
  268. package/app/app/api/file/import/route.ts +42 -0
  269. package/app/app/api/mcp/agents/route.ts +59 -7
  270. package/app/app/api/settings/list-models/route.ts +16 -2
  271. package/app/components/Editor.tsx +124 -6
  272. package/app/components/MarkdownView.tsx +3 -1
  273. package/app/components/WysiwygEditor.tsx +90 -0
  274. package/app/components/agents/AgentDetailContent.tsx +74 -1
  275. package/app/components/agents/AgentsContentPage.tsx +76 -1
  276. package/app/components/agents/AgentsOverviewSection.tsx +100 -8
  277. package/app/components/agents/CustomAgentModal.tsx +613 -0
  278. package/app/components/settings/types.ts +4 -0
  279. package/app/hooks/useEditorImageUpload.ts +113 -0
  280. package/app/lib/agent/model.ts +7 -1
  281. package/app/lib/agent/providers.ts +31 -6
  282. package/app/lib/core/organize.ts +1 -1
  283. package/app/lib/core/tree.ts +1 -1
  284. package/app/lib/custom-agents.ts +279 -0
  285. package/app/lib/fs.ts +1 -1
  286. package/app/lib/i18n/modules/panels.ts +96 -0
  287. package/app/lib/image.ts +47 -0
  288. package/app/lib/settings.ts +4 -0
  289. package/bin/commands/start.js +5 -4
  290. package/bin/commands/update.js +6 -2
  291. package/bin/lib/gateway.js +6 -2
  292. package/mcp/dist/index.cjs +1 -1
  293. package/mcp/src/index.ts +6 -1
  294. package/package.json +1 -1
  295. package/_standalone/.next/server/chunks/7543.js +0 -52
  296. package/_standalone/.next/static/3gMJ8EaZfDgHmB0NR0Q4T/_buildManifest.js +0 -1
  297. package/_standalone/.next/static/chunks/1053-2874859f7caefa0f.js +0 -29
  298. package/_standalone/.next/static/chunks/1880-7abf971bcfd2389b.js +0 -11
  299. package/_standalone/.next/static/chunks/254-32719a9bea2e74f0.js +0 -1
  300. package/_standalone/.next/static/chunks/362.a77be2f206db7b19.js +0 -1
  301. package/_standalone/.next/static/chunks/3637.0541ac2d0ea7de1f.js +0 -1
  302. package/_standalone/.next/static/chunks/54a60aa6.b97ba5e6900c089b.js +0 -79
  303. package/_standalone/.next/static/chunks/6087.0c32d26d0262c8e7.js +0 -1
  304. package/_standalone/.next/static/chunks/7035-2af69391c7b1ad95.js +0 -1
  305. package/_standalone/.next/static/chunks/8131.5e0bdb36bb91f212.js +0 -1
  306. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-e240db6d5049d336.js +0 -1
  307. package/_standalone/.next/static/chunks/app/_global-error/page-e240db6d5049d336.js +0 -1
  308. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-f006a70f6889eb56.js +0 -1
  309. package/_standalone/.next/static/chunks/app/agents/page-bd522e428e3acb78.js +0 -5
  310. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-e240db6d5049d336.js +0 -1
  311. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-e240db6d5049d336.js +0 -1
  312. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e240db6d5049d336.js +0 -1
  313. package/_standalone/.next/static/chunks/app/api/a2a/route-e240db6d5049d336.js +0 -1
  314. package/_standalone/.next/static/chunks/app/api/acp/config/route-e240db6d5049d336.js +0 -1
  315. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e240db6d5049d336.js +0 -1
  316. package/_standalone/.next/static/chunks/app/api/acp/install/route-e240db6d5049d336.js +0 -1
  317. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e240db6d5049d336.js +0 -1
  318. package/_standalone/.next/static/chunks/app/api/acp/session/route-e240db6d5049d336.js +0 -1
  319. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e240db6d5049d336.js +0 -1
  320. package/_standalone/.next/static/chunks/app/api/ask/route-e240db6d5049d336.js +0 -1
  321. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e240db6d5049d336.js +0 -1
  322. package/_standalone/.next/static/chunks/app/api/auth/route-e240db6d5049d336.js +0 -1
  323. package/_standalone/.next/static/chunks/app/api/backlinks/route-e240db6d5049d336.js +0 -1
  324. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e240db6d5049d336.js +0 -1
  325. package/_standalone/.next/static/chunks/app/api/changes/route-e240db6d5049d336.js +0 -1
  326. package/_standalone/.next/static/chunks/app/api/export/route-e240db6d5049d336.js +0 -1
  327. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e240db6d5049d336.js +0 -1
  328. package/_standalone/.next/static/chunks/app/api/file/import/route-e240db6d5049d336.js +0 -1
  329. package/_standalone/.next/static/chunks/app/api/file/raw/route-e240db6d5049d336.js +0 -1
  330. package/_standalone/.next/static/chunks/app/api/file/route-e240db6d5049d336.js +0 -1
  331. package/_standalone/.next/static/chunks/app/api/files/route-e240db6d5049d336.js +0 -1
  332. package/_standalone/.next/static/chunks/app/api/git/route-e240db6d5049d336.js +0 -1
  333. package/_standalone/.next/static/chunks/app/api/graph/route-e240db6d5049d336.js +0 -1
  334. package/_standalone/.next/static/chunks/app/api/health/route-e240db6d5049d336.js +0 -1
  335. package/_standalone/.next/static/chunks/app/api/inbox/route-e240db6d5049d336.js +0 -1
  336. package/_standalone/.next/static/chunks/app/api/init/route-e240db6d5049d336.js +0 -1
  337. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e240db6d5049d336.js +0 -1
  338. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e240db6d5049d336.js +0 -1
  339. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e240db6d5049d336.js +0 -1
  340. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e240db6d5049d336.js +0 -1
  341. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e240db6d5049d336.js +0 -1
  342. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e240db6d5049d336.js +0 -1
  343. package/_standalone/.next/static/chunks/app/api/monitoring/route-e240db6d5049d336.js +0 -1
  344. package/_standalone/.next/static/chunks/app/api/recent-files/route-e240db6d5049d336.js +0 -1
  345. package/_standalone/.next/static/chunks/app/api/restart/route-e240db6d5049d336.js +0 -1
  346. package/_standalone/.next/static/chunks/app/api/search/route-e240db6d5049d336.js +0 -1
  347. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e240db6d5049d336.js +0 -1
  348. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e240db6d5049d336.js +0 -1
  349. package/_standalone/.next/static/chunks/app/api/settings/route-e240db6d5049d336.js +0 -1
  350. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e240db6d5049d336.js +0 -1
  351. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e240db6d5049d336.js +0 -1
  352. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e240db6d5049d336.js +0 -1
  353. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e240db6d5049d336.js +0 -1
  354. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e240db6d5049d336.js +0 -1
  355. package/_standalone/.next/static/chunks/app/api/setup/route-e240db6d5049d336.js +0 -1
  356. package/_standalone/.next/static/chunks/app/api/skills/route-e240db6d5049d336.js +0 -1
  357. package/_standalone/.next/static/chunks/app/api/sync/route-e240db6d5049d336.js +0 -1
  358. package/_standalone/.next/static/chunks/app/api/tree-version/route-e240db6d5049d336.js +0 -1
  359. package/_standalone/.next/static/chunks/app/api/uninstall/route-e240db6d5049d336.js +0 -1
  360. package/_standalone/.next/static/chunks/app/api/update/route-e240db6d5049d336.js +0 -1
  361. package/_standalone/.next/static/chunks/app/api/update-check/route-e240db6d5049d336.js +0 -1
  362. package/_standalone/.next/static/chunks/app/api/update-status/route-e240db6d5049d336.js +0 -1
  363. package/_standalone/.next/static/chunks/app/api/workflows/route-e240db6d5049d336.js +0 -1
  364. package/_standalone/.next/static/chunks/app/echo/page-e240db6d5049d336.js +0 -1
  365. package/_standalone/.next/static/chunks/app/loading-e240db6d5049d336.js +0 -1
  366. package/_standalone/.next/static/chunks/app/trash/page-c7f14311f040009e.js +0 -1
  367. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e240db6d5049d336.js +0 -1
  368. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e240db6d5049d336.js +0 -1
  369. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e240db6d5049d336.js +0 -1
  370. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e240db6d5049d336.js +0 -1
  371. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e240db6d5049d336.js +0 -1
  372. package/_standalone/.next/static/chunks/webpack-521ae5a2ddf0e396.js +0 -1
  373. package/_standalone/.next/static/css/66f8a81e4eda06d4.css +0 -1
  374. /package/_standalone/.next/static/{3gMJ8EaZfDgHmB0NR0Q4T → zOaEtgJbdRMncnCBucULp}/_ssgManifest.js +0 -0
@@ -3,7 +3,7 @@
3
3
  import Link from 'next/link';
4
4
  import { useCallback, useEffect, useMemo, useState } from 'react';
5
5
  import {
6
- ArrowLeft, Activity, Globe, Key, Loader2, Server, Search,
6
+ ArrowLeft, Activity, Globe, Key, Loader2, MoreHorizontal, Pencil, Server, Search,
7
7
  Shield, ShieldCheck, Trash2, Wifi, WifiOff, Zap,
8
8
  FileEdit, FilePlus, Clock, Terminal, CheckCircle2, AlertCircle, ChevronDown, BookOpen,
9
9
  } from 'lucide-react';
@@ -25,6 +25,7 @@ import {
25
25
  } from './agents-content-model';
26
26
  import { AgentAvatar, ActionButton, ConfirmDialog, PillButton } from './AgentsPrimitives';
27
27
  import SkillDetailPopover from './SkillDetailPopover';
28
+ import CustomAgentModal from './CustomAgentModal';
28
29
 
29
30
  export default function AgentDetailContent({ agentKey }: { agentKey: string }) {
30
31
  const { t } = useLocale();
@@ -49,6 +50,33 @@ export default function AgentDetailContent({ agentKey }: { agentKey: string }) {
49
50
  const [mcpHint, setMcpHint] = useState<string | null>(null);
50
51
  const [detailSkillName, setDetailSkillName] = useState<string | null>(null);
51
52
 
53
+ // Custom agent actions
54
+ const [customEditOpen, setCustomEditOpen] = useState(false);
55
+ const [confirmCustomRemove, setConfirmCustomRemove] = useState(false);
56
+
57
+ const handleCustomRemoveConfirmed = useCallback(async () => {
58
+ if (!agent?.isCustom) return;
59
+ try {
60
+ const res = await fetch('/api/agents/custom', {
61
+ method: 'DELETE',
62
+ headers: { 'Content-Type': 'application/json' },
63
+ body: JSON.stringify({ key: agent.key }),
64
+ });
65
+ if (res.ok) {
66
+ toast.success(a.overview.customAgentRemoved(agent.name));
67
+ mcp.refresh();
68
+ window.location.href = '/agents';
69
+ } else {
70
+ const data = await res.json();
71
+ toast.error(data.error || a.overview.customAgentFailedRemove);
72
+ }
73
+ } catch {
74
+ toast.error(a.overview.customAgentNetworkError);
75
+ } finally {
76
+ setConfirmCustomRemove(false);
77
+ }
78
+ }, [agent, a.overview, mcp]);
79
+
52
80
  const filteredSkills = useMemo(
53
81
  () =>
54
82
  filterSkillsForAgentDetail(mcp.skills, {
@@ -263,6 +291,28 @@ export default function AgentDetailContent({ agentKey }: { agentKey: string }) {
263
291
  <span>{agent.skillMode ?? a.na}</span>
264
292
  </div>
265
293
  </div>
294
+ {agent.isCustom && (
295
+ <div className="flex items-center gap-1 shrink-0">
296
+ <button
297
+ type="button"
298
+ onClick={() => setCustomEditOpen(true)}
299
+ className="w-8 h-8 rounded-lg flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted transition-colors duration-150 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
300
+ aria-label={a.overview.customAgentEdit as string}
301
+ title={a.overview.customAgentEdit as string}
302
+ >
303
+ <Pencil size={14} />
304
+ </button>
305
+ <button
306
+ type="button"
307
+ onClick={() => setConfirmCustomRemove(true)}
308
+ className="w-8 h-8 rounded-lg flex items-center justify-center text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition-colors duration-150 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
309
+ aria-label={a.overview.customAgentRemove as string}
310
+ title={a.overview.customAgentRemove as string}
311
+ >
312
+ <Trash2 size={14} />
313
+ </button>
314
+ </div>
315
+ )}
266
316
  </div>
267
317
  <div className="flex flex-wrap items-center gap-x-4 gap-y-1 text-2xs text-muted-foreground/50 px-5 py-2 border-t border-border/40">
268
318
  <span>{agent.format} <span className="text-muted-foreground/30">·</span> {formatRelativeTime(agent.runtimeLastActivityAt)}</span>
@@ -602,6 +652,29 @@ export default function AgentDetailContent({ agentKey }: { agentKey: string }) {
602
652
  onDelete={handleDeleteSkillFromPopover}
603
653
  onRefresh={mcp.refresh}
604
654
  />
655
+
656
+ {/* Custom agent edit modal */}
657
+ {agent?.isCustom && (
658
+ <CustomAgentModal
659
+ open={customEditOpen}
660
+ onClose={() => setCustomEditOpen(false)}
661
+ onSuccess={() => { mcp.refresh(); setCustomEditOpen(false); }}
662
+ existingAgents={mcp.agents}
663
+ editAgent={agent}
664
+ />
665
+ )}
666
+
667
+ {/* Custom agent remove confirmation */}
668
+ <ConfirmDialog
669
+ open={confirmCustomRemove}
670
+ title={agent ? a.overview.customAgentRemoveTitle(agent.name) : ''}
671
+ message={a.overview.customAgentRemoveMessage as string}
672
+ confirmLabel={a.overview.customAgentRemoveConfirm as string}
673
+ cancelLabel={a.detail.skillCancel}
674
+ onConfirm={handleCustomRemoveConfirmed}
675
+ onCancel={() => setConfirmCustomRemove(false)}
676
+ variant="destructive"
677
+ />
605
678
  </div>
606
679
  );
607
680
  }
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { useMemo } from 'react';
3
+ import { useCallback, useMemo, useState } from 'react';
4
4
  import { toast } from '@/lib/toast';
5
5
  import { useLocale } from '@/lib/stores/locale-store';
6
6
  import { useMcpData } from '@/lib/stores/mcp-store';
@@ -18,6 +18,9 @@ import AgentsSkillsSection from './AgentsSkillsSection';
18
18
  import AgentsPanelA2aTab from './AgentsPanelA2aTab';
19
19
  import AgentsPanelSessionsTab from './AgentsPanelSessionsTab';
20
20
  import AgentActivitySection from './AgentActivitySection';
21
+ import CustomAgentModal from './CustomAgentModal';
22
+ import { ConfirmDialog } from './AgentsPrimitives';
23
+ import type { AgentInfo } from '@/components/settings/types';
21
24
 
22
25
  export default function AgentsContentPage({ tab }: { tab: AgentsDashboardTab }) {
23
26
  const { t } = useLocale();
@@ -80,6 +83,54 @@ export default function AgentsContentPage({ tab }: { tab: AgentsDashboardTab })
80
83
  [mcp.skills],
81
84
  );
82
85
 
86
+ /* ─── Custom Agent Modal State ─── */
87
+ const [customModalOpen, setCustomModalOpen] = useState(false);
88
+ const [editingAgent, setEditingAgent] = useState<AgentInfo | null>(null);
89
+ const [removeAgent, setRemoveAgent] = useState<AgentInfo | null>(null);
90
+ const [removing, setRemoving] = useState(false);
91
+
92
+ const handleAddCustomAgent = useCallback(() => {
93
+ setEditingAgent(null);
94
+ setCustomModalOpen(true);
95
+ }, []);
96
+
97
+ const handleEditCustomAgent = useCallback((agent: AgentInfo) => {
98
+ setEditingAgent(agent);
99
+ setCustomModalOpen(true);
100
+ }, []);
101
+
102
+ const handleRemoveCustomAgent = useCallback((agent: AgentInfo) => {
103
+ setRemoveAgent(agent);
104
+ }, []);
105
+
106
+ const handleConfirmRemove = useCallback(async () => {
107
+ if (!removeAgent) return;
108
+ setRemoving(true);
109
+ try {
110
+ const res = await fetch('/api/agents/custom', {
111
+ method: 'DELETE',
112
+ headers: { 'Content-Type': 'application/json' },
113
+ body: JSON.stringify({ key: removeAgent.key }),
114
+ });
115
+ if (res.ok) {
116
+ toast.success(a.overview.customAgentRemoved(removeAgent.name));
117
+ mcp.refresh();
118
+ } else {
119
+ const data = await res.json();
120
+ toast.error(data.error || a.overview.customAgentFailedRemove);
121
+ }
122
+ } catch {
123
+ toast.error(a.overview.customAgentNetworkError);
124
+ } finally {
125
+ setRemoving(false);
126
+ setRemoveAgent(null);
127
+ }
128
+ }, [removeAgent, mcp, a.overview]);
129
+
130
+ const handleCustomAgentSuccess = useCallback(() => {
131
+ mcp.refresh();
132
+ }, [mcp]);
133
+
83
134
  const copySnippet = async (agentKey: string) => {
84
135
  const agent = mcp.agents.find((item) => item.key === agentKey);
85
136
  if (!agent) return;
@@ -111,6 +162,9 @@ export default function AgentsContentPage({ tab }: { tab: AgentsDashboardTab })
111
162
  allAgents={mcp.agents}
112
163
  pulseCopy={a.workspacePulse}
113
164
  a2aCount={a2a.agents.length}
165
+ onAddCustomAgent={handleAddCustomAgent}
166
+ onEditCustomAgent={handleEditCustomAgent}
167
+ onRemoveCustomAgent={handleRemoveCustomAgent}
114
168
  />
115
169
  )}
116
170
 
@@ -147,6 +201,27 @@ export default function AgentsContentPage({ tab }: { tab: AgentsDashboardTab })
147
201
  {tab === 'activity' && (
148
202
  <AgentActivitySection />
149
203
  )}
204
+
205
+ {/* Custom Agent Modal */}
206
+ <CustomAgentModal
207
+ open={customModalOpen}
208
+ onClose={() => { setCustomModalOpen(false); setEditingAgent(null); }}
209
+ onSuccess={handleCustomAgentSuccess}
210
+ existingAgents={mcp.agents}
211
+ editAgent={editingAgent}
212
+ />
213
+
214
+ {/* Remove Confirmation */}
215
+ <ConfirmDialog
216
+ open={!!removeAgent}
217
+ title={removeAgent ? a.overview.customAgentRemoveTitle(removeAgent.name) : ''}
218
+ message={a.overview.customAgentRemoveMessage as string}
219
+ confirmLabel={a.overview.customAgentRemoveConfirm as string}
220
+ cancelLabel={a.overview.customAgentCancel as string}
221
+ onConfirm={handleConfirmRemove}
222
+ onCancel={() => setRemoveAgent(null)}
223
+ variant="destructive"
224
+ />
150
225
  </div>
151
226
  );
152
227
  }
@@ -1,12 +1,14 @@
1
1
  'use client';
2
2
 
3
3
  import Link from 'next/link';
4
- import { useMemo, useState } from 'react';
4
+ import { useEffect, useMemo, useRef, useState } from 'react';
5
5
  import {
6
6
  AlertTriangle,
7
7
  Cable,
8
8
  ChevronDown,
9
9
  Globe,
10
+ MoreHorizontal,
11
+ Plus,
10
12
  Server,
11
13
  Zap,
12
14
  } from 'lucide-react';
@@ -66,6 +68,9 @@ export default function AgentsOverviewSection({
66
68
  allAgents,
67
69
  pulseCopy,
68
70
  a2aCount,
71
+ onAddCustomAgent,
72
+ onEditCustomAgent,
73
+ onRemoveCustomAgent,
69
74
  }: {
70
75
  copy: OverviewCopy;
71
76
  buckets: AgentBuckets;
@@ -78,6 +83,9 @@ export default function AgentsOverviewSection({
78
83
  allAgents: AgentInfo[];
79
84
  pulseCopy: PulseCopy;
80
85
  a2aCount?: number;
86
+ onAddCustomAgent?: () => void;
87
+ onEditCustomAgent?: (agent: AgentInfo) => void;
88
+ onRemoveCustomAgent?: (agent: AgentInfo) => void;
81
89
  }) {
82
90
  const allHealthy = riskQueue.length === 0 && (!mcpEnabled || mcpRunning);
83
91
  const [riskOpen, setRiskOpen] = useState(false);
@@ -85,7 +93,7 @@ export default function AgentsOverviewSection({
85
93
  const sortedAgents = useMemo(
86
94
  () =>
87
95
  [...allAgents]
88
- .filter(a => a.present) // hide not-found agents from overview
96
+ .filter(a => a.present || a.isCustom) // custom agents always visible
89
97
  .sort((a, b) => {
90
98
  const rank = (x: AgentInfo) => (x.installed ? 0 : 1);
91
99
  return rank(a) - rank(b) || a.name.localeCompare(b.name);
@@ -216,8 +224,36 @@ export default function AgentsOverviewSection({
216
224
  </div>
217
225
  <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3">
218
226
  {sortedAgents.map((agent, i) => (
219
- <AgentCard key={agent.key} agent={agent} copy={copy} index={i} mcpEnabled={mcpEnabled} />
227
+ <AgentCard
228
+ key={agent.key}
229
+ agent={agent}
230
+ copy={copy}
231
+ index={i}
232
+ mcpEnabled={mcpEnabled}
233
+ onEdit={agent.isCustom ? onEditCustomAgent : undefined}
234
+ onRemove={agent.isCustom ? onRemoveCustomAgent : undefined}
235
+ />
220
236
  ))}
237
+ {onAddCustomAgent && (
238
+ <button
239
+ type="button"
240
+ onClick={onAddCustomAgent}
241
+ className="group rounded-xl border-2 border-dashed border-border/60 bg-transparent p-3.5
242
+ hover:border-[var(--amber)]/30 hover:bg-muted/20
243
+ active:scale-[0.98]
244
+ transition-all duration-150
245
+ flex flex-col items-center justify-center gap-2 min-h-[100px]
246
+ cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
247
+ aria-label={copy.addCustomAgent as string}
248
+ >
249
+ <div className="w-8 h-8 rounded-full border-2 border-dashed border-muted-foreground/30 flex items-center justify-center group-hover:border-[var(--amber)]/50 transition-colors duration-150">
250
+ <Plus size={16} className="text-muted-foreground/50 group-hover:text-[var(--amber)] transition-colors duration-150" />
251
+ </div>
252
+ <span className="text-xs text-muted-foreground/60 group-hover:text-muted-foreground transition-colors duration-150">
253
+ {copy.addCustomAgent as string}
254
+ </span>
255
+ </button>
256
+ )}
221
257
  </div>
222
258
  </section>
223
259
  ) : (
@@ -298,16 +334,23 @@ function AgentCard({
298
334
  copy,
299
335
  index,
300
336
  mcpEnabled = true,
337
+ onEdit,
338
+ onRemove,
301
339
  }: {
302
340
  agent: AgentInfo;
303
341
  copy: OverviewCopy;
304
342
  index: number;
305
343
  mcpEnabled?: boolean;
344
+ onEdit?: (agent: AgentInfo) => void;
345
+ onRemove?: (agent: AgentInfo) => void;
306
346
  }) {
347
+ const [menuOpen, setMenuOpen] = useState(false);
348
+ const menuRef = useRef<HTMLDivElement>(null);
307
349
  const status = resolveAgentStatus(agent);
308
350
  const mcpCount = agent.configuredMcpServerCount ?? agent.configuredMcpServers?.length ?? 0;
309
351
  const skillCount = agent.installedSkillCount ?? agent.installedSkillNames?.length ?? 0;
310
352
  const hasRuntime = agent.runtimeConversationSignal || agent.runtimeUsageSignal;
353
+ const isCustom = agent.isCustom;
311
354
 
312
355
  const statusLabel =
313
356
  status === 'connected' ? copy.connected : status === 'detected' ? copy.detected : copy.notFound;
@@ -318,15 +361,64 @@ function AgentCard({
318
361
  ? 'bg-[var(--amber-dim)] text-[var(--amber-text)]'
319
362
  : 'bg-error/10 text-error';
320
363
 
364
+ // Close menu on outside click
365
+ useEffect(() => {
366
+ if (!menuOpen) return;
367
+ const handler = (e: MouseEvent) => {
368
+ if (menuRef.current && !menuRef.current.contains(e.target as Node)) setMenuOpen(false);
369
+ };
370
+ document.addEventListener('mousedown', handler);
371
+ return () => document.removeEventListener('mousedown', handler);
372
+ }, [menuOpen]);
373
+
321
374
  return (
322
375
  <Link
323
376
  href={`/agents/${encodeURIComponent(agent.key)}`}
324
- className={`group rounded-xl border border-border bg-card p-3.5
325
- hover:border-[var(--amber)]/30 hover:shadow-[0_2px_8px_rgba(0,0,0,0.04)]
326
- active:scale-[0.98]
327
- transition-all duration-150
328
- focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`}
377
+ className={cn(
378
+ 'group relative rounded-xl border border-border bg-card p-3.5',
379
+ 'hover:border-[var(--amber)]/30 hover:shadow-[0_2px_8px_rgba(0,0,0,0.04)]',
380
+ 'active:scale-[0.98]',
381
+ 'transition-all duration-150',
382
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
383
+ isCustom && 'border-l-2 border-l-[var(--amber)]/40',
384
+ )}
329
385
  >
386
+ {/* Custom agent "..." menu */}
387
+ {isCustom && (onEdit || onRemove) && (
388
+ <div ref={menuRef} className="absolute top-2.5 right-2.5 z-10">
389
+ <button
390
+ type="button"
391
+ onClick={(e) => { e.preventDefault(); e.stopPropagation(); setMenuOpen(!menuOpen); }}
392
+ className="w-6 h-6 rounded-md flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted opacity-0 group-hover:opacity-100 transition-all duration-150 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:opacity-100"
393
+ aria-label="Agent options"
394
+ >
395
+ <MoreHorizontal size={14} />
396
+ </button>
397
+ {menuOpen && (
398
+ <div className="absolute right-0 top-full mt-1 w-32 bg-card border border-border rounded-lg shadow-lg py-1 animate-in fade-in-0 zoom-in-95 duration-100">
399
+ {onEdit && (
400
+ <button
401
+ type="button"
402
+ onClick={(e) => { e.preventDefault(); e.stopPropagation(); setMenuOpen(false); onEdit(agent); }}
403
+ className="w-full text-left px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors duration-100 cursor-pointer"
404
+ >
405
+ {copy.customAgentEdit as string}
406
+ </button>
407
+ )}
408
+ {onRemove && (
409
+ <button
410
+ type="button"
411
+ onClick={(e) => { e.preventDefault(); e.stopPropagation(); setMenuOpen(false); onRemove(agent); }}
412
+ className="w-full text-left px-3 py-1.5 text-sm text-destructive hover:bg-muted transition-colors duration-100 cursor-pointer"
413
+ >
414
+ {copy.customAgentRemove as string}
415
+ </button>
416
+ )}
417
+ </div>
418
+ )}
419
+ </div>
420
+ )}
421
+
330
422
  {/* Top row: avatar + name + status */}
331
423
  <div className="flex items-center gap-2.5 mb-3">
332
424
  <AgentAvatar name={agent.name} status={status} size="sm" />