@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
@@ -0,0 +1,613 @@
1
+ 'use client';
2
+
3
+ import { useState, useEffect, useRef, useCallback, useMemo } from 'react';
4
+ import { X, Loader2, ChevronRight, ChevronDown, CheckCircle2, Info, AlertCircle } from 'lucide-react';
5
+ import { useLocale } from '@/lib/stores/locale-store';
6
+ import { useFocusTrap } from '@/lib/hooks/useFocusTrap';
7
+ import { toast } from '@/lib/toast';
8
+ import { Field, Input } from '@/components/settings/Primitives';
9
+ import type { AgentInfo } from '@/components/settings/types';
10
+
11
+ /* ─── Types ─── */
12
+
13
+ interface DetectResult {
14
+ exists: boolean;
15
+ detectedConfig?: string;
16
+ detectedFormat?: 'json' | 'toml';
17
+ detectedConfigKey?: string;
18
+ hasSkillsDir: boolean;
19
+ suggestedName?: string;
20
+ }
21
+
22
+ interface FormState {
23
+ name: string;
24
+ baseDir: string;
25
+ global: string;
26
+ configKey: string;
27
+ format: 'json' | 'toml';
28
+ preferredTransport: 'stdio' | 'http';
29
+ project: string;
30
+ presenceCli: string;
31
+ }
32
+
33
+ interface CustomAgentModalProps {
34
+ open: boolean;
35
+ onClose: () => void;
36
+ onSuccess: () => void;
37
+ existingAgents: AgentInfo[];
38
+ /** If provided, modal is in "edit" mode. */
39
+ editAgent?: AgentInfo | null;
40
+ }
41
+
42
+ /* ─── Slugify (client-side mirror) ─── */
43
+
44
+ function slugify(name: string): string {
45
+ return name
46
+ .toLowerCase()
47
+ .replace(/[^\x20-\x7E]/g, '')
48
+ .replace(/[_\s]+/g, '-')
49
+ .replace(/[^a-z0-9-]/g, '')
50
+ .replace(/-{2,}/g, '-')
51
+ .replace(/^-|-$/g, '');
52
+ }
53
+
54
+ /* ─── Component ─── */
55
+
56
+ export default function CustomAgentModal({
57
+ open,
58
+ onClose,
59
+ onSuccess,
60
+ existingAgents,
61
+ editAgent,
62
+ }: CustomAgentModalProps) {
63
+ const { t } = useLocale();
64
+ const p = t.agentsContent.overview;
65
+ const dialogRef = useRef<HTMLDivElement>(null);
66
+ const nameRef = useRef<HTMLInputElement>(null);
67
+
68
+ const isEdit = !!editAgent;
69
+
70
+ // Phase: 'input' (Phase A) or 'result' (Phase B)
71
+ const [phase, setPhase] = useState<'input' | 'result'>('input');
72
+ const [detecting, setDetecting] = useState(false);
73
+ const [saving, setSaving] = useState(false);
74
+ const [error, setError] = useState<string | null>(null);
75
+ const [detectResult, setDetectResult] = useState<DetectResult | null>(null);
76
+ const [detectTimedOut, setDetectTimedOut] = useState(false);
77
+ const [customizeOpen, setCustomizeOpen] = useState(false);
78
+
79
+ const [form, setForm] = useState<FormState>({
80
+ name: '',
81
+ baseDir: '',
82
+ global: '',
83
+ configKey: 'mcpServers',
84
+ format: 'json',
85
+ preferredTransport: 'stdio',
86
+ project: '',
87
+ presenceCli: '',
88
+ });
89
+
90
+ // Reset state when modal opens/closes or editAgent changes
91
+ useEffect(() => {
92
+ if (!open) return;
93
+ if (editAgent) {
94
+ setForm({
95
+ name: editAgent.name,
96
+ baseDir: editAgent.customBaseDir || '',
97
+ global: editAgent.globalPath || '',
98
+ configKey: editAgent.configKey || 'mcpServers',
99
+ format: editAgent.format || 'json',
100
+ preferredTransport: editAgent.preferredTransport || 'stdio',
101
+ project: editAgent.projectPath || '',
102
+ presenceCli: '',
103
+ });
104
+ setPhase('result');
105
+ setCustomizeOpen(true);
106
+ setDetectResult(null);
107
+ setError(null);
108
+ } else {
109
+ setForm({
110
+ name: '',
111
+ baseDir: '',
112
+ global: '',
113
+ configKey: 'mcpServers',
114
+ format: 'json',
115
+ preferredTransport: 'stdio',
116
+ project: '',
117
+ presenceCli: '',
118
+ });
119
+ setPhase('input');
120
+ setCustomizeOpen(false);
121
+ setDetectResult(null);
122
+ setError(null);
123
+ setDetectTimedOut(false);
124
+ }
125
+ }, [open, editAgent]);
126
+
127
+ // Focus name input on open
128
+ useEffect(() => {
129
+ if (open && phase === 'input') {
130
+ setTimeout(() => nameRef.current?.focus(), 100);
131
+ }
132
+ }, [open, phase]);
133
+
134
+ useFocusTrap(dialogRef, open);
135
+
136
+ // Escape to close
137
+ useEffect(() => {
138
+ if (!open) return;
139
+ const onKey = (e: KeyboardEvent) => {
140
+ if (e.key === 'Escape') onClose();
141
+ };
142
+ document.addEventListener('keydown', onKey);
143
+ return () => document.removeEventListener('keydown', onKey);
144
+ }, [open, onClose]);
145
+
146
+ const existingKeys = useMemo(() => {
147
+ const keys = new Set(existingAgents.map(a => a.key));
148
+ if (isEdit && editAgent) keys.delete(editAgent.key);
149
+ return keys;
150
+ }, [existingAgents, isEdit, editAgent]);
151
+
152
+ const slug = useMemo(() => slugify(form.name), [form.name]);
153
+
154
+ const nameError = useMemo(() => {
155
+ if (isEdit) return null; // key is immutable on edit; name can change freely
156
+ if (!form.name.trim()) return null;
157
+ const key = slug || '';
158
+ if (!key) return null;
159
+ if (existingKeys.has(key)) {
160
+ const conflict = existingAgents.find(a => a.key === key);
161
+ if (conflict?.isCustom) return p.customAgentKeyConflict?.(key) ?? `An agent with key "${key}" already exists`;
162
+ return p.customAgentBuiltinConflict?.(conflict?.name || key) ?? `Conflicts with built-in agent "${conflict?.name || key}"`;
163
+ }
164
+ return null;
165
+ }, [isEdit, slug, existingKeys, existingAgents, form.name, p]);
166
+
167
+ const canContinue = form.name.trim() && form.baseDir.trim() && !nameError;
168
+
169
+ const setField = useCallback(<K extends keyof FormState>(key: K, value: FormState[K]) => {
170
+ setForm(prev => ({ ...prev, [key]: value }));
171
+ }, []);
172
+
173
+ /* ─── Detect ─── */
174
+
175
+ const handleContinue = useCallback(async () => {
176
+ if (!canContinue) return;
177
+ setError(null);
178
+ setDetecting(true);
179
+
180
+ const dir = form.baseDir.trim();
181
+
182
+ // Detect API only scans ~/ paths for security; for other absolute paths,
183
+ // skip detection and go straight to Phase B with sensible defaults.
184
+ if (!dir.startsWith('~/')) {
185
+ setField('global', (dir.endsWith('/') ? dir : dir + '/') + 'mcp.json');
186
+ setDetectResult({ exists: false, hasSkillsDir: false });
187
+ setPhase('result');
188
+ setDetecting(false);
189
+ return;
190
+ }
191
+
192
+ const controller = new AbortController();
193
+ const timeout = setTimeout(() => controller.abort(), 3000);
194
+
195
+ try {
196
+ const res = await fetch('/api/agents/custom/detect', {
197
+ method: 'POST',
198
+ headers: { 'Content-Type': 'application/json' },
199
+ body: JSON.stringify({ baseDir: dir }),
200
+ signal: controller.signal,
201
+ });
202
+
203
+ clearTimeout(timeout);
204
+ const data: DetectResult = await res.json();
205
+
206
+ if (!res.ok) {
207
+ setError((data as unknown as { error: string }).error || p.customAgentFailedSave);
208
+ return;
209
+ }
210
+
211
+ setDetectResult(data);
212
+
213
+ if (data.detectedConfig) setField('global', data.detectedConfig);
214
+ else {
215
+ setField('global', (dir.endsWith('/') ? dir : dir + '/') + 'mcp.json');
216
+ }
217
+ if (data.detectedFormat) setField('format', data.detectedFormat);
218
+ if (data.detectedConfigKey) setField('configKey', data.detectedConfigKey);
219
+
220
+ setPhase('result');
221
+ } catch {
222
+ clearTimeout(timeout);
223
+ setField('global', (dir.endsWith('/') ? dir : dir + '/') + 'mcp.json');
224
+ setDetectResult({ exists: false, hasSkillsDir: false });
225
+ setDetectTimedOut(true);
226
+ setPhase('result');
227
+ } finally {
228
+ setDetecting(false);
229
+ }
230
+ }, [canContinue, form.baseDir, setField, p]);
231
+
232
+ /* ─── Save ─── */
233
+
234
+ const handleSave = useCallback(async () => {
235
+ setSaving(true);
236
+ setError(null);
237
+
238
+ const body = isEdit
239
+ ? {
240
+ key: editAgent!.key,
241
+ name: form.name.trim(),
242
+ baseDir: form.baseDir.trim(),
243
+ global: form.global.trim() || undefined,
244
+ configKey: form.configKey.trim() || undefined,
245
+ format: form.format,
246
+ preferredTransport: form.preferredTransport,
247
+ project: form.project.trim() || null,
248
+ presenceCli: form.presenceCli.trim() || undefined,
249
+ }
250
+ : {
251
+ name: form.name.trim(),
252
+ baseDir: form.baseDir.trim(),
253
+ global: form.global.trim() || undefined,
254
+ configKey: form.configKey.trim() || undefined,
255
+ format: form.format,
256
+ preferredTransport: form.preferredTransport,
257
+ project: form.project.trim() || null,
258
+ presenceCli: form.presenceCli.trim() || undefined,
259
+ };
260
+
261
+ try {
262
+ const res = await fetch('/api/agents/custom', {
263
+ method: isEdit ? 'PUT' : 'POST',
264
+ headers: { 'Content-Type': 'application/json' },
265
+ body: JSON.stringify(body),
266
+ });
267
+
268
+ const data = await res.json();
269
+
270
+ if (!res.ok) {
271
+ setError(data.error || p.customAgentFailedSave);
272
+ setSaving(false);
273
+ return;
274
+ }
275
+
276
+ const toastMsg = isEdit
277
+ ? p.customAgentUpdated(form.name.trim())
278
+ : p.customAgentAdded(form.name.trim());
279
+ toast.success(toastMsg);
280
+ onSuccess();
281
+ onClose();
282
+ } catch {
283
+ setError(p.customAgentNetworkError);
284
+ } finally {
285
+ setSaving(false);
286
+ }
287
+ }, [isEdit, editAgent, form, onSuccess, onClose, p]);
288
+
289
+ /* ─── Keyboard: Enter ─── */
290
+
291
+ const handleKeyDown = useCallback((e: React.KeyboardEvent) => {
292
+ if (e.key !== 'Enter') return;
293
+ if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {
294
+ e.preventDefault();
295
+ if (phase === 'input' && canContinue && !detecting) {
296
+ handleContinue();
297
+ } else if (phase === 'result' && !saving) {
298
+ handleSave();
299
+ }
300
+ }
301
+ }, [phase, canContinue, detecting, saving, handleContinue, handleSave]);
302
+
303
+ if (!open) return null;
304
+
305
+ const title = isEdit
306
+ ? p.editCustomAgentTitle(editAgent!.name)
307
+ : p.addCustomAgentTitle;
308
+
309
+ return (
310
+ <div className="fixed inset-0 z-50 flex items-center justify-center" role="dialog" aria-modal="true" aria-labelledby="custom-agent-modal-title">
311
+ {/* Backdrop */}
312
+ <div className="absolute inset-0 modal-backdrop" onClick={onClose} aria-hidden="true" />
313
+
314
+ {/* Dialog */}
315
+ <div
316
+ ref={dialogRef}
317
+ className="relative bg-card border border-border rounded-xl shadow-2xl max-w-md w-full mx-4 animate-in fade-in zoom-in-95 duration-200 max-h-[85vh] overflow-y-auto"
318
+ onKeyDown={handleKeyDown}
319
+ >
320
+ {/* Header */}
321
+ <div className="flex items-center justify-between px-5 pt-5 pb-1">
322
+ <h2 id="custom-agent-modal-title" className="text-base font-semibold text-foreground">{title}</h2>
323
+ <button
324
+ type="button"
325
+ onClick={onClose}
326
+ className="w-7 h-7 rounded-md 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"
327
+ aria-label="Close"
328
+ >
329
+ <X size={16} />
330
+ </button>
331
+ </div>
332
+
333
+ {/* Body */}
334
+ <div className="px-5 py-4 space-y-4">
335
+ {/* Name */}
336
+ <Field label={p.customAgentName}>
337
+ <input
338
+ ref={nameRef}
339
+ value={form.name}
340
+ onChange={(e) => setField('name', e.target.value)}
341
+ placeholder={p.customAgentNamePlaceholder}
342
+ aria-invalid={!!nameError}
343
+ className={`w-full px-3 py-2 text-sm bg-background border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50 ${nameError ? 'border-[var(--error)] focus-visible:ring-[var(--error)]' : 'border-border'}`}
344
+ autoComplete="off"
345
+ />
346
+ {nameError ? (
347
+ <p className="text-xs text-[var(--error)] mt-1 flex items-center gap-1">
348
+ <AlertCircle size={12} />
349
+ {nameError}
350
+ </p>
351
+ ) : form.name.trim() && slug ? (
352
+ <p className="text-[11px] text-muted-foreground mt-0.5">{p.customAgentKeyPreview(slug)}</p>
353
+ ) : null}
354
+ </Field>
355
+
356
+ {/* Base Dir */}
357
+ <Field label={p.customAgentDir} hint={phase === 'input' ? p.customAgentDirHint : undefined}>
358
+ <Input
359
+ value={form.baseDir}
360
+ onChange={(e) => {
361
+ setField('baseDir', e.target.value);
362
+ if (phase === 'result') {
363
+ setPhase('input');
364
+ setDetectResult(null);
365
+ }
366
+ }}
367
+ placeholder={p.customAgentDirPlaceholder}
368
+ autoComplete="off"
369
+ />
370
+ {/* Detection status hints */}
371
+ {phase === 'result' && detectResult?.exists && (
372
+ <p className="text-xs text-[var(--success)] mt-1 flex items-center gap-1">
373
+ <CheckCircle2 size={12} />
374
+ {p.customAgentDirFound}
375
+ </p>
376
+ )}
377
+ {phase === 'result' && detectResult && !detectResult.exists && !detectTimedOut && (
378
+ <p className="text-xs text-[var(--info,var(--muted-foreground))] mt-1 flex items-center gap-1">
379
+ <Info size={12} />
380
+ {p.customAgentDirNotFound}
381
+ </p>
382
+ )}
383
+ {phase === 'result' && detectTimedOut && (
384
+ <p className="text-xs text-[var(--amber)] mt-1 flex items-center gap-1">
385
+ <AlertCircle size={12} />
386
+ {p.customAgentDetectTimeout}
387
+ </p>
388
+ )}
389
+ </Field>
390
+
391
+ {/* Phase B: Detection Results */}
392
+ {phase === 'result' && (
393
+ <>
394
+ {/* Result Card */}
395
+ <div className={`rounded-lg p-4 space-y-2 ${
396
+ detectResult?.exists
397
+ ? 'border border-[var(--success)]/20 bg-[var(--success)]/5'
398
+ : 'border border-border bg-muted/30'
399
+ }`}>
400
+ <p className="text-xs font-medium text-muted-foreground uppercase tracking-wider">
401
+ {detectResult?.exists ? p.customAgentDetectedTitle : p.customAgentDefaultTitle}
402
+ </p>
403
+ <div className="grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5 text-sm">
404
+ <span className="text-muted-foreground">{p.customAgentConfigLabel}</span>
405
+ <span className="text-foreground font-mono text-xs truncate">{form.global}</span>
406
+
407
+ <span className="text-muted-foreground">{p.customAgentFormatLabel}</span>
408
+ <span className="text-foreground">{form.format.toUpperCase()} · {form.configKey}</span>
409
+
410
+ <span className="text-muted-foreground">{p.customAgentTransportLabel}</span>
411
+ <span className="text-foreground">{form.preferredTransport}</span>
412
+
413
+ {detectResult?.hasSkillsDir && (
414
+ <>
415
+ <span className="text-muted-foreground">{p.customAgentSkillsLabel}</span>
416
+ <span className="text-foreground">{p.customAgentSkillsFound(0)}</span>
417
+ </>
418
+ )}
419
+ </div>
420
+ </div>
421
+
422
+ {/* Customize toggle */}
423
+ <button
424
+ type="button"
425
+ onClick={() => setCustomizeOpen(prev => !prev)}
426
+ className="flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors duration-150 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded"
427
+ >
428
+ {customizeOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}
429
+ {p.customAgentCustomize}
430
+ </button>
431
+
432
+ {/* Customize panel — CSS Grid expand */}
433
+ <div
434
+ className="grid transition-[grid-template-rows] duration-200 ease-out"
435
+ style={{ gridTemplateRows: customizeOpen ? '1fr' : '0fr' }}
436
+ >
437
+ <div className="overflow-hidden">
438
+ <div className="rounded-xl border border-border/50 bg-card/50 p-5 space-y-4">
439
+ {/* MCP Config Path */}
440
+ <Field label={p.customAgentConfigPath}>
441
+ <Input
442
+ value={form.global}
443
+ onChange={(e) => setField('global', e.target.value)}
444
+ autoComplete="off"
445
+ />
446
+ </Field>
447
+
448
+ {/* Config Key + Format */}
449
+ <div className="grid grid-cols-2 gap-3">
450
+ <Field label={p.customAgentConfigKey}>
451
+ <Input
452
+ value={form.configKey}
453
+ onChange={(e) => setField('configKey', e.target.value)}
454
+ autoComplete="off"
455
+ />
456
+ </Field>
457
+ <Field label={p.customAgentFormat}>
458
+ <div className="flex gap-2 pt-1">
459
+ <RadioPill
460
+ label="JSON"
461
+ checked={form.format === 'json'}
462
+ onChange={() => setField('format', 'json')}
463
+ name="format"
464
+ />
465
+ <RadioPill
466
+ label="TOML"
467
+ checked={form.format === 'toml'}
468
+ onChange={() => setField('format', 'toml')}
469
+ name="format"
470
+ />
471
+ </div>
472
+ </Field>
473
+ </div>
474
+
475
+ {/* Transport */}
476
+ <Field label={p.customAgentTransport}>
477
+ <div className="flex gap-2">
478
+ <RadioPill
479
+ label="stdio"
480
+ checked={form.preferredTransport === 'stdio'}
481
+ onChange={() => setField('preferredTransport', 'stdio')}
482
+ name="transport"
483
+ />
484
+ <RadioPill
485
+ label="http"
486
+ checked={form.preferredTransport === 'http'}
487
+ onChange={() => setField('preferredTransport', 'http')}
488
+ name="transport"
489
+ />
490
+ </div>
491
+ </Field>
492
+
493
+ {/* Project Config */}
494
+ <Field label={p.customAgentProjectConfig}>
495
+ <Input
496
+ value={form.project}
497
+ onChange={(e) => setField('project', e.target.value)}
498
+ autoComplete="off"
499
+ />
500
+ </Field>
501
+
502
+ {/* CLI Binary */}
503
+ <Field label={p.customAgentCliBinary}>
504
+ <Input
505
+ value={form.presenceCli}
506
+ onChange={(e) => setField('presenceCli', e.target.value)}
507
+ placeholder={p.customAgentCliBinaryPlaceholder}
508
+ autoComplete="off"
509
+ />
510
+ </Field>
511
+ </div>
512
+ </div>
513
+ </div>
514
+ </>
515
+ )}
516
+
517
+ {/* Error Banner */}
518
+ {error && (
519
+ <div className="rounded-lg border border-[var(--error)]/30 bg-[var(--error)]/5 p-3 flex items-start gap-2">
520
+ <AlertCircle size={14} className="text-[var(--error)] mt-0.5 shrink-0" />
521
+ <p className="text-sm text-[var(--error)]">{error}</p>
522
+ </div>
523
+ )}
524
+ </div>
525
+
526
+ {/* Footer */}
527
+ <div className="flex justify-end gap-2 px-5 pb-5 pt-1">
528
+ <button
529
+ type="button"
530
+ onClick={onClose}
531
+ className="px-4 min-h-[36px] text-sm rounded-lg border border-border hover:bg-muted cursor-pointer transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
532
+ >
533
+ {p.customAgentCancel}
534
+ </button>
535
+
536
+ {phase === 'input' ? (
537
+ <button
538
+ type="button"
539
+ onClick={handleContinue}
540
+ disabled={!canContinue || detecting}
541
+ className="px-4 min-h-[36px] text-sm rounded-lg bg-[var(--amber)] text-[var(--amber-foreground)] hover:bg-[var(--amber)]/90 disabled:opacity-50 disabled:cursor-not-allowed cursor-pointer transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring flex items-center gap-2"
542
+ >
543
+ {detecting ? (
544
+ <>
545
+ <Loader2 size={14} className="animate-spin" />
546
+ {p.customAgentDetecting}
547
+ </>
548
+ ) : (
549
+ <>
550
+ {p.customAgentContinue}
551
+ <ChevronRight size={14} />
552
+ </>
553
+ )}
554
+ </button>
555
+ ) : (
556
+ <button
557
+ type="button"
558
+ onClick={handleSave}
559
+ disabled={saving}
560
+ className="px-4 min-h-[36px] text-sm rounded-lg bg-[var(--amber)] text-[var(--amber-foreground)] hover:bg-[var(--amber)]/90 disabled:opacity-50 disabled:cursor-not-allowed cursor-pointer transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring flex items-center gap-2"
561
+ >
562
+ {saving ? (
563
+ <>
564
+ <Loader2 size={14} className="animate-spin" />
565
+ {isEdit ? p.customAgentSaving : p.customAgentAdding}
566
+ </>
567
+ ) : error ? (
568
+ p.customAgentRetry
569
+ ) : isEdit ? (
570
+ p.customAgentSave
571
+ ) : (
572
+ p.customAgentAdd
573
+ )}
574
+ </button>
575
+ )}
576
+ </div>
577
+ </div>
578
+ </div>
579
+ );
580
+ }
581
+
582
+ /* ─── Radio Pill (inline sub-component) ─── */
583
+
584
+ function RadioPill({
585
+ label,
586
+ checked,
587
+ onChange,
588
+ name,
589
+ }: {
590
+ label: string;
591
+ checked: boolean;
592
+ onChange: () => void;
593
+ name: string;
594
+ }) {
595
+ return (
596
+ <label
597
+ className={`px-3 py-1.5 text-sm rounded-md border cursor-pointer transition-all duration-150 select-none ${
598
+ checked
599
+ ? 'border-[var(--amber)]/40 bg-[var(--amber-dim)] text-foreground font-medium'
600
+ : 'border-border bg-background text-muted-foreground hover:bg-muted'
601
+ }`}
602
+ >
603
+ <input
604
+ type="radio"
605
+ name={name}
606
+ checked={checked}
607
+ onChange={onChange}
608
+ className="sr-only"
609
+ />
610
+ {label}
611
+ </label>
612
+ );
613
+ }
@@ -106,6 +106,10 @@ export interface AgentInfo {
106
106
  installedSkillNames?: string[];
107
107
  installedSkillCount?: number;
108
108
  installedSkillSourcePath?: string;
109
+ /** True for user-defined agents (not built-in). */
110
+ isCustom?: boolean;
111
+ /** Base directory for custom agents (used for UI display). */
112
+ customBaseDir?: string;
109
113
  }
110
114
 
111
115
  export interface SkillInfo {