@geminilight/mindos 0.6.55 → 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 (377) 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 +24 -22
  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 +7 -7
  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 +24 -22
  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 +31 -31
  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/362.3978790a2e636c3c.js +2 -0
  169. package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +1 -0
  170. package/_standalone/.next/static/chunks/54a60aa6.7a74f547ec1bdd5a.js +79 -0
  171. package/_standalone/.next/static/chunks/6087.4b6102dc0bcd07a7.js +1 -0
  172. package/_standalone/.next/static/chunks/6878-e2c5459e1c608f89.js +1 -0
  173. package/_standalone/.next/static/chunks/7249-8cd568ad23656622.js +11 -0
  174. package/_standalone/.next/static/chunks/8252-e5ae7ced3a41e0ed.js +1 -0
  175. package/_standalone/.next/static/chunks/{8753-ea9db680b0f70f25.js → 8658-16ff58b75ae37fbb.js} +1 -1
  176. package/_standalone/.next/static/chunks/{7322-d67d05067544864c.js → 9274-296ab35f9f09e42e.js} +1 -1
  177. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-2f4705aa66819b86.js +1 -0
  178. package/_standalone/.next/static/chunks/app/_global-error/page-2f4705aa66819b86.js +1 -0
  179. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-7bdeab5af8e4f5f2.js +1 -0
  180. package/_standalone/.next/static/chunks/app/agents/page-5d1446665ddb3801.js +1 -0
  181. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-2f4705aa66819b86.js +1 -0
  182. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-2f4705aa66819b86.js +1 -0
  183. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2f4705aa66819b86.js +1 -0
  184. package/_standalone/.next/static/chunks/app/api/a2a/route-2f4705aa66819b86.js +1 -0
  185. package/_standalone/.next/static/chunks/app/api/acp/config/route-2f4705aa66819b86.js +1 -0
  186. package/_standalone/.next/static/chunks/app/api/acp/detect/route-2f4705aa66819b86.js +1 -0
  187. package/_standalone/.next/static/chunks/app/api/acp/install/route-2f4705aa66819b86.js +1 -0
  188. package/_standalone/.next/static/chunks/app/api/acp/registry/route-2f4705aa66819b86.js +1 -0
  189. package/_standalone/.next/static/chunks/app/api/acp/session/route-2f4705aa66819b86.js +1 -0
  190. package/_standalone/.next/static/chunks/app/api/agent-activity/route-2f4705aa66819b86.js +1 -0
  191. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2f4705aa66819b86.js +1 -0
  192. package/_standalone/.next/static/chunks/app/api/agents/custom/route-2f4705aa66819b86.js +1 -0
  193. package/_standalone/.next/static/chunks/app/api/ask/route-2f4705aa66819b86.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2f4705aa66819b86.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/auth/route-2f4705aa66819b86.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/backlinks/route-2f4705aa66819b86.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/bootstrap/route-2f4705aa66819b86.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/changes/route-2f4705aa66819b86.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/export/route-2f4705aa66819b86.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2f4705aa66819b86.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/file/import/route-2f4705aa66819b86.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/file/raw/route-2f4705aa66819b86.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/file/route-2f4705aa66819b86.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/files/route-2f4705aa66819b86.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/git/route-2f4705aa66819b86.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/graph/route-2f4705aa66819b86.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/health/route-2f4705aa66819b86.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/inbox/route-2f4705aa66819b86.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/init/route-2f4705aa66819b86.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2f4705aa66819b86.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/mcp/install/route-2f4705aa66819b86.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2f4705aa66819b86.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2f4705aa66819b86.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/mcp/status/route-2f4705aa66819b86.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2f4705aa66819b86.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/monitoring/route-2f4705aa66819b86.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/recent-files/route-2f4705aa66819b86.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/restart/route-2f4705aa66819b86.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/search/route-2f4705aa66819b86.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2f4705aa66819b86.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2f4705aa66819b86.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/settings/route-2f4705aa66819b86.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2f4705aa66819b86.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2f4705aa66819b86.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2f4705aa66819b86.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2f4705aa66819b86.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/setup/ls/route-2f4705aa66819b86.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/setup/route-2f4705aa66819b86.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/skills/route-2f4705aa66819b86.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/sync/route-2f4705aa66819b86.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/tree-version/route-2f4705aa66819b86.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/uninstall/route-2f4705aa66819b86.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/update/route-2f4705aa66819b86.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/update-check/route-2f4705aa66819b86.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/update-status/route-2f4705aa66819b86.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/workflows/route-2f4705aa66819b86.js +1 -0
  237. package/_standalone/.next/static/chunks/app/echo/[segment]/{page-6710da1f581b2854.js → page-b0103509ce34444b.js} +4 -4
  238. package/_standalone/.next/static/chunks/app/echo/page-2f4705aa66819b86.js +1 -0
  239. package/_standalone/.next/static/chunks/app/{layout-45e66033ba1bdb05.js → layout-b3919384ec2eb979.js} +45 -45
  240. package/_standalone/.next/static/chunks/app/loading-2f4705aa66819b86.js +1 -0
  241. package/_standalone/.next/static/chunks/app/{page-71bd113f66bd7617.js → page-6436a99cda35132b.js} +2 -2
  242. package/_standalone/.next/static/chunks/app/setup/{page-9a81fa4d82c6351b.js → page-99fcfc460fa29733.js} +1 -1
  243. package/_standalone/.next/static/chunks/app/trash/page-8dc388695344fdd4.js +1 -0
  244. package/_standalone/.next/static/chunks/app/view/[...path]/loading-2f4705aa66819b86.js +1 -0
  245. package/_standalone/.next/static/chunks/app/view/[...path]/page-b292b55305ecc021.js +12 -0
  246. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2f4705aa66819b86.js +1 -0
  247. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2f4705aa66819b86.js +1 -0
  248. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2f4705aa66819b86.js +1 -0
  249. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2f4705aa66819b86.js +1 -0
  250. package/_standalone/.next/static/chunks/webpack-2c19436659aa657b.js +1 -0
  251. package/_standalone/.next/static/css/fd84c8316ead16eb.css +1 -0
  252. package/_standalone/.next/static/zOaEtgJbdRMncnCBucULp/_buildManifest.js +1 -0
  253. package/_standalone/.next/trace +64 -64
  254. package/_standalone/.next/types/routes.d.ts +3 -1
  255. package/_standalone/.next/types/validator.ts +18 -0
  256. package/_standalone/components/Breadcrumb.tsx +10 -6
  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/Breadcrumb.tsx +10 -6
  272. package/app/components/Editor.tsx +124 -6
  273. package/app/components/MarkdownView.tsx +3 -1
  274. package/app/components/WysiwygEditor.tsx +90 -0
  275. package/app/components/agents/AgentDetailContent.tsx +74 -1
  276. package/app/components/agents/AgentsContentPage.tsx +76 -1
  277. package/app/components/agents/AgentsOverviewSection.tsx +100 -8
  278. package/app/components/agents/CustomAgentModal.tsx +613 -0
  279. package/app/components/settings/types.ts +4 -0
  280. package/app/hooks/useEditorImageUpload.ts +113 -0
  281. package/app/lib/agent/model.ts +7 -1
  282. package/app/lib/agent/providers.ts +31 -6
  283. package/app/lib/core/organize.ts +1 -1
  284. package/app/lib/core/tree.ts +1 -1
  285. package/app/lib/custom-agents.ts +279 -0
  286. package/app/lib/fs.ts +1 -1
  287. package/app/lib/i18n/modules/panels.ts +96 -0
  288. package/app/lib/image.ts +47 -0
  289. package/app/lib/settings.ts +4 -0
  290. package/bin/commands/start.js +5 -4
  291. package/bin/commands/update.js +6 -2
  292. package/bin/lib/clean-env.js +1 -1
  293. package/bin/lib/gateway.js +6 -2
  294. package/mcp/dist/index.cjs +1 -1
  295. package/mcp/src/index.ts +6 -1
  296. package/package.json +1 -1
  297. package/_standalone/.next/server/chunks/1981.js +0 -52
  298. package/_standalone/.next/static/QXZErVsiRQxfqUnWMUsH6/_buildManifest.js +0 -1
  299. package/_standalone/.next/static/chunks/1053-2874859f7caefa0f.js +0 -29
  300. package/_standalone/.next/static/chunks/1880-7abf971bcfd2389b.js +0 -11
  301. package/_standalone/.next/static/chunks/254-32719a9bea2e74f0.js +0 -1
  302. package/_standalone/.next/static/chunks/362.a77be2f206db7b19.js +0 -1
  303. package/_standalone/.next/static/chunks/3637.0541ac2d0ea7de1f.js +0 -1
  304. package/_standalone/.next/static/chunks/54a60aa6.b97ba5e6900c089b.js +0 -79
  305. package/_standalone/.next/static/chunks/6087.0c32d26d0262c8e7.js +0 -1
  306. package/_standalone/.next/static/chunks/7035-2af69391c7b1ad95.js +0 -1
  307. package/_standalone/.next/static/chunks/8131.5e0bdb36bb91f212.js +0 -1
  308. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-e240db6d5049d336.js +0 -1
  309. package/_standalone/.next/static/chunks/app/_global-error/page-e240db6d5049d336.js +0 -1
  310. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-f006a70f6889eb56.js +0 -1
  311. package/_standalone/.next/static/chunks/app/agents/page-bd522e428e3acb78.js +0 -5
  312. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-e240db6d5049d336.js +0 -1
  313. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-e240db6d5049d336.js +0 -1
  314. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e240db6d5049d336.js +0 -1
  315. package/_standalone/.next/static/chunks/app/api/a2a/route-e240db6d5049d336.js +0 -1
  316. package/_standalone/.next/static/chunks/app/api/acp/config/route-e240db6d5049d336.js +0 -1
  317. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e240db6d5049d336.js +0 -1
  318. package/_standalone/.next/static/chunks/app/api/acp/install/route-e240db6d5049d336.js +0 -1
  319. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e240db6d5049d336.js +0 -1
  320. package/_standalone/.next/static/chunks/app/api/acp/session/route-e240db6d5049d336.js +0 -1
  321. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e240db6d5049d336.js +0 -1
  322. package/_standalone/.next/static/chunks/app/api/ask/route-e240db6d5049d336.js +0 -1
  323. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e240db6d5049d336.js +0 -1
  324. package/_standalone/.next/static/chunks/app/api/auth/route-e240db6d5049d336.js +0 -1
  325. package/_standalone/.next/static/chunks/app/api/backlinks/route-e240db6d5049d336.js +0 -1
  326. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e240db6d5049d336.js +0 -1
  327. package/_standalone/.next/static/chunks/app/api/changes/route-e240db6d5049d336.js +0 -1
  328. package/_standalone/.next/static/chunks/app/api/export/route-e240db6d5049d336.js +0 -1
  329. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e240db6d5049d336.js +0 -1
  330. package/_standalone/.next/static/chunks/app/api/file/import/route-e240db6d5049d336.js +0 -1
  331. package/_standalone/.next/static/chunks/app/api/file/raw/route-e240db6d5049d336.js +0 -1
  332. package/_standalone/.next/static/chunks/app/api/file/route-e240db6d5049d336.js +0 -1
  333. package/_standalone/.next/static/chunks/app/api/files/route-e240db6d5049d336.js +0 -1
  334. package/_standalone/.next/static/chunks/app/api/git/route-e240db6d5049d336.js +0 -1
  335. package/_standalone/.next/static/chunks/app/api/graph/route-e240db6d5049d336.js +0 -1
  336. package/_standalone/.next/static/chunks/app/api/health/route-e240db6d5049d336.js +0 -1
  337. package/_standalone/.next/static/chunks/app/api/inbox/route-e240db6d5049d336.js +0 -1
  338. package/_standalone/.next/static/chunks/app/api/init/route-e240db6d5049d336.js +0 -1
  339. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e240db6d5049d336.js +0 -1
  340. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e240db6d5049d336.js +0 -1
  341. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e240db6d5049d336.js +0 -1
  342. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e240db6d5049d336.js +0 -1
  343. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e240db6d5049d336.js +0 -1
  344. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e240db6d5049d336.js +0 -1
  345. package/_standalone/.next/static/chunks/app/api/monitoring/route-e240db6d5049d336.js +0 -1
  346. package/_standalone/.next/static/chunks/app/api/recent-files/route-e240db6d5049d336.js +0 -1
  347. package/_standalone/.next/static/chunks/app/api/restart/route-e240db6d5049d336.js +0 -1
  348. package/_standalone/.next/static/chunks/app/api/search/route-e240db6d5049d336.js +0 -1
  349. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e240db6d5049d336.js +0 -1
  350. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e240db6d5049d336.js +0 -1
  351. package/_standalone/.next/static/chunks/app/api/settings/route-e240db6d5049d336.js +0 -1
  352. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e240db6d5049d336.js +0 -1
  353. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e240db6d5049d336.js +0 -1
  354. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e240db6d5049d336.js +0 -1
  355. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e240db6d5049d336.js +0 -1
  356. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e240db6d5049d336.js +0 -1
  357. package/_standalone/.next/static/chunks/app/api/setup/route-e240db6d5049d336.js +0 -1
  358. package/_standalone/.next/static/chunks/app/api/skills/route-e240db6d5049d336.js +0 -1
  359. package/_standalone/.next/static/chunks/app/api/sync/route-e240db6d5049d336.js +0 -1
  360. package/_standalone/.next/static/chunks/app/api/tree-version/route-e240db6d5049d336.js +0 -1
  361. package/_standalone/.next/static/chunks/app/api/uninstall/route-e240db6d5049d336.js +0 -1
  362. package/_standalone/.next/static/chunks/app/api/update/route-e240db6d5049d336.js +0 -1
  363. package/_standalone/.next/static/chunks/app/api/update-check/route-e240db6d5049d336.js +0 -1
  364. package/_standalone/.next/static/chunks/app/api/update-status/route-e240db6d5049d336.js +0 -1
  365. package/_standalone/.next/static/chunks/app/api/workflows/route-e240db6d5049d336.js +0 -1
  366. package/_standalone/.next/static/chunks/app/echo/page-e240db6d5049d336.js +0 -1
  367. package/_standalone/.next/static/chunks/app/loading-e240db6d5049d336.js +0 -1
  368. package/_standalone/.next/static/chunks/app/trash/page-ba3802cf675d029a.js +0 -1
  369. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e240db6d5049d336.js +0 -1
  370. package/_standalone/.next/static/chunks/app/view/[...path]/page-35da7f9f5a009292.js +0 -12
  371. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e240db6d5049d336.js +0 -1
  372. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e240db6d5049d336.js +0 -1
  373. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e240db6d5049d336.js +0 -1
  374. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e240db6d5049d336.js +0 -1
  375. package/_standalone/.next/static/chunks/webpack-73c9da80c6c1ebfe.js +0 -1
  376. package/_standalone/.next/static/css/66f8a81e4eda06d4.css +0 -1
  377. /package/_standalone/.next/static/{QXZErVsiRQxfqUnWMUsH6 → zOaEtgJbdRMncnCBucULp}/_ssgManifest.js +0 -0
@@ -7,11 +7,27 @@ import Placeholder from '@tiptap/extension-placeholder';
7
7
  import TaskList from '@tiptap/extension-task-list';
8
8
  import TaskItem from '@tiptap/extension-task-item';
9
9
  import Link from '@tiptap/extension-link';
10
+ import Image from '@tiptap/extension-image';
10
11
  import { Table } from '@tiptap/extension-table';
11
12
  import { TableRow } from '@tiptap/extension-table';
12
13
  import { TableCell } from '@tiptap/extension-table';
13
14
  import { TableHeader } from '@tiptap/extension-table';
14
15
  import { Markdown } from 'tiptap-markdown';
16
+ import { useEditorImageUpload } from '@/hooks/useEditorImageUpload';
17
+ import { resolveImagePath } from '@/lib/image';
18
+ import { toast } from '@/lib/toast';
19
+
20
+ /**
21
+ * Custom Image extension that resolves `/.media/` paths to API URLs in the DOM,
22
+ * while keeping the raw path in the markdown serialization.
23
+ */
24
+ const ResolvedImage = Image.extend({
25
+ renderHTML({ HTMLAttributes }) {
26
+ const src = HTMLAttributes.src;
27
+ const resolvedSrc = typeof src === 'string' ? resolveImagePath(src) : src;
28
+ return ['img', { ...HTMLAttributes, src: resolvedSrc }];
29
+ },
30
+ });
15
31
 
16
32
  interface WysiwygEditorProps {
17
33
  value: string;
@@ -22,6 +38,10 @@ export default function WysiwygEditor({ value, onChange }: WysiwygEditorProps) {
22
38
  const onChangeRef = useRef(onChange);
23
39
  onChangeRef.current = onChange;
24
40
 
41
+ const { uploadToMedia, isUploading } = useEditorImageUpload();
42
+ const uploadRef = useRef(uploadToMedia);
43
+ uploadRef.current = uploadToMedia;
44
+
25
45
  const editor = useEditor({
26
46
  extensions: [
27
47
  StarterKit.configure({
@@ -36,6 +56,9 @@ export default function WysiwygEditor({ value, onChange }: WysiwygEditorProps) {
36
56
  TaskList,
37
57
  TaskItem.configure({ nested: true }),
38
58
  Link.configure({ openOnClick: false, autolink: true }),
59
+ ResolvedImage.configure({
60
+ HTMLAttributes: { class: 'rounded-md max-w-full' },
61
+ }),
39
62
  Table.configure({ resizable: false }),
40
63
  TableRow,
41
64
  TableHeader,
@@ -55,6 +78,65 @@ export default function WysiwygEditor({ value, onChange }: WysiwygEditorProps) {
55
78
  immediatelyRender: false,
56
79
  });
57
80
 
81
+ // Set up drag/drop and paste handlers on editor mount
82
+ useEffect(() => {
83
+ if (!editor) return;
84
+
85
+ const editorDom = editor.view.dom;
86
+
87
+ const handleImageInsert = async (files: File[]) => {
88
+ if (!editor) return;
89
+ try {
90
+ const uploadedPaths = await uploadRef.current(files);
91
+ for (const p of uploadedPaths) {
92
+ editor.chain().focus().setImage({ src: p }).run();
93
+ }
94
+ toast.success('Images inserted');
95
+ } catch (err) {
96
+ toast.error('Failed to insert images');
97
+ console.error(err);
98
+ }
99
+ };
100
+
101
+ const handleDrop = (e: DragEvent) => {
102
+ const files = Array.from(e.dataTransfer?.files ?? []).filter((f) =>
103
+ f.type.startsWith('image/'),
104
+ );
105
+ if (files.length > 0) {
106
+ e.preventDefault();
107
+ e.stopPropagation();
108
+ handleImageInsert(files);
109
+ }
110
+ };
111
+
112
+ const handlePaste = (e: ClipboardEvent) => {
113
+ const items = e.clipboardData?.items;
114
+ if (!items) return;
115
+
116
+ const files: File[] = [];
117
+ for (let i = 0; i < items.length; i++) {
118
+ const item = items[i];
119
+ if (item.kind === 'file' && item.type.startsWith('image/')) {
120
+ const file = item.getAsFile();
121
+ if (file) files.push(file);
122
+ }
123
+ }
124
+
125
+ if (files.length > 0) {
126
+ e.preventDefault();
127
+ handleImageInsert(files);
128
+ }
129
+ };
130
+
131
+ editorDom.addEventListener('drop', handleDrop as EventListener);
132
+ editorDom.addEventListener('paste', handlePaste as EventListener);
133
+
134
+ return () => {
135
+ editorDom.removeEventListener('drop', handleDrop as EventListener);
136
+ editorDom.removeEventListener('paste', handlePaste as EventListener);
137
+ };
138
+ }, [editor]);
139
+
58
140
  // Sync external value changes (e.g. cancel → revert) without full re-mount
59
141
  const lastMd = useRef(value);
60
142
  useEffect(() => {
@@ -69,6 +151,14 @@ export default function WysiwygEditor({ value, onChange }: WysiwygEditorProps) {
69
151
 
70
152
  return (
71
153
  <div className="wysiwyg-wrapper h-full overflow-y-auto px-8 py-6">
154
+ {isUploading && (
155
+ <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
156
+ <div className="bg-card border border-border rounded-lg px-6 py-4 text-center shadow-lg">
157
+ <div className="animate-spin inline-block w-5 h-5 border-2 border-primary border-t-transparent rounded-full" />
158
+ <p className="mt-2 text-sm text-muted-foreground">Uploading images...</p>
159
+ </div>
160
+ </div>
161
+ )}
72
162
  <EditorContent editor={editor} />
73
163
  </div>
74
164
  );
@@ -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" />