@geminilight/mindos 0.6.56 → 0.6.58

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 (424) 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 +21 -19
  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 +2 -2
  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.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/detect/route.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  41. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/agents/custom/detect/route.js +1 -0
  43. package/_standalone/.next/server/app/api/agents/custom/detect/route.js.nft.json +1 -0
  44. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -0
  45. package/_standalone/.next/server/app/api/agents/custom/route.js +1 -0
  46. package/_standalone/.next/server/app/api/agents/custom/route.js.nft.json +1 -0
  47. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -0
  48. package/_standalone/.next/server/app/api/ask/route.js +5 -5
  49. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  50. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  54. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  56. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  58. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  60. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  63. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  64. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  66. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  72. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  74. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  77. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
  81. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  82. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/mcp/install/route.js +1 -1
  84. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
  88. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  91. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  93. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  96. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  98. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/settings/reset-token/route.js +1 -1
  100. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  102. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  105. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/setup/route.js +1 -1
  111. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/api/skills/route.js +1 -1
  113. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  116. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  122. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  123. package/_standalone/.next/server/app/changes/page.js +2 -2
  124. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  125. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  126. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  127. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  128. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  129. package/_standalone/.next/server/app/echo/page.js +1 -1
  130. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  131. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  132. package/_standalone/.next/server/app/explore/page.js +2 -2
  133. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  134. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  135. package/_standalone/.next/server/app/help/page.js +2 -2
  136. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  137. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  138. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  139. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  140. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  141. package/_standalone/.next/server/app/login/page.js +1 -1
  142. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  143. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  144. package/_standalone/.next/server/app/page.js +1 -1
  145. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  146. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  147. package/_standalone/.next/server/app/setup/page.js +2 -2
  148. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  149. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  150. package/_standalone/.next/server/app/trash/page.js +3 -3
  151. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  152. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  153. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  154. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  155. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  156. package/_standalone/.next/server/app/wiki/page.js +1 -1
  157. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  158. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  159. package/_standalone/.next/server/app-paths-manifest.json +21 -19
  160. package/_standalone/.next/server/chunks/1550.js +1 -1
  161. package/_standalone/.next/server/chunks/1750.js +1 -1
  162. package/_standalone/.next/server/chunks/{2190.js → 3484.js} +1 -1
  163. package/_standalone/.next/server/chunks/530.js +30 -30
  164. package/_standalone/.next/server/chunks/6539.js +1 -1
  165. package/_standalone/.next/server/chunks/6793.js +52 -0
  166. package/_standalone/.next/server/chunks/8388.js +3 -3
  167. package/_standalone/.next/server/chunks/953.js +2 -2
  168. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  169. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  170. package/_standalone/.next/server/pages/500.html +2 -2
  171. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  172. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  173. package/_standalone/.next/static/2ksXveDzEcnCMRIElDkLq/_buildManifest.js +1 -0
  174. package/_standalone/.next/static/chunks/1053-fe009233cff06e72.js +29 -0
  175. package/_standalone/.next/static/chunks/1477.33df3cce509578c2.js +1 -0
  176. package/_standalone/.next/static/chunks/{1814.b08e9fb85dd3b13c.js → 1814.a7c127b2c73d1f70.js} +1 -1
  177. package/_standalone/.next/static/chunks/2549-e63cf57fa927a41d.js +1 -0
  178. package/_standalone/.next/static/chunks/{1007.c11404e50b39d165.js → 2647.e0b67d0c432ad7e7.js} +10 -10
  179. package/_standalone/.next/static/chunks/{2872.c8c8593be1ba4735.js → 2872.045858d00bd8307f.js} +2 -2
  180. package/_standalone/.next/static/chunks/362.3978790a2e636c3c.js +2 -0
  181. package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +1 -0
  182. package/_standalone/.next/static/chunks/54a60aa6.7a74f547ec1bdd5a.js +79 -0
  183. package/_standalone/.next/static/chunks/6087.4b6102dc0bcd07a7.js +1 -0
  184. package/_standalone/.next/static/chunks/6878-e2c5459e1c608f89.js +1 -0
  185. package/_standalone/.next/static/chunks/7249-fa98ca10e9a10f39.js +11 -0
  186. package/_standalone/.next/static/chunks/8252-e5ae7ced3a41e0ed.js +1 -0
  187. package/_standalone/.next/static/chunks/{8753-ea9db680b0f70f25.js → 8658-16ff58b75ae37fbb.js} +1 -1
  188. package/_standalone/.next/static/chunks/{7322-d67d05067544864c.js → 9274-296ab35f9f09e42e.js} +1 -1
  189. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-2f4705aa66819b86.js +1 -0
  190. package/_standalone/.next/static/chunks/app/_global-error/page-2f4705aa66819b86.js +1 -0
  191. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-7bdeab5af8e4f5f2.js +1 -0
  192. package/_standalone/.next/static/chunks/app/agents/page-5d1446665ddb3801.js +1 -0
  193. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-2f4705aa66819b86.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-2f4705aa66819b86.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2f4705aa66819b86.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/a2a/route-2f4705aa66819b86.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/acp/config/route-2f4705aa66819b86.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/acp/detect/route-2f4705aa66819b86.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/acp/install/route-2f4705aa66819b86.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/acp/registry/route-2f4705aa66819b86.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/acp/session/route-2f4705aa66819b86.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/agent-activity/route-2f4705aa66819b86.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2f4705aa66819b86.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/agents/custom/route-2f4705aa66819b86.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/ask/route-2f4705aa66819b86.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2f4705aa66819b86.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/auth/route-2f4705aa66819b86.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/backlinks/route-2f4705aa66819b86.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/bootstrap/route-2f4705aa66819b86.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/changes/route-2f4705aa66819b86.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/export/route-2f4705aa66819b86.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2f4705aa66819b86.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/file/import/route-2f4705aa66819b86.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/file/raw/route-2f4705aa66819b86.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/file/route-2f4705aa66819b86.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/files/route-2f4705aa66819b86.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/git/route-2f4705aa66819b86.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/graph/route-2f4705aa66819b86.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/health/route-2f4705aa66819b86.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/inbox/route-2f4705aa66819b86.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/init/route-2f4705aa66819b86.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2f4705aa66819b86.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/mcp/install/route-2f4705aa66819b86.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2f4705aa66819b86.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2f4705aa66819b86.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/mcp/status/route-2f4705aa66819b86.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2f4705aa66819b86.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/monitoring/route-2f4705aa66819b86.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/recent-files/route-2f4705aa66819b86.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/restart/route-2f4705aa66819b86.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/search/route-2f4705aa66819b86.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2f4705aa66819b86.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2f4705aa66819b86.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/settings/route-2f4705aa66819b86.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2f4705aa66819b86.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2f4705aa66819b86.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2f4705aa66819b86.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2f4705aa66819b86.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/setup/ls/route-2f4705aa66819b86.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/setup/route-2f4705aa66819b86.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/skills/route-2f4705aa66819b86.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/sync/route-2f4705aa66819b86.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/tree-version/route-2f4705aa66819b86.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/uninstall/route-2f4705aa66819b86.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/update/route-2f4705aa66819b86.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/update-check/route-2f4705aa66819b86.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/update-status/route-2f4705aa66819b86.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/workflows/route-2f4705aa66819b86.js +1 -0
  249. package/_standalone/.next/static/chunks/app/echo/[segment]/{page-6710da1f581b2854.js → page-b0103509ce34444b.js} +4 -4
  250. package/_standalone/.next/static/chunks/app/echo/page-2f4705aa66819b86.js +1 -0
  251. package/_standalone/.next/static/chunks/app/{layout-d5f28933c5e14d74.js → layout-7e02ddf4144b01f1.js} +11 -11
  252. package/_standalone/.next/static/chunks/app/loading-2f4705aa66819b86.js +1 -0
  253. package/_standalone/.next/static/chunks/app/page-6a6a12bd6d6812d0.js +7 -0
  254. package/_standalone/.next/static/chunks/app/setup/{page-9a81fa4d82c6351b.js → page-99fcfc460fa29733.js} +1 -1
  255. package/_standalone/.next/static/chunks/app/trash/page-54cbd5c98d9de69b.js +1 -0
  256. package/_standalone/.next/static/chunks/app/view/[...path]/loading-2f4705aa66819b86.js +1 -0
  257. package/_standalone/.next/static/chunks/app/view/[...path]/page-ca7bdcbf27f88a46.js +12 -0
  258. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2f4705aa66819b86.js +1 -0
  259. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2f4705aa66819b86.js +1 -0
  260. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2f4705aa66819b86.js +1 -0
  261. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2f4705aa66819b86.js +1 -0
  262. package/_standalone/.next/static/chunks/webpack-2c19436659aa657b.js +1 -0
  263. package/_standalone/.next/static/css/fd84c8316ead16eb.css +1 -0
  264. package/_standalone/.next/trace +64 -64
  265. package/_standalone/.next/types/routes.d.ts +3 -1
  266. package/_standalone/.next/types/validator.ts +18 -0
  267. package/_standalone/__tests__/api/mcp-install.test.ts +3 -2
  268. package/_standalone/__tests__/ask/non-streaming-api.test.ts +281 -0
  269. package/_standalone/__tests__/core/skill-install-logic.test.ts +1 -0
  270. package/_standalone/components/Editor.tsx +124 -6
  271. package/_standalone/components/MarkdownView.tsx +3 -1
  272. package/_standalone/components/WysiwygEditor.tsx +90 -0
  273. package/_standalone/components/agents/AgentsOverviewSection.tsx +100 -8
  274. package/_standalone/components/agents/CustomAgentModal.tsx +637 -0
  275. package/_standalone/components/settings/types.ts +4 -0
  276. package/_standalone/data/skills/mindos/SKILL.md +14 -9
  277. package/_standalone/data/skills/mindos-zh/SKILL.md +13 -4
  278. package/_standalone/hooks/useEditorImageUpload.ts +113 -0
  279. package/_standalone/lib/image.ts +47 -0
  280. package/_standalone/tsconfig.tsbuildinfo +1 -1
  281. package/app/app/api/agents/custom/detect/route.ts +31 -0
  282. package/app/app/api/agents/custom/route.ts +158 -0
  283. package/app/app/api/ask/route.ts +171 -10
  284. package/app/app/api/file/import/route.ts +42 -0
  285. package/app/app/api/mcp/agents/route.ts +62 -8
  286. package/app/app/api/settings/list-models/route.ts +16 -2
  287. package/app/app/api/settings/route.ts +9 -0
  288. package/app/app/api/settings/test-key/route.ts +13 -1
  289. package/app/components/Editor.tsx +124 -6
  290. package/app/components/MarkdownView.tsx +3 -1
  291. package/app/components/WysiwygEditor.tsx +90 -0
  292. package/app/components/agents/AgentDetailContent.tsx +74 -1
  293. package/app/components/agents/AgentsContentPage.tsx +76 -1
  294. package/app/components/agents/AgentsOverviewSection.tsx +100 -8
  295. package/app/components/agents/CustomAgentModal.tsx +637 -0
  296. package/app/components/settings/types.ts +4 -0
  297. package/app/data/skills/mindos/SKILL.md +14 -9
  298. package/app/data/skills/mindos-zh/SKILL.md +13 -4
  299. package/app/hooks/useEditorImageUpload.ts +113 -0
  300. package/app/lib/agent/model.ts +7 -1
  301. package/app/lib/agent/providers.ts +31 -6
  302. package/app/lib/core/organize.ts +1 -1
  303. package/app/lib/core/tree.ts +1 -1
  304. package/app/lib/custom-agents.ts +322 -0
  305. package/app/lib/fs.ts +1 -1
  306. package/app/lib/i18n/modules/panels.ts +104 -0
  307. package/app/lib/image.ts +47 -0
  308. package/app/lib/mcp-agents.ts +10 -0
  309. package/app/lib/settings.ts +4 -0
  310. package/bin/commands/start.js +5 -4
  311. package/bin/commands/update.js +6 -2
  312. package/bin/lib/gateway.js +6 -2
  313. package/bin/lib/mcp-agents.js +10 -0
  314. package/mcp/dist/index.cjs +1 -1
  315. package/mcp/src/index.ts +6 -1
  316. package/package.json +1 -1
  317. package/skills/mindos/SKILL.md +10 -4
  318. package/skills/mindos-max/SKILL.md +191 -0
  319. package/skills/mindos-max-workspace/evals/evals.json +23 -0
  320. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/eval_metadata.json +11 -0
  321. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/old_skill/grading.json +28 -0
  322. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/old_skill/outputs/transcript.md +203 -0
  323. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/with_skill/grading.json +28 -0
  324. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/with_skill/outputs/transcript.md +271 -0
  325. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/eval_metadata.json +11 -0
  326. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/old_skill/grading.json +28 -0
  327. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/old_skill/outputs/transcript.md +121 -0
  328. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/with_skill/grading.json +28 -0
  329. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/with_skill/outputs/transcript.md +168 -0
  330. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/eval_metadata.json +11 -0
  331. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/old_skill/grading.json +28 -0
  332. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/old_skill/outputs/transcript.md +143 -0
  333. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/with_skill/grading.json +28 -0
  334. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/with_skill/outputs/transcript.md +233 -0
  335. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/SKILL.md +165 -0
  336. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/README.md +12 -0
  337. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/post-task-hooks.md +27 -0
  338. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/preference-capture.md +41 -0
  339. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/sop-template.md +74 -0
  340. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/write-supplement.md +119 -0
  341. package/skills/mindos-max-zh/SKILL.md +192 -0
  342. package/skills/mindos-zh/SKILL.md +11 -3
  343. package/_standalone/.next/server/chunks/7543.js +0 -52
  344. package/_standalone/.next/static/3gMJ8EaZfDgHmB0NR0Q4T/_buildManifest.js +0 -1
  345. package/_standalone/.next/static/chunks/1053-2874859f7caefa0f.js +0 -29
  346. package/_standalone/.next/static/chunks/1880-7abf971bcfd2389b.js +0 -11
  347. package/_standalone/.next/static/chunks/254-32719a9bea2e74f0.js +0 -1
  348. package/_standalone/.next/static/chunks/362.a77be2f206db7b19.js +0 -1
  349. package/_standalone/.next/static/chunks/3637.0541ac2d0ea7de1f.js +0 -1
  350. package/_standalone/.next/static/chunks/54a60aa6.b97ba5e6900c089b.js +0 -79
  351. package/_standalone/.next/static/chunks/6087.0c32d26d0262c8e7.js +0 -1
  352. package/_standalone/.next/static/chunks/7035-2af69391c7b1ad95.js +0 -1
  353. package/_standalone/.next/static/chunks/8131.5e0bdb36bb91f212.js +0 -1
  354. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-e240db6d5049d336.js +0 -1
  355. package/_standalone/.next/static/chunks/app/_global-error/page-e240db6d5049d336.js +0 -1
  356. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-f006a70f6889eb56.js +0 -1
  357. package/_standalone/.next/static/chunks/app/agents/page-bd522e428e3acb78.js +0 -5
  358. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-e240db6d5049d336.js +0 -1
  359. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-e240db6d5049d336.js +0 -1
  360. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e240db6d5049d336.js +0 -1
  361. package/_standalone/.next/static/chunks/app/api/a2a/route-e240db6d5049d336.js +0 -1
  362. package/_standalone/.next/static/chunks/app/api/acp/config/route-e240db6d5049d336.js +0 -1
  363. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e240db6d5049d336.js +0 -1
  364. package/_standalone/.next/static/chunks/app/api/acp/install/route-e240db6d5049d336.js +0 -1
  365. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e240db6d5049d336.js +0 -1
  366. package/_standalone/.next/static/chunks/app/api/acp/session/route-e240db6d5049d336.js +0 -1
  367. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e240db6d5049d336.js +0 -1
  368. package/_standalone/.next/static/chunks/app/api/ask/route-e240db6d5049d336.js +0 -1
  369. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e240db6d5049d336.js +0 -1
  370. package/_standalone/.next/static/chunks/app/api/auth/route-e240db6d5049d336.js +0 -1
  371. package/_standalone/.next/static/chunks/app/api/backlinks/route-e240db6d5049d336.js +0 -1
  372. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e240db6d5049d336.js +0 -1
  373. package/_standalone/.next/static/chunks/app/api/changes/route-e240db6d5049d336.js +0 -1
  374. package/_standalone/.next/static/chunks/app/api/export/route-e240db6d5049d336.js +0 -1
  375. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e240db6d5049d336.js +0 -1
  376. package/_standalone/.next/static/chunks/app/api/file/import/route-e240db6d5049d336.js +0 -1
  377. package/_standalone/.next/static/chunks/app/api/file/raw/route-e240db6d5049d336.js +0 -1
  378. package/_standalone/.next/static/chunks/app/api/file/route-e240db6d5049d336.js +0 -1
  379. package/_standalone/.next/static/chunks/app/api/files/route-e240db6d5049d336.js +0 -1
  380. package/_standalone/.next/static/chunks/app/api/git/route-e240db6d5049d336.js +0 -1
  381. package/_standalone/.next/static/chunks/app/api/graph/route-e240db6d5049d336.js +0 -1
  382. package/_standalone/.next/static/chunks/app/api/health/route-e240db6d5049d336.js +0 -1
  383. package/_standalone/.next/static/chunks/app/api/inbox/route-e240db6d5049d336.js +0 -1
  384. package/_standalone/.next/static/chunks/app/api/init/route-e240db6d5049d336.js +0 -1
  385. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e240db6d5049d336.js +0 -1
  386. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e240db6d5049d336.js +0 -1
  387. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e240db6d5049d336.js +0 -1
  388. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e240db6d5049d336.js +0 -1
  389. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e240db6d5049d336.js +0 -1
  390. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e240db6d5049d336.js +0 -1
  391. package/_standalone/.next/static/chunks/app/api/monitoring/route-e240db6d5049d336.js +0 -1
  392. package/_standalone/.next/static/chunks/app/api/recent-files/route-e240db6d5049d336.js +0 -1
  393. package/_standalone/.next/static/chunks/app/api/restart/route-e240db6d5049d336.js +0 -1
  394. package/_standalone/.next/static/chunks/app/api/search/route-e240db6d5049d336.js +0 -1
  395. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e240db6d5049d336.js +0 -1
  396. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e240db6d5049d336.js +0 -1
  397. package/_standalone/.next/static/chunks/app/api/settings/route-e240db6d5049d336.js +0 -1
  398. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e240db6d5049d336.js +0 -1
  399. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e240db6d5049d336.js +0 -1
  400. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e240db6d5049d336.js +0 -1
  401. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e240db6d5049d336.js +0 -1
  402. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e240db6d5049d336.js +0 -1
  403. package/_standalone/.next/static/chunks/app/api/setup/route-e240db6d5049d336.js +0 -1
  404. package/_standalone/.next/static/chunks/app/api/skills/route-e240db6d5049d336.js +0 -1
  405. package/_standalone/.next/static/chunks/app/api/sync/route-e240db6d5049d336.js +0 -1
  406. package/_standalone/.next/static/chunks/app/api/tree-version/route-e240db6d5049d336.js +0 -1
  407. package/_standalone/.next/static/chunks/app/api/uninstall/route-e240db6d5049d336.js +0 -1
  408. package/_standalone/.next/static/chunks/app/api/update/route-e240db6d5049d336.js +0 -1
  409. package/_standalone/.next/static/chunks/app/api/update-check/route-e240db6d5049d336.js +0 -1
  410. package/_standalone/.next/static/chunks/app/api/update-status/route-e240db6d5049d336.js +0 -1
  411. package/_standalone/.next/static/chunks/app/api/workflows/route-e240db6d5049d336.js +0 -1
  412. package/_standalone/.next/static/chunks/app/echo/page-e240db6d5049d336.js +0 -1
  413. package/_standalone/.next/static/chunks/app/loading-e240db6d5049d336.js +0 -1
  414. package/_standalone/.next/static/chunks/app/page-45140253e07a135a.js +0 -7
  415. package/_standalone/.next/static/chunks/app/trash/page-c7f14311f040009e.js +0 -1
  416. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e240db6d5049d336.js +0 -1
  417. package/_standalone/.next/static/chunks/app/view/[...path]/page-62cfae628e31d411.js +0 -12
  418. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e240db6d5049d336.js +0 -1
  419. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e240db6d5049d336.js +0 -1
  420. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e240db6d5049d336.js +0 -1
  421. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e240db6d5049d336.js +0 -1
  422. package/_standalone/.next/static/chunks/webpack-521ae5a2ddf0e396.js +0 -1
  423. package/_standalone/.next/static/css/66f8a81e4eda06d4.css +0 -1
  424. /package/_standalone/.next/static/{3gMJ8EaZfDgHmB0NR0Q4T → 2ksXveDzEcnCMRIElDkLq}/_ssgManifest.js +0 -0
@@ -0,0 +1,637 @@
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
+ detectedSkillDir?: string;
20
+ skillCount?: number;
21
+ skillNames?: string[];
22
+ suggestedName?: string;
23
+ }
24
+
25
+ interface FormState {
26
+ name: string;
27
+ baseDir: string;
28
+ global: string;
29
+ configKey: string;
30
+ format: 'json' | 'toml';
31
+ preferredTransport: 'stdio' | 'http';
32
+ project: string;
33
+ presenceCli: string;
34
+ skillDir: string;
35
+ }
36
+
37
+ interface CustomAgentModalProps {
38
+ open: boolean;
39
+ onClose: () => void;
40
+ onSuccess: () => void;
41
+ existingAgents: AgentInfo[];
42
+ /** If provided, modal is in "edit" mode. */
43
+ editAgent?: AgentInfo | null;
44
+ }
45
+
46
+ /* ─── Slugify (client-side mirror) ─── */
47
+
48
+ function slugify(name: string): string {
49
+ return name
50
+ .toLowerCase()
51
+ .replace(/[^\x20-\x7E]/g, '')
52
+ .replace(/[_\s]+/g, '-')
53
+ .replace(/[^a-z0-9-]/g, '')
54
+ .replace(/-{2,}/g, '-')
55
+ .replace(/^-|-$/g, '');
56
+ }
57
+
58
+ /* ─── Component ─── */
59
+
60
+ export default function CustomAgentModal({
61
+ open,
62
+ onClose,
63
+ onSuccess,
64
+ existingAgents,
65
+ editAgent,
66
+ }: CustomAgentModalProps) {
67
+ const { t } = useLocale();
68
+ const p = t.agentsContent.overview;
69
+ const dialogRef = useRef<HTMLDivElement>(null);
70
+ const nameRef = useRef<HTMLInputElement>(null);
71
+
72
+ const isEdit = !!editAgent;
73
+
74
+ // Phase: 'input' (Phase A) or 'result' (Phase B)
75
+ const [phase, setPhase] = useState<'input' | 'result'>('input');
76
+ const [detecting, setDetecting] = useState(false);
77
+ const [saving, setSaving] = useState(false);
78
+ const [error, setError] = useState<string | null>(null);
79
+ const [detectResult, setDetectResult] = useState<DetectResult | null>(null);
80
+ const [detectTimedOut, setDetectTimedOut] = useState(false);
81
+ const [customizeOpen, setCustomizeOpen] = useState(false);
82
+
83
+ const [form, setForm] = useState<FormState>({
84
+ name: '',
85
+ baseDir: '',
86
+ global: '',
87
+ configKey: 'mcpServers',
88
+ format: 'json',
89
+ preferredTransport: 'stdio',
90
+ project: '',
91
+ presenceCli: '',
92
+ skillDir: '',
93
+ });
94
+
95
+ // Reset state when modal opens/closes or editAgent changes
96
+ useEffect(() => {
97
+ if (!open) return;
98
+ if (editAgent) {
99
+ setForm({
100
+ name: editAgent.name,
101
+ baseDir: editAgent.customBaseDir || '',
102
+ global: editAgent.globalPath || '',
103
+ configKey: editAgent.configKey || 'mcpServers',
104
+ format: editAgent.format || 'json',
105
+ preferredTransport: editAgent.preferredTransport || 'stdio',
106
+ project: editAgent.projectPath || '',
107
+ presenceCli: '',
108
+ skillDir: editAgent.skillWorkspacePath || '',
109
+ });
110
+ setPhase('result');
111
+ setCustomizeOpen(true);
112
+ setDetectResult(null);
113
+ setError(null);
114
+ } else {
115
+ setForm({
116
+ name: '',
117
+ baseDir: '',
118
+ global: '',
119
+ configKey: 'mcpServers',
120
+ format: 'json',
121
+ preferredTransport: 'stdio',
122
+ project: '',
123
+ presenceCli: '',
124
+ skillDir: '',
125
+ });
126
+ setPhase('input');
127
+ setCustomizeOpen(false);
128
+ setDetectResult(null);
129
+ setError(null);
130
+ setDetectTimedOut(false);
131
+ }
132
+ }, [open, editAgent]);
133
+
134
+ // Focus name input on open
135
+ useEffect(() => {
136
+ if (open && phase === 'input') {
137
+ setTimeout(() => nameRef.current?.focus(), 100);
138
+ }
139
+ }, [open, phase]);
140
+
141
+ useFocusTrap(dialogRef, open);
142
+
143
+ // Escape to close
144
+ useEffect(() => {
145
+ if (!open) return;
146
+ const onKey = (e: KeyboardEvent) => {
147
+ if (e.key === 'Escape') onClose();
148
+ };
149
+ document.addEventListener('keydown', onKey);
150
+ return () => document.removeEventListener('keydown', onKey);
151
+ }, [open, onClose]);
152
+
153
+ const existingKeys = useMemo(() => {
154
+ const keys = new Set(existingAgents.map(a => a.key));
155
+ if (isEdit && editAgent) keys.delete(editAgent.key);
156
+ return keys;
157
+ }, [existingAgents, isEdit, editAgent]);
158
+
159
+ const slug = useMemo(() => slugify(form.name), [form.name]);
160
+
161
+ const nameError = useMemo(() => {
162
+ if (isEdit) return null; // key is immutable on edit; name can change freely
163
+ if (!form.name.trim()) return null;
164
+ const key = slug || '';
165
+ if (!key) return null;
166
+ if (existingKeys.has(key)) {
167
+ const conflict = existingAgents.find(a => a.key === key);
168
+ if (conflict?.isCustom) return p.customAgentKeyConflict?.(key) ?? `An agent with key "${key}" already exists`;
169
+ return p.customAgentBuiltinConflict?.(conflict?.name || key) ?? `Conflicts with built-in agent "${conflict?.name || key}"`;
170
+ }
171
+ return null;
172
+ }, [isEdit, slug, existingKeys, existingAgents, form.name, p]);
173
+
174
+ const canContinue = form.name.trim() && form.baseDir.trim() && !nameError;
175
+
176
+ const setField = useCallback(<K extends keyof FormState>(key: K, value: FormState[K]) => {
177
+ setForm(prev => ({ ...prev, [key]: value }));
178
+ }, []);
179
+
180
+ /* ─── Detect ─── */
181
+
182
+ const handleContinue = useCallback(async () => {
183
+ if (!canContinue) return;
184
+ setError(null);
185
+ setDetecting(true);
186
+
187
+ const dir = form.baseDir.trim();
188
+
189
+ // Detect API only scans ~/ paths for security; for other absolute paths,
190
+ // skip detection and go straight to Phase B with sensible defaults.
191
+ if (!dir.startsWith('~/')) {
192
+ const normalized = dir.endsWith('/') ? dir : dir + '/';
193
+ setField('global', normalized + 'mcp.json');
194
+ setField('skillDir', normalized + 'skills/');
195
+ setDetectResult({ exists: false, hasSkillsDir: false });
196
+ setPhase('result');
197
+ setDetecting(false);
198
+ return;
199
+ }
200
+
201
+ const controller = new AbortController();
202
+ const timeout = setTimeout(() => controller.abort(), 3000);
203
+
204
+ try {
205
+ const res = await fetch('/api/agents/custom/detect', {
206
+ method: 'POST',
207
+ headers: { 'Content-Type': 'application/json' },
208
+ body: JSON.stringify({ baseDir: dir }),
209
+ signal: controller.signal,
210
+ });
211
+
212
+ clearTimeout(timeout);
213
+ const data: DetectResult = await res.json();
214
+
215
+ if (!res.ok) {
216
+ setError((data as unknown as { error: string }).error || p.customAgentFailedSave);
217
+ return;
218
+ }
219
+
220
+ setDetectResult(data);
221
+
222
+ if (data.detectedConfig) setField('global', data.detectedConfig);
223
+ else {
224
+ setField('global', (dir.endsWith('/') ? dir : dir + '/') + 'mcp.json');
225
+ }
226
+ if (data.detectedFormat) setField('format', data.detectedFormat);
227
+ if (data.detectedConfigKey) setField('configKey', data.detectedConfigKey);
228
+ setField('skillDir', data.detectedSkillDir || (dir.endsWith('/') ? dir : dir + '/') + 'skills/');
229
+
230
+ setPhase('result');
231
+ } catch {
232
+ clearTimeout(timeout);
233
+ const normalized = dir.endsWith('/') ? dir : dir + '/';
234
+ setField('global', normalized + 'mcp.json');
235
+ setField('skillDir', normalized + 'skills/');
236
+ setDetectResult({ exists: false, hasSkillsDir: false });
237
+ setDetectTimedOut(true);
238
+ setPhase('result');
239
+ } finally {
240
+ setDetecting(false);
241
+ }
242
+ }, [canContinue, form.baseDir, setField, p]);
243
+
244
+ /* ─── Save ─── */
245
+
246
+ const handleSave = useCallback(async () => {
247
+ setSaving(true);
248
+ setError(null);
249
+
250
+ const body = isEdit
251
+ ? {
252
+ key: editAgent!.key,
253
+ name: form.name.trim(),
254
+ baseDir: form.baseDir.trim(),
255
+ global: form.global.trim() || undefined,
256
+ configKey: form.configKey.trim() || undefined,
257
+ format: form.format,
258
+ preferredTransport: form.preferredTransport,
259
+ project: form.project.trim() || null,
260
+ presenceCli: form.presenceCli.trim() || undefined,
261
+ skillDir: form.skillDir.trim() || undefined,
262
+ }
263
+ : {
264
+ name: form.name.trim(),
265
+ baseDir: form.baseDir.trim(),
266
+ global: form.global.trim() || undefined,
267
+ configKey: form.configKey.trim() || undefined,
268
+ format: form.format,
269
+ preferredTransport: form.preferredTransport,
270
+ project: form.project.trim() || null,
271
+ presenceCli: form.presenceCli.trim() || undefined,
272
+ skillDir: form.skillDir.trim() || undefined,
273
+ };
274
+
275
+ try {
276
+ const res = await fetch('/api/agents/custom', {
277
+ method: isEdit ? 'PUT' : 'POST',
278
+ headers: { 'Content-Type': 'application/json' },
279
+ body: JSON.stringify(body),
280
+ });
281
+
282
+ const data = await res.json();
283
+
284
+ if (!res.ok) {
285
+ setError(data.error || p.customAgentFailedSave);
286
+ setSaving(false);
287
+ return;
288
+ }
289
+
290
+ const toastMsg = isEdit
291
+ ? p.customAgentUpdated(form.name.trim())
292
+ : p.customAgentAdded(form.name.trim());
293
+ toast.success(toastMsg);
294
+ onSuccess();
295
+ onClose();
296
+ } catch {
297
+ setError(p.customAgentNetworkError);
298
+ } finally {
299
+ setSaving(false);
300
+ }
301
+ }, [isEdit, editAgent, form, onSuccess, onClose, p]);
302
+
303
+ /* ─── Keyboard: Enter ─── */
304
+
305
+ const handleKeyDown = useCallback((e: React.KeyboardEvent) => {
306
+ if (e.key !== 'Enter') return;
307
+ if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {
308
+ e.preventDefault();
309
+ if (phase === 'input' && canContinue && !detecting) {
310
+ handleContinue();
311
+ } else if (phase === 'result' && !saving) {
312
+ handleSave();
313
+ }
314
+ }
315
+ }, [phase, canContinue, detecting, saving, handleContinue, handleSave]);
316
+
317
+ if (!open) return null;
318
+
319
+ const title = isEdit
320
+ ? p.editCustomAgentTitle(editAgent!.name)
321
+ : p.addCustomAgentTitle;
322
+
323
+ return (
324
+ <div className="fixed inset-0 z-50 flex items-center justify-center" role="dialog" aria-modal="true" aria-labelledby="custom-agent-modal-title">
325
+ {/* Backdrop */}
326
+ <div className="absolute inset-0 modal-backdrop" onClick={onClose} aria-hidden="true" />
327
+
328
+ {/* Dialog */}
329
+ <div
330
+ ref={dialogRef}
331
+ 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"
332
+ onKeyDown={handleKeyDown}
333
+ >
334
+ {/* Header */}
335
+ <div className="flex items-center justify-between px-5 pt-5 pb-1">
336
+ <h2 id="custom-agent-modal-title" className="text-base font-semibold text-foreground">{title}</h2>
337
+ <button
338
+ type="button"
339
+ onClick={onClose}
340
+ 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"
341
+ aria-label="Close"
342
+ >
343
+ <X size={16} />
344
+ </button>
345
+ </div>
346
+
347
+ {/* Body */}
348
+ <div className="px-5 py-4 space-y-4">
349
+ {/* Name */}
350
+ <Field label={p.customAgentName}>
351
+ <input
352
+ ref={nameRef}
353
+ value={form.name}
354
+ onChange={(e) => setField('name', e.target.value)}
355
+ placeholder={p.customAgentNamePlaceholder}
356
+ aria-invalid={!!nameError}
357
+ 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'}`}
358
+ autoComplete="off"
359
+ />
360
+ {nameError ? (
361
+ <p className="text-xs text-[var(--error)] mt-1 flex items-center gap-1">
362
+ <AlertCircle size={12} />
363
+ {nameError}
364
+ </p>
365
+ ) : form.name.trim() && slug ? (
366
+ <p className="text-[11px] text-muted-foreground mt-0.5">{p.customAgentKeyPreview(slug)}</p>
367
+ ) : null}
368
+ </Field>
369
+
370
+ {/* Base Dir */}
371
+ <Field label={p.customAgentDir} hint={phase === 'input' ? p.customAgentDirHint : undefined}>
372
+ <Input
373
+ value={form.baseDir}
374
+ onChange={(e) => {
375
+ setField('baseDir', e.target.value);
376
+ if (phase === 'result') {
377
+ setPhase('input');
378
+ setDetectResult(null);
379
+ }
380
+ }}
381
+ placeholder={p.customAgentDirPlaceholder}
382
+ autoComplete="off"
383
+ />
384
+ {/* Detection status hints */}
385
+ {phase === 'result' && detectResult?.exists && (
386
+ <p className="text-xs text-[var(--success)] mt-1 flex items-center gap-1">
387
+ <CheckCircle2 size={12} />
388
+ {p.customAgentDirFound}
389
+ </p>
390
+ )}
391
+ {phase === 'result' && detectResult && !detectResult.exists && !detectTimedOut && (
392
+ <p className="text-xs text-[var(--info,var(--muted-foreground))] mt-1 flex items-center gap-1">
393
+ <Info size={12} />
394
+ {p.customAgentDirNotFound}
395
+ </p>
396
+ )}
397
+ {phase === 'result' && detectTimedOut && (
398
+ <p className="text-xs text-[var(--amber)] mt-1 flex items-center gap-1">
399
+ <AlertCircle size={12} />
400
+ {p.customAgentDetectTimeout}
401
+ </p>
402
+ )}
403
+ </Field>
404
+
405
+ {/* Phase B: Detection Results */}
406
+ {phase === 'result' && (
407
+ <>
408
+ {/* Result Card */}
409
+ <div className={`rounded-lg p-4 space-y-2 ${
410
+ detectResult?.exists
411
+ ? 'border border-[var(--success)]/20 bg-[var(--success)]/5'
412
+ : 'border border-border bg-muted/30'
413
+ }`}>
414
+ <p className="text-xs font-medium text-muted-foreground uppercase tracking-wider">
415
+ {detectResult?.exists ? p.customAgentDetectedTitle : p.customAgentDefaultTitle}
416
+ </p>
417
+ <div className="grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5 text-sm">
418
+ <span className="text-muted-foreground">{p.customAgentConfigLabel}</span>
419
+ <span className="text-foreground font-mono text-xs truncate">{form.global}</span>
420
+
421
+ <span className="text-muted-foreground">{p.customAgentFormatLabel}</span>
422
+ <span className="text-foreground">{form.format.toUpperCase()} · {form.configKey}</span>
423
+
424
+ <span className="text-muted-foreground">{p.customAgentTransportLabel}</span>
425
+ <span className="text-foreground">{form.preferredTransport}</span>
426
+
427
+ <span className="text-muted-foreground">{p.customAgentSkillsLabel}</span>
428
+ <span className="text-foreground">
429
+ {detectResult?.hasSkillsDir
430
+ ? p.customAgentSkillsFound(detectResult.skillCount ?? 0)
431
+ : p.customAgentSkillsNone ?? '—'}
432
+ </span>
433
+ </div>
434
+ </div>
435
+
436
+ {/* Customize toggle */}
437
+ <button
438
+ type="button"
439
+ onClick={() => setCustomizeOpen(prev => !prev)}
440
+ 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"
441
+ >
442
+ {customizeOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}
443
+ {p.customAgentCustomize}
444
+ </button>
445
+
446
+ {/* Customize panel — CSS Grid expand */}
447
+ <div
448
+ className="grid transition-[grid-template-rows] duration-200 ease-out"
449
+ style={{ gridTemplateRows: customizeOpen ? '1fr' : '0fr' }}
450
+ >
451
+ <div className="overflow-hidden">
452
+ <div className="rounded-xl border border-border/50 bg-card/50 p-5 space-y-4">
453
+ {/* MCP Config Path */}
454
+ <Field label={p.customAgentConfigPath}>
455
+ <Input
456
+ value={form.global}
457
+ onChange={(e) => setField('global', e.target.value)}
458
+ autoComplete="off"
459
+ />
460
+ </Field>
461
+
462
+ {/* Config Key + Format */}
463
+ <div className="grid grid-cols-2 gap-3">
464
+ <Field label={p.customAgentConfigKey}>
465
+ <Input
466
+ value={form.configKey}
467
+ onChange={(e) => setField('configKey', e.target.value)}
468
+ autoComplete="off"
469
+ />
470
+ </Field>
471
+ <Field label={p.customAgentFormat}>
472
+ <div className="flex gap-2 pt-1">
473
+ <RadioPill
474
+ label="JSON"
475
+ checked={form.format === 'json'}
476
+ onChange={() => setField('format', 'json')}
477
+ name="format"
478
+ />
479
+ <RadioPill
480
+ label="TOML"
481
+ checked={form.format === 'toml'}
482
+ onChange={() => setField('format', 'toml')}
483
+ name="format"
484
+ />
485
+ </div>
486
+ </Field>
487
+ </div>
488
+
489
+ {/* Transport */}
490
+ <Field label={p.customAgentTransport}>
491
+ <div className="flex gap-2">
492
+ <RadioPill
493
+ label="stdio"
494
+ checked={form.preferredTransport === 'stdio'}
495
+ onChange={() => setField('preferredTransport', 'stdio')}
496
+ name="transport"
497
+ />
498
+ <RadioPill
499
+ label="http"
500
+ checked={form.preferredTransport === 'http'}
501
+ onChange={() => setField('preferredTransport', 'http')}
502
+ name="transport"
503
+ />
504
+ </div>
505
+ </Field>
506
+
507
+ {/* Skills Directory */}
508
+ <Field label={p.customAgentSkillDir} hint={p.customAgentSkillDirHint}>
509
+ <Input
510
+ value={form.skillDir}
511
+ onChange={(e) => setField('skillDir', e.target.value)}
512
+ placeholder={p.customAgentSkillDirPlaceholder}
513
+ autoComplete="off"
514
+ />
515
+ </Field>
516
+
517
+ {/* Project Config */}
518
+ <Field label={p.customAgentProjectConfig}>
519
+ <Input
520
+ value={form.project}
521
+ onChange={(e) => setField('project', e.target.value)}
522
+ autoComplete="off"
523
+ />
524
+ </Field>
525
+
526
+ {/* CLI Binary */}
527
+ <Field label={p.customAgentCliBinary}>
528
+ <Input
529
+ value={form.presenceCli}
530
+ onChange={(e) => setField('presenceCli', e.target.value)}
531
+ placeholder={p.customAgentCliBinaryPlaceholder}
532
+ autoComplete="off"
533
+ />
534
+ </Field>
535
+ </div>
536
+ </div>
537
+ </div>
538
+ </>
539
+ )}
540
+
541
+ {/* Error Banner */}
542
+ {error && (
543
+ <div className="rounded-lg border border-[var(--error)]/30 bg-[var(--error)]/5 p-3 flex items-start gap-2">
544
+ <AlertCircle size={14} className="text-[var(--error)] mt-0.5 shrink-0" />
545
+ <p className="text-sm text-[var(--error)]">{error}</p>
546
+ </div>
547
+ )}
548
+ </div>
549
+
550
+ {/* Footer */}
551
+ <div className="flex justify-end gap-2 px-5 pb-5 pt-1">
552
+ <button
553
+ type="button"
554
+ onClick={onClose}
555
+ 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"
556
+ >
557
+ {p.customAgentCancel}
558
+ </button>
559
+
560
+ {phase === 'input' ? (
561
+ <button
562
+ type="button"
563
+ onClick={handleContinue}
564
+ disabled={!canContinue || detecting}
565
+ 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"
566
+ >
567
+ {detecting ? (
568
+ <>
569
+ <Loader2 size={14} className="animate-spin" />
570
+ {p.customAgentDetecting}
571
+ </>
572
+ ) : (
573
+ <>
574
+ {p.customAgentContinue}
575
+ <ChevronRight size={14} />
576
+ </>
577
+ )}
578
+ </button>
579
+ ) : (
580
+ <button
581
+ type="button"
582
+ onClick={handleSave}
583
+ disabled={saving}
584
+ 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"
585
+ >
586
+ {saving ? (
587
+ <>
588
+ <Loader2 size={14} className="animate-spin" />
589
+ {isEdit ? p.customAgentSaving : p.customAgentAdding}
590
+ </>
591
+ ) : error ? (
592
+ p.customAgentRetry
593
+ ) : isEdit ? (
594
+ p.customAgentSave
595
+ ) : (
596
+ p.customAgentAdd
597
+ )}
598
+ </button>
599
+ )}
600
+ </div>
601
+ </div>
602
+ </div>
603
+ );
604
+ }
605
+
606
+ /* ─── Radio Pill (inline sub-component) ─── */
607
+
608
+ function RadioPill({
609
+ label,
610
+ checked,
611
+ onChange,
612
+ name,
613
+ }: {
614
+ label: string;
615
+ checked: boolean;
616
+ onChange: () => void;
617
+ name: string;
618
+ }) {
619
+ return (
620
+ <label
621
+ className={`px-3 py-1.5 text-sm rounded-md border cursor-pointer transition-all duration-150 select-none ${
622
+ checked
623
+ ? 'border-[var(--amber)]/40 bg-[var(--amber-dim)] text-foreground font-medium'
624
+ : 'border-border bg-background text-muted-foreground hover:bg-muted'
625
+ }`}
626
+ >
627
+ <input
628
+ type="radio"
629
+ name={name}
630
+ checked={checked}
631
+ onChange={onChange}
632
+ className="sr-only"
633
+ />
634
+ {label}
635
+ </label>
636
+ );
637
+ }
@@ -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 {
@@ -3,14 +3,19 @@ name: mindos
3
3
  description: >
4
4
  Operate a MindOS knowledge base: update notes, search, organize files, execute SOPs/workflows,
5
5
  retrospective, append CSV, cross-agent handoff, route unstructured input to the right files,
6
- distill experience, sync related docs. 更新笔记, 搜索知识库, 整理, 执行SOP, 复盘, 追加CSV, 交接, 路由到文件, 提炼经验.
7
- Use when the task targets files inside the user's MindOS KB (mindRoot).
6
+ distill experience, sync related docs.
7
+ 更新笔记, 搜索知识库, 整理文件, 执行SOP/工作流, 复盘, 追加CSV, 跨Agent交接,
8
+ 路由非结构化输入到对应文件, 提炼经验, 同步关联文档.
8
9
  NOT for editing app source, project docs, or paths outside the KB.
9
10
  Core concepts: Space, Instruction (INSTRUCTION.md), Skill (SKILL.md); notes can embody both.
10
- Trigger when user asks to: save or record a note, search their knowledge base, update or edit
11
- a file, organize notes, run a workflow or SOP, capture decisions from a session, append rows
12
- to a table or CSV, hand off context to another agent or says "帮我记下来" / "搜一下我的笔记" /
13
- "更新知识库" / "整理文件" / "执行工作流".
11
+ Trigger when user asks to: save or record anything, search for prior notes or context, update or
12
+ edit a file, organize notes, run a workflow or SOP, capture decisions from a session, append rows
13
+ to a table or CSV, hand off context to another agent, check if something was discussed before,
14
+ look up a past decision, distill lessons learned, prepare context for a meeting.
15
+ Also trigger on Chinese: 帮我记下来, 搜一下笔记, 更新知识库, 整理文件, 复盘, 提炼经验,
16
+ 保存, 记录, 交接, 查一下之前的, 有没有相关笔记, 把这个存起来.
17
+ When the user's question implies stored context may exist (past decisions, previous discussions,
18
+ meeting records), consider searching MindOS even if they don't explicitly mention it.
14
19
  ---
15
20
 
16
21
  # MindOS Skill
@@ -115,9 +120,9 @@ User request
115
120
  ## Judgment heuristics
116
121
 
117
122
  **Save intent boundary:**
118
- - "帮我记下来" / "保存" = write
119
- - "搜一下" / "总结" = read-only
120
- - "整理一下" → ask: display only, or write back?
123
+ - "save this" / "record" / "write down" = write
124
+ - "search" / "summarize" / "look up" = read-only
125
+ - "organize" → ask: display only, or write back?
121
126
 
122
127
  **File location uncertainty:**
123
128
  - Can't decide in 5 seconds → use nearest existing directory, inform user