@geminilight/mindos 0.6.40 → 0.6.41

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 (287) 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 +18 -18
  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 +5 -1
  10. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  11. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error.html +2 -2
  13. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  14. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  26. package/_standalone/.next/server/app/agents/page.js +2 -2
  27. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  28. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  29. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/ask/route.js +1 -1
  40. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  41. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  45. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  47. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  51. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  54. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  56. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  58. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  60. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  62. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  65. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  67. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  69. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/mcp/install/route.js +1 -1
  71. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/mcp/install-skill/route.js.nft.json +1 -1
  73. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
  76. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  78. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  80. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  83. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  97. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/changes/page.js +1 -1
  105. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  106. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  108. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  109. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/echo/page.js +1 -1
  111. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  112. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/explore/page.js +1 -1
  114. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  115. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/help/page.js +2 -2
  117. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  118. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/login/page.js +1 -1
  120. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  121. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  122. package/_standalone/.next/server/app/page.js +2 -2
  123. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  124. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/setup/page.js +2 -2
  126. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  127. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/trash/page.js +3 -3
  129. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  130. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  132. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  133. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  134. package/_standalone/.next/server/app-paths-manifest.json +18 -18
  135. package/_standalone/.next/server/chunks/1550.js +1 -1
  136. package/_standalone/.next/server/chunks/2190.js +11 -0
  137. package/_standalone/.next/server/chunks/{6365.js → 2536.js} +2 -2
  138. package/_standalone/.next/server/chunks/5648.js +2 -0
  139. package/_standalone/.next/server/chunks/8388.js +1 -1
  140. package/_standalone/.next/server/chunks/953.js +1 -1
  141. package/_standalone/.next/server/chunks/9539.js +219 -0
  142. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  143. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  144. package/_standalone/.next/server/next-font-manifest.js +1 -1
  145. package/_standalone/.next/server/next-font-manifest.json +1 -1
  146. package/_standalone/.next/server/pages/500.html +2 -2
  147. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  149. package/_standalone/.next/static/chunks/1053-b70535785cc5aaee.js +29 -0
  150. package/_standalone/.next/static/chunks/{8663-de911d2d395622be.js → 1880-c2a9e76201841c86.js} +1 -1
  151. package/_standalone/.next/static/chunks/3637.0541ac2d0ea7de1f.js +1 -0
  152. package/_standalone/.next/static/chunks/4563-b2a2ce80aff845af.js +6 -0
  153. package/_standalone/.next/static/chunks/6981-3d7dcac2d12a5670.js +1 -0
  154. package/_standalone/.next/static/chunks/7144-5febf62f1a79fe64.js +1 -0
  155. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-773071a99c4daac2.js +1 -0
  156. package/_standalone/.next/static/chunks/app/agents/page-6102a884b2cb3cfe.js +5 -0
  157. package/_standalone/.next/static/chunks/app/help/page-2325d25b6846ca07.js +1 -0
  158. package/_standalone/.next/static/chunks/app/{layout-9378c1c8d3e5761b.js → layout-42cdbce19f404567.js} +34 -34
  159. package/_standalone/.next/static/chunks/app/{page-9bae420fbbdc5fff.js → page-8c9643b649e01735.js} +1 -1
  160. package/_standalone/.next/static/chunks/app/setup/page-d158b8cb533feb1e.js +1 -0
  161. package/_standalone/.next/static/chunks/app/trash/{page-b61ef2d5cd4f8d73.js → page-e9ab74ffeb96af41.js} +1 -1
  162. package/_standalone/.next/static/chunks/app/view/[...path]/page-764a69a1c8bd4eef.js +12 -0
  163. package/_standalone/.next/static/chunks/{webpack-c28c55d0a6021a6b.js → webpack-7b276daaa930d480.js} +1 -1
  164. package/_standalone/.next/static/css/bc9179074eaf65ae.css +1 -0
  165. package/_standalone/.next/trace +63 -63
  166. package/_standalone/__tests__/api/mcp-install.test.ts +23 -0
  167. package/_standalone/__tests__/cli/agent-routing.test.ts +232 -0
  168. package/_standalone/__tests__/cli/file-subcommands.test.ts +379 -0
  169. package/_standalone/__tests__/core/tools.test.ts +3 -6
  170. package/_standalone/components/FileTree.tsx +3 -2
  171. package/_standalone/components/MarkdownView.tsx +30 -15
  172. package/_standalone/components/RightAskPanel.tsx +36 -6
  173. package/_standalone/components/Sidebar.tsx +3 -3
  174. package/_standalone/components/agents/AgentsMcpSection.tsx +3 -0
  175. package/_standalone/components/settings/McpAgentInstall.tsx +94 -27
  176. package/_standalone/components/settings/McpSkillsSection.tsx +1 -1
  177. package/_standalone/components/settings/McpTab.tsx +484 -340
  178. package/_standalone/components/settings/SettingsContent.tsx +12 -6
  179. package/_standalone/components/settings/types.ts +3 -0
  180. package/_standalone/components/setup/StepAgents.tsx +113 -47
  181. package/_standalone/components/setup/StepReview.tsx +14 -27
  182. package/_standalone/components/setup/types.ts +6 -0
  183. package/_standalone/data/skills/mindos/SKILL.md +92 -92
  184. package/_standalone/data/skills/mindos/references/write-supplement.md +119 -0
  185. package/_standalone/data/skills/mindos-zh/SKILL.md +100 -104
  186. package/_standalone/data/skills/mindos-zh/references/write-supplement.md +119 -0
  187. package/_standalone/lib/i18n/modules/features.ts +4 -4
  188. package/_standalone/lib/i18n/modules/knowledge.ts +4 -0
  189. package/_standalone/lib/i18n/modules/onboarding.ts +40 -30
  190. package/_standalone/lib/i18n/modules/settings.ts +78 -6
  191. package/_standalone/lib/mcp-snippets.ts +5 -1
  192. package/_standalone/tsconfig.tsbuildinfo +1 -1
  193. package/app/app/api/ask/route.ts +3 -2
  194. package/app/app/api/mcp/install/route.ts +2 -1
  195. package/app/app/api/mcp/status/route.ts +14 -6
  196. package/app/app/view/[...path]/ViewPageClient.tsx +12 -27
  197. package/app/components/FileTree.tsx +3 -2
  198. package/app/components/MarkdownView.tsx +30 -15
  199. package/app/components/RightAskPanel.tsx +36 -6
  200. package/app/components/Sidebar.tsx +3 -3
  201. package/app/components/agents/AgentsMcpSection.tsx +3 -0
  202. package/app/components/help/HelpContent.tsx +1 -0
  203. package/app/components/settings/McpAgentInstall.tsx +94 -27
  204. package/app/components/settings/McpSkillsSection.tsx +1 -1
  205. package/app/components/settings/McpTab.tsx +484 -340
  206. package/app/components/settings/SettingsContent.tsx +12 -6
  207. package/app/components/settings/types.ts +3 -0
  208. package/app/components/setup/StepAgents.tsx +113 -47
  209. package/app/components/setup/StepReview.tsx +14 -27
  210. package/app/components/setup/index.tsx +12 -11
  211. package/app/components/setup/types.ts +6 -0
  212. package/app/data/skills/mindos/SKILL.md +92 -92
  213. package/app/data/skills/mindos/references/write-supplement.md +119 -0
  214. package/app/data/skills/mindos-zh/SKILL.md +100 -104
  215. package/app/data/skills/mindos-zh/references/write-supplement.md +119 -0
  216. package/app/lib/fs.ts +0 -6
  217. package/app/lib/i18n/modules/features.ts +4 -4
  218. package/app/lib/i18n/modules/knowledge.ts +4 -0
  219. package/app/lib/i18n/modules/onboarding.ts +40 -30
  220. package/app/lib/i18n/modules/settings.ts +78 -6
  221. package/app/lib/mcp-agents.ts +1 -2
  222. package/app/lib/mcp-snippets.ts +5 -1
  223. package/app/lib/renderers/index.ts +2 -1
  224. package/bin/cli.js +168 -1404
  225. package/bin/commands/agent.js +156 -20
  226. package/bin/commands/api.js +14 -11
  227. package/bin/commands/ask.js +79 -68
  228. package/bin/commands/build.js +26 -0
  229. package/bin/commands/config.js +170 -0
  230. package/bin/commands/dev.js +58 -0
  231. package/bin/commands/doctor.js +205 -0
  232. package/bin/commands/file.js +551 -36
  233. package/bin/commands/gateway.js +42 -0
  234. package/bin/commands/init-skills.js +56 -0
  235. package/bin/commands/logs.js +32 -0
  236. package/bin/commands/mcp-cmd.js +57 -0
  237. package/bin/commands/onboard.js +25 -0
  238. package/bin/commands/open.js +41 -0
  239. package/bin/commands/restart.js +48 -0
  240. package/bin/commands/search.js +16 -14
  241. package/bin/commands/space.js +96 -25
  242. package/bin/commands/start.js +262 -0
  243. package/bin/commands/status.js +2 -2
  244. package/bin/commands/stop.js +14 -0
  245. package/bin/commands/sync-cmd.js +134 -0
  246. package/bin/commands/token.js +98 -0
  247. package/bin/commands/uninstall.js +154 -0
  248. package/bin/commands/update.js +286 -0
  249. package/bin/lib/build.js +1 -1
  250. package/bin/lib/colors.js +8 -7
  251. package/bin/lib/command.js +37 -96
  252. package/bin/lib/config.js +5 -0
  253. package/bin/lib/csv.js +19 -0
  254. package/bin/lib/jsonc.js +12 -0
  255. package/bin/lib/markdown.js +69 -0
  256. package/bin/lib/mcp-agents.js +1 -6
  257. package/bin/lib/mcp-build.js +1 -1
  258. package/bin/lib/mcp-install.js +2 -1
  259. package/bin/lib/one-shot.js +88 -0
  260. package/bin/lib/path-expand.js +9 -0
  261. package/bin/lib/remote.js +65 -0
  262. package/bin/lib/repl.js +167 -0
  263. package/bin/lib/{utils.js → shell.js} +10 -26
  264. package/bin/lib/skill-check.js +1 -1
  265. package/bin/lib/sse-stream.js +167 -0
  266. package/package.json +2 -2
  267. package/scripts/setup.js +182 -120
  268. package/skills/mindos/SKILL.md +92 -92
  269. package/skills/mindos-zh/SKILL.md +100 -104
  270. package/_standalone/.next/server/chunks/1955.js +0 -11
  271. package/_standalone/.next/server/chunks/3680.js +0 -1
  272. package/_standalone/.next/server/chunks/4497.js +0 -219
  273. package/_standalone/.next/server/chunks/5560.js +0 -2
  274. package/_standalone/.next/static/chunks/1053-0adaccc98a752a58.js +0 -29
  275. package/_standalone/.next/static/chunks/3637.f9a42cca59fd5bb5.js +0 -1
  276. package/_standalone/.next/static/chunks/4563-c2afaeacb241d1d0.js +0 -6
  277. package/_standalone/.next/static/chunks/6090-c98268ca726a68d3.js +0 -1
  278. package/_standalone/.next/static/chunks/9371-575600301da5d6bb.js +0 -1
  279. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-3e08abb495ecd5fd.js +0 -1
  280. package/_standalone/.next/static/chunks/app/agents/page-e7e0f87ad3d765ac.js +0 -5
  281. package/_standalone/.next/static/chunks/app/help/page-3d0e1ceaa4abc243.js +0 -1
  282. package/_standalone/.next/static/chunks/app/setup/page-99ed3d1bb6b8f4ef.js +0 -1
  283. package/_standalone/.next/static/chunks/app/view/[...path]/page-44fa78cbea613a78.js +0 -12
  284. package/_standalone/.next/static/css/d300701f384db50d.css +0 -1
  285. package/_standalone/components/renderers/agent-inspector/manifest.ts +0 -16
  286. /package/_standalone/.next/static/{rZLs1krFuduixvcVNe6q3 → Ij3PFh-a0zi5K_ANoSAW0}/_buildManifest.js +0 -0
  287. /package/_standalone/.next/static/{rZLs1krFuduixvcVNe6q3 → Ij3PFh-a0zi5K_ANoSAW0}/_ssgManifest.js +0 -0
@@ -30,6 +30,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
30
30
  const router = useRouter();
31
31
  const saveTimer = useRef<ReturnType<typeof setTimeout>>(undefined);
32
32
  const dataLoaded = useRef(false);
33
+ const contentRef = useRef<HTMLDivElement>(null);
33
34
 
34
35
  const [font, setFont] = useState('lora');
35
36
  const [fontSize, setFontSize] = useState('15px');
@@ -77,9 +78,14 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
77
78
  }, [visible, isPanel]);
78
79
 
79
80
  useEffect(() => {
80
- if (visible && initialTab) setTab(initialTab);
81
+ if (visible && initialTab) switchTab(initialTab);
81
82
  }, [visible, initialTab]);
82
83
 
84
+ const switchTab = useCallback((id: Tab) => {
85
+ setTab(id);
86
+ contentRef.current?.scrollTo?.(0, 0);
87
+ }, []);
88
+
83
89
  useEffect(() => {
84
90
  const fontMap: Record<string, string> = {
85
91
  'lora': "'Lora', Georgia, serif",
@@ -164,7 +170,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
164
170
 
165
171
  const TABS: { id: Tab; label: string; icon: React.ReactNode; badge?: boolean }[] = [
166
172
  { id: 'ai', label: t.settings.tabs.ai, icon: <Sparkles size={iconSize} /> },
167
- { id: 'mcp', label: t.settings.tabs.mcp ?? 'MCP & Skills', icon: <Plug size={iconSize} /> },
173
+ { id: 'mcp', label: t.settings.tabs.mcp ?? 'Connections', icon: <Plug size={iconSize} /> },
168
174
  { id: 'knowledge', label: t.settings.tabs.knowledge, icon: <Settings size={iconSize} /> },
169
175
  { id: 'appearance', label: t.settings.tabs.appearance, icon: <Palette size={iconSize} /> },
170
176
  { id: 'sync', label: t.settings.tabs.sync ?? 'Sync', icon: <RefreshCw size={iconSize} /> },
@@ -176,7 +182,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
176
182
 
177
183
  /* ── Shared content & footer ── */
178
184
  const renderContent = () => (
179
- <div className={`flex-1 overflow-y-auto min-h-0 ${isPanel ? 'px-4 py-4 space-y-4' : 'px-5 py-5 space-y-5'}`}>
185
+ <div ref={contentRef} className={`flex-1 overflow-y-auto min-h-0 ${isPanel ? 'px-4 py-4 space-y-4' : 'px-5 py-5 space-y-5'}`}>
180
186
  {status === 'load-error' && (tab === 'ai' || tab === 'knowledge') ? (
181
187
  <div className="flex flex-col items-center gap-2 py-8 text-center">
182
188
  <AlertCircle size={isPanel ? 18 : 20} className="text-destructive" />
@@ -257,7 +263,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
257
263
  {TABS.map(tabItem => (
258
264
  <button
259
265
  key={tabItem.id}
260
- onClick={() => setTab(tabItem.id)}
266
+ onClick={() => switchTab(tabItem.id)}
261
267
  className={`flex items-center gap-1 px-2 py-2 text-xs font-medium transition-colors border-b-2 -mb-px whitespace-nowrap ${
262
268
  tab === tabItem.id
263
269
  ? 'border-[var(--amber)] text-foreground'
@@ -308,7 +314,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
308
314
  {TABS.map(tabItem => (
309
315
  <button
310
316
  key={tabItem.id}
311
- onClick={() => setTab(tabItem.id)}
317
+ onClick={() => switchTab(tabItem.id)}
312
318
  className={`flex items-center gap-1.5 px-3 py-2.5 text-sm font-medium transition-colors border-b-2 -mb-px whitespace-nowrap ${
313
319
  tab === tabItem.id
314
320
  ? 'border-[var(--amber)] text-foreground'
@@ -344,7 +350,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
344
350
  {TABS.map(tabItem => (
345
351
  <button
346
352
  key={tabItem.id}
347
- onClick={() => setTab(tabItem.id)}
353
+ onClick={() => switchTab(tabItem.id)}
348
354
  className={`flex items-center gap-2 w-full px-4 py-2 text-sm font-medium transition-colors relative ${
349
355
  tab === tabItem.id
350
356
  ? 'text-foreground bg-muted'
@@ -66,6 +66,7 @@ export interface McpStatus {
66
66
  authConfigured: boolean;
67
67
  maskedToken?: string;
68
68
  authToken?: string;
69
+ localIP?: string | null;
69
70
  }
70
71
 
71
72
  export interface AgentInfo {
@@ -177,6 +178,8 @@ export interface McpAgentInstallProps {
177
178
  agents: AgentInfo[];
178
179
  t: Messages;
179
180
  onRefresh: () => void;
181
+ mode?: 'cli' | 'mcp';
182
+ activeSkillName?: string;
180
183
  }
181
184
 
182
185
  export interface McpSkillsSectionProps {
@@ -2,16 +2,18 @@
2
2
 
3
3
  import { useState, useMemo } from 'react';
4
4
  import {
5
- Loader2, CheckCircle2, XCircle, Brain, ChevronDown,
5
+ Loader2, CheckCircle2, XCircle, Brain, ChevronDown, Terminal, Plug,
6
6
  } from 'lucide-react';
7
7
  import { Field, Select } from '@/components/settings/Primitives';
8
- import type { SetupMessages, McpMessages, Template, AgentEntry, AgentInstallStatus } from './types';
8
+ import type { SetupMessages, McpMessages, AgentEntry, AgentInstallStatus, ConnectionMode } from './types';
9
9
 
10
10
  export interface StepAgentsProps {
11
11
  agents: AgentEntry[];
12
12
  agentsLoading: boolean;
13
13
  selectedAgents: Set<string>;
14
14
  setSelectedAgents: React.Dispatch<React.SetStateAction<Set<string>>>;
15
+ connectionMode: ConnectionMode;
16
+ setConnectionMode: React.Dispatch<React.SetStateAction<ConnectionMode>>;
15
17
  agentTransport: 'auto' | 'stdio' | 'http';
16
18
  setAgentTransport: (v: 'auto' | 'stdio' | 'http') => void;
17
19
  agentScope: 'global' | 'project';
@@ -19,13 +21,13 @@ export interface StepAgentsProps {
19
21
  agentStatuses: Record<string, AgentInstallStatus>;
20
22
  s: SetupMessages;
21
23
  settingsMcp: McpMessages;
22
- template: Template;
23
24
  }
24
25
 
25
26
  export default function StepAgents({
26
27
  agents, agentsLoading, selectedAgents, setSelectedAgents,
28
+ connectionMode, setConnectionMode,
27
29
  agentTransport, setAgentTransport, agentScope, setAgentScope,
28
- agentStatuses, s, settingsMcp, template,
30
+ agentStatuses, s, settingsMcp,
29
31
  }: StepAgentsProps) {
30
32
  const toggleAgent = (key: string) => {
31
33
  setSelectedAgents(prev => {
@@ -105,17 +107,82 @@ export default function StepAgents({
105
107
  disabled={agentStatuses[agent.key]?.state === 'installing'}
106
108
  />
107
109
  <span className="text-sm flex-1" style={{ color: 'var(--foreground)' }}>{agent.name}</span>
108
- <span className="text-2xs px-1.5 py-0.5 rounded font-mono"
109
- style={{ background: 'color-mix(in srgb, var(--muted-foreground) 8%, transparent)', color: 'var(--muted-foreground)' }}>
110
- {getEffectiveTransport(agent)}
111
- </span>
110
+ {connectionMode.mcp && (
111
+ <span className="text-2xs px-1.5 py-0.5 rounded font-mono"
112
+ style={{ background: 'color-mix(in srgb, var(--muted-foreground) 8%, transparent)', color: 'var(--muted-foreground)' }}>
113
+ {getEffectiveTransport(agent)}
114
+ </span>
115
+ )}
112
116
  {getStatusBadge(agent.key, agent)}
113
117
  </label>
114
118
  );
115
119
 
116
120
  return (
117
121
  <div className="space-y-5">
118
- <p className="text-sm" style={{ color: 'var(--muted-foreground)' }}>{s.agentToolsHint}</p>
122
+ {/* Connection Mode Toggle */}
123
+ <div className="space-y-2">
124
+ <p className="text-xs font-medium" style={{ color: 'var(--muted-foreground)' }}>
125
+ {s.connectionModeTitle}
126
+ </p>
127
+ <div className="grid grid-cols-2 gap-3">
128
+ <label
129
+ className="flex items-start gap-3 px-4 py-3 rounded-xl border cursor-pointer transition-all"
130
+ style={{
131
+ borderColor: connectionMode.cli ? 'var(--amber)' : 'var(--border)',
132
+ background: connectionMode.cli ? 'color-mix(in srgb, var(--amber) 6%, transparent)' : 'transparent',
133
+ }}>
134
+ <input
135
+ type="checkbox"
136
+ checked={connectionMode.cli}
137
+ onChange={() => setConnectionMode(prev => ({ ...prev, cli: !prev.cli }))}
138
+ className="form-check mt-0.5"
139
+ />
140
+ <div className="flex-1 min-w-0">
141
+ <div className="flex items-center gap-1.5 text-sm font-medium" style={{ color: 'var(--foreground)' }}>
142
+ <Terminal size={13} className="shrink-0" /> CLI
143
+ </div>
144
+ <p className="text-2xs mt-0.5" style={{ color: 'var(--muted-foreground)' }}>
145
+ {s.connectionModeCliHint}
146
+ </p>
147
+ </div>
148
+ </label>
149
+ <label
150
+ className="flex items-start gap-3 px-4 py-3 rounded-xl border cursor-pointer transition-all"
151
+ style={{
152
+ borderColor: connectionMode.mcp ? 'var(--amber)' : 'var(--border)',
153
+ background: connectionMode.mcp ? 'color-mix(in srgb, var(--amber) 6%, transparent)' : 'transparent',
154
+ }}>
155
+ <input
156
+ type="checkbox"
157
+ checked={connectionMode.mcp}
158
+ onChange={() => setConnectionMode(prev => ({ ...prev, mcp: !prev.mcp }))}
159
+ className="form-check mt-0.5"
160
+ />
161
+ <div className="flex-1 min-w-0">
162
+ <div className="flex items-center gap-1.5 text-sm font-medium" style={{ color: 'var(--foreground)' }}>
163
+ <Plug size={13} className="shrink-0" /> MCP
164
+ </div>
165
+ <p className="text-2xs mt-0.5" style={{ color: 'var(--muted-foreground)' }}>
166
+ {s.connectionModeMcpHint}
167
+ </p>
168
+ </div>
169
+ </label>
170
+ </div>
171
+ </div>
172
+
173
+ {/* Hint — contextual based on connection mode */}
174
+ {!connectionMode.cli && !connectionMode.mcp ? (
175
+ <div className="flex items-center gap-2 px-3 py-2.5 rounded-lg text-xs"
176
+ style={{ background: 'color-mix(in srgb, var(--amber) 8%, transparent)', color: 'var(--amber)' }}>
177
+ <Brain size={13} className="shrink-0" />
178
+ <span>{s.agentToolsHintNone}</span>
179
+ </div>
180
+ ) : (
181
+ <p className="text-sm" style={{ color: 'var(--muted-foreground)' }}>
182
+ {!connectionMode.mcp && connectionMode.cli ? s.agentToolsHintCliOnly : s.agentToolsHint}
183
+ </p>
184
+ )}
185
+
119
186
  {agentsLoading ? (
120
187
  <div className="flex items-center gap-2 py-4" style={{ color: 'var(--muted-foreground)' }}>
121
188
  <Loader2 size={14} className="animate-spin" />
@@ -172,46 +239,45 @@ export default function StepAgents({
172
239
  )}
173
240
  </div>
174
241
  )}
175
- {/* Skill context + auto-install hint */}
176
- <div className="space-y-1.5">
177
- <p className="text-xs" style={{ color: 'var(--muted-foreground)' }}>
178
- {s.skillWhat}
179
- </p>
180
- <div className="flex items-center gap-2 px-3 py-2 rounded-lg text-xs"
181
- style={{ background: 'color-mix(in srgb, var(--muted-foreground) 6%, transparent)', color: 'var(--muted-foreground)' }}>
242
+ {/* Hint when no agents selected — only relevant for MCP mode */}
243
+ {connectionMode.mcp && selectedAgents.size === 0 && (
244
+ <div className="flex items-center gap-2 px-3 py-2.5 rounded-lg text-xs"
245
+ style={{ background: 'color-mix(in srgb, var(--amber) 8%, transparent)', color: 'var(--amber)' }}>
182
246
  <Brain size={13} className="shrink-0" />
183
- <span>{s.skillAutoHint(template === 'zh' ? 'mindos-zh' : 'mindos')}</span>
247
+ <span>{s.agentNoneSelected}</span>
184
248
  </div>
185
- </div>
186
- {/* Advanced options — collapsed by default */}
187
- <div>
188
- <button
189
- type="button"
190
- onClick={() => setShowAdvanced(!showAdvanced)}
191
- aria-expanded={showAdvanced}
192
- className="flex items-center gap-1.5 text-xs py-1.5 transition-colors"
193
- style={{ color: 'var(--muted-foreground)' }}>
194
- <ChevronDown size={12} className={`transition-transform ${showAdvanced ? 'rotate-180' : ''}`} />
195
- {s.agentAdvanced}
196
- </button>
197
- {showAdvanced && (
198
- <div className="grid grid-cols-2 gap-4 mt-2">
199
- <Field label={s.agentTransport}>
200
- <Select value={agentTransport} onChange={e => setAgentTransport(e.target.value as 'auto' | 'stdio' | 'http')}>
201
- <option value="auto">{s.agentTransportAuto}</option>
202
- <option value="stdio">{settingsMcp.transportStdio}</option>
203
- <option value="http">{settingsMcp.transportHttp}</option>
204
- </Select>
205
- </Field>
206
- <Field label={s.agentScope}>
207
- <Select value={agentScope} onChange={e => setAgentScope(e.target.value as 'global' | 'project')}>
208
- <option value="global">{s.agentScopeGlobal}</option>
209
- <option value="project">{s.agentScopeProject}</option>
210
- </Select>
211
- </Field>
212
- </div>
213
- )}
214
- </div>
249
+ )}
250
+ {/* Advanced options — only when MCP is enabled */}
251
+ {connectionMode.mcp && (
252
+ <div>
253
+ <button
254
+ type="button"
255
+ onClick={() => setShowAdvanced(!showAdvanced)}
256
+ aria-expanded={showAdvanced}
257
+ className="flex items-center gap-1.5 text-xs py-1.5 transition-colors"
258
+ style={{ color: 'var(--muted-foreground)' }}>
259
+ <ChevronDown size={12} className={`transition-transform ${showAdvanced ? 'rotate-180' : ''}`} />
260
+ {s.agentAdvanced}
261
+ </button>
262
+ {showAdvanced && (
263
+ <div className="grid grid-cols-2 gap-4 mt-2">
264
+ <Field label={s.agentTransport}>
265
+ <Select value={agentTransport} onChange={e => setAgentTransport(e.target.value as 'auto' | 'stdio' | 'http')}>
266
+ <option value="auto">{s.agentTransportAuto}</option>
267
+ <option value="stdio">{settingsMcp.transportStdio}</option>
268
+ <option value="http">{settingsMcp.transportHttp}</option>
269
+ </Select>
270
+ </Field>
271
+ <Field label={s.agentScope}>
272
+ <Select value={agentScope} onChange={e => setAgentScope(e.target.value as 'global' | 'project')}>
273
+ <option value="global">{s.agentScopeGlobal}</option>
274
+ <option value="project">{s.agentScopeProject}</option>
275
+ </Select>
276
+ </Field>
277
+ </div>
278
+ )}
279
+ </div>
280
+ )}
215
281
  <div className="flex gap-2 mt-1">
216
282
  <button
217
283
  type="button"
@@ -91,32 +91,34 @@ export interface StepReviewProps {
91
91
  error: string;
92
92
  needsRestart: boolean;
93
93
  s: SetupMessages;
94
- skillInstallResult: { ok?: boolean; skill?: string; error?: string } | null;
95
- setupPhase: 'review' | 'saving' | 'agents' | 'skill' | 'done';
94
+ setupPhase: 'review' | 'saving' | 'agents' | 'done';
95
+ cliEnabled: boolean;
96
+ mcpEnabled: boolean;
96
97
  }
97
98
 
98
99
  export default function StepReview({
99
100
  state, selectedAgents, agentStatuses, onRetryAgent, error, needsRestart, s,
100
- skillInstallResult, setupPhase,
101
+ setupPhase, cliEnabled, mcpEnabled,
101
102
  }: StepReviewProps) {
102
103
  const failedAgents = Object.entries(agentStatuses).filter(([, v]) => v.state === 'error');
103
104
 
104
105
  // Compact config summary (only key info)
106
+ const modeLabel = cliEnabled && mcpEnabled ? 'CLI + MCP' : cliEnabled ? 'CLI' : mcpEnabled ? 'MCP' : '—';
105
107
  const summaryRows: [string, string][] = [
106
108
  [s.kbPath, state.mindRoot],
107
109
  [s.webPort, `${state.webPort} / ${state.mcpPort}`],
108
- [s.agentToolsTitle, selectedAgents.size > 0 ? s.agentCountSummary(selectedAgents.size) : '—'],
110
+ [s.agentToolsTitle, mcpEnabled && selectedAgents.size > 0 ? `${modeLabel} · ${s.agentCountSummary(selectedAgents.size)}` : modeLabel],
109
111
  ];
110
112
 
111
- // Progress stepper phases
113
+ // Progress stepper phases — dynamically built based on selected modes
112
114
  type Phase = typeof setupPhase;
115
+ const showAgentPhase = mcpEnabled && selectedAgents.size > 0;
113
116
  const phases: { key: Phase; label: string }[] = [
114
117
  { key: 'saving', label: s.phaseSaving },
115
- { key: 'agents', label: s.phaseAgents },
116
- { key: 'skill', label: s.phaseSkill },
118
+ ...(showAgentPhase ? [{ key: 'agents' as Phase, label: s.phaseAgents }] : []),
117
119
  { key: 'done', label: s.phaseDone },
118
120
  ];
119
- const phaseOrder: Phase[] = ['saving', 'agents', 'skill', 'done'];
121
+ const phaseOrder: Phase[] = phases.map(p => p.key);
120
122
  const currentIdx = phaseOrder.indexOf(setupPhase);
121
123
 
122
124
  return (
@@ -198,21 +200,6 @@ export default function StepReview({
198
200
  </div>
199
201
  )}
200
202
 
201
- {/* Skill result — compact */}
202
- {skillInstallResult && setupPhase === 'done' && (
203
- <div className="flex items-center gap-2 text-xs px-3 py-2 rounded-lg" style={{
204
- background: skillInstallResult.ok ? 'color-mix(in srgb, var(--success) 6%, transparent)' : 'color-mix(in srgb, var(--error) 6%, transparent)',
205
- }}>
206
- {skillInstallResult.ok ? (
207
- <><CheckCircle2 size={11} className="text-success shrink-0" />
208
- <span style={{ color: 'var(--foreground)' }}>{s.skillInstalled} — {skillInstallResult.skill}</span></>
209
- ) : (
210
- <><XCircle size={11} className="text-error shrink-0" />
211
- <span style={{ color: 'var(--error)' }}>{s.skillFailed}{skillInstallResult.error ? `: ${skillInstallResult.error}` : ''}</span></>
212
- )}
213
- </div>
214
- )}
215
-
216
203
  {error && (
217
204
  <div className="p-3 rounded-lg text-sm text-error" style={{ background: 'color-mix(in srgb, var(--error) 10%, transparent)' }}>
218
205
  {s.completeFailed}: {error}
@@ -300,13 +287,13 @@ function HealthCheckView({ state, selectedAgents, agentStatuses, needsRestart, s
300
287
  {
301
288
  ok: agentsOk,
302
289
  icon: <Plug size={14} />,
303
- title: s.healthAgents ?? 'Agent Tools',
290
+ title: s.healthAgents ?? 'Agent Connection',
304
291
  detail: agentsOk
305
292
  ? (s.healthAgentsOk?.(successAgents) ?? `${successAgents} agent(s) configured`)
306
293
  : selectedAgents.size > 0
307
294
  ? (s.healthAgentsPartial ?? 'Configuration in progress...')
308
295
  : (s.healthAgentsNone ?? 'No agents configured'),
309
- action: agentsOk ? undefined : (s.healthAgentsAction ?? 'You can add agents later in Settings → MCP.'),
296
+ action: agentsOk ? undefined : (s.healthAgentsAction ?? 'You can add agents later in Settings → Connections.'),
310
297
  },
311
298
  ];
312
299
 
@@ -350,7 +337,7 @@ function HealthCheckView({ state, selectedAgents, agentStatuses, needsRestart, s
350
337
  <div className="rounded-xl border p-4 space-y-2" style={{ borderColor: 'var(--border)', background: 'var(--card)' }}>
351
338
  <div className="flex items-center gap-1.5 text-xs font-medium uppercase tracking-wider" style={{ color: 'var(--muted-foreground)' }}>
352
339
  <Shield size={11} />
353
- {s.healthTokenTitle ?? 'MCP Auth Token'}
340
+ {s.healthTokenTitle ?? 'Auth Token'}
354
341
  </div>
355
342
  <div className="flex items-center gap-2">
356
343
  <div className="flex-1 flex items-center px-3 py-2 rounded-lg min-h-[38px]"
@@ -373,7 +360,7 @@ function HealthCheckView({ state, selectedAgents, agentStatuses, needsRestart, s
373
360
  </button>
374
361
  </div>
375
362
  <p className="text-xs" style={{ color: 'var(--muted-foreground)' }}>
376
- {s.healthTokenHint ?? 'Use this token when connecting AI agents. Also available in Settings → MCP.'}
363
+ {s.healthTokenHint ?? 'Use this token when connecting AI agents. Also available in Settings → Connections.'}
377
364
  </p>
378
365
  </div>
379
366
  )}
@@ -28,6 +28,12 @@ export interface SetupState {
28
28
  webPassword: string;
29
29
  }
30
30
 
31
+ // ─── Connection mode (CLI / MCP toggle) ──────────────────────────────────────
32
+ export interface ConnectionMode {
33
+ cli: boolean;
34
+ mcp: boolean;
35
+ }
36
+
31
37
  // ─── Port check ──────────────────────────────────────────────────────────────
32
38
  export interface PortStatus {
33
39
  checking: boolean;