@geminilight/mindos 0.6.40 → 0.6.42

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 (422) 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 +17 -16
  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/routes-manifest.json +6 -0
  11. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error.html +2 -2
  14. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  22. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js +2 -2
  28. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/ask/route.js +1 -1
  41. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  42. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  46. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  48. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  50. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  52. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  55. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  57. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  59. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  60. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  61. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  63. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  66. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/mcp/install/route.js +1 -1
  72. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/mcp/install-skill/route.js.nft.json +1 -1
  74. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
  77. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/mcp/uninstall/route.js +1 -0
  79. package/_standalone/.next/server/app/api/mcp/uninstall/route.js.nft.json +1 -0
  80. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -0
  81. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  82. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  84. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  91. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/skills/route.js +4 -4
  99. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  102. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  108. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/changes/page.js +1 -1
  110. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  111. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  113. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  114. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/echo/page.js +1 -1
  116. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  117. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/explore/page.js +1 -1
  119. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  120. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/help/page.js +2 -2
  122. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/login/page.js +1 -1
  125. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/page.js +2 -2
  128. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  129. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/setup/page.js +2 -2
  131. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/trash/page.js +3 -3
  134. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  137. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  138. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app-paths-manifest.json +17 -16
  140. package/_standalone/.next/server/chunks/1550.js +1 -1
  141. package/_standalone/.next/server/chunks/2190.js +11 -0
  142. package/_standalone/.next/server/chunks/{6365.js → 3262.js} +2 -2
  143. package/_standalone/.next/server/chunks/5648.js +2 -0
  144. package/_standalone/.next/server/chunks/6539.js +1 -1
  145. package/_standalone/.next/server/chunks/8388.js +1 -1
  146. package/_standalone/.next/server/chunks/953.js +1 -1
  147. package/_standalone/.next/server/chunks/9539.js +219 -0
  148. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  149. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  150. package/_standalone/.next/server/next-font-manifest.js +1 -1
  151. package/_standalone/.next/server/next-font-manifest.json +1 -1
  152. package/_standalone/.next/server/pages/500.html +2 -2
  153. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  154. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  155. package/_standalone/.next/static/GB-YReQ58tsvCuwlzrkMZ/_buildManifest.js +1 -0
  156. package/_standalone/.next/static/chunks/1053-67f0ce444d1227e2.js +29 -0
  157. package/_standalone/.next/static/chunks/{8663-de911d2d395622be.js → 1880-c2a9e76201841c86.js} +1 -1
  158. package/_standalone/.next/static/chunks/3637.0541ac2d0ea7de1f.js +1 -0
  159. package/_standalone/.next/static/chunks/4563-b2a2ce80aff845af.js +6 -0
  160. package/_standalone/.next/static/chunks/6981-3d7dcac2d12a5670.js +1 -0
  161. package/_standalone/.next/static/chunks/7144-5febf62f1a79fe64.js +1 -0
  162. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-84943536516b00b2.js +1 -0
  163. package/_standalone/.next/static/chunks/app/_global-error/page-84943536516b00b2.js +1 -0
  164. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-773071a99c4daac2.js +1 -0
  165. package/_standalone/.next/static/chunks/app/agents/page-eac6c5f6650dbf62.js +5 -0
  166. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-84943536516b00b2.js +1 -0
  167. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-84943536516b00b2.js +1 -0
  168. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-84943536516b00b2.js +1 -0
  169. package/_standalone/.next/static/chunks/app/api/a2a/route-84943536516b00b2.js +1 -0
  170. package/_standalone/.next/static/chunks/app/api/acp/config/route-84943536516b00b2.js +1 -0
  171. package/_standalone/.next/static/chunks/app/api/acp/detect/route-84943536516b00b2.js +1 -0
  172. package/_standalone/.next/static/chunks/app/api/acp/install/route-84943536516b00b2.js +1 -0
  173. package/_standalone/.next/static/chunks/app/api/acp/registry/route-84943536516b00b2.js +1 -0
  174. package/_standalone/.next/static/chunks/app/api/acp/session/route-84943536516b00b2.js +1 -0
  175. package/_standalone/.next/static/chunks/app/api/agent-activity/route-84943536516b00b2.js +1 -0
  176. package/_standalone/.next/static/chunks/app/api/ask/route-84943536516b00b2.js +1 -0
  177. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-84943536516b00b2.js +1 -0
  178. package/_standalone/.next/static/chunks/app/api/auth/route-84943536516b00b2.js +1 -0
  179. package/_standalone/.next/static/chunks/app/api/backlinks/route-84943536516b00b2.js +1 -0
  180. package/_standalone/.next/static/chunks/app/api/bootstrap/route-84943536516b00b2.js +1 -0
  181. package/_standalone/.next/static/chunks/app/api/changes/route-84943536516b00b2.js +1 -0
  182. package/_standalone/.next/static/chunks/app/api/export/route-84943536516b00b2.js +1 -0
  183. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-84943536516b00b2.js +1 -0
  184. package/_standalone/.next/static/chunks/app/api/file/import/route-84943536516b00b2.js +1 -0
  185. package/_standalone/.next/static/chunks/app/api/file/route-84943536516b00b2.js +1 -0
  186. package/_standalone/.next/static/chunks/app/api/files/route-84943536516b00b2.js +1 -0
  187. package/_standalone/.next/static/chunks/app/api/git/route-84943536516b00b2.js +1 -0
  188. package/_standalone/.next/static/chunks/app/api/graph/route-84943536516b00b2.js +1 -0
  189. package/_standalone/.next/static/chunks/app/api/health/route-84943536516b00b2.js +1 -0
  190. package/_standalone/.next/static/chunks/app/api/inbox/route-84943536516b00b2.js +1 -0
  191. package/_standalone/.next/static/chunks/app/api/init/route-84943536516b00b2.js +1 -0
  192. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-84943536516b00b2.js +1 -0
  193. package/_standalone/.next/static/chunks/app/api/mcp/install/route-84943536516b00b2.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-84943536516b00b2.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-84943536516b00b2.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/mcp/status/route-84943536516b00b2.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-84943536516b00b2.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/monitoring/route-84943536516b00b2.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/recent-files/route-84943536516b00b2.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/restart/route-84943536516b00b2.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/search/route-84943536516b00b2.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-84943536516b00b2.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-84943536516b00b2.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/settings/route-84943536516b00b2.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-84943536516b00b2.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-84943536516b00b2.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-84943536516b00b2.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-84943536516b00b2.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/setup/ls/route-84943536516b00b2.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/setup/route-84943536516b00b2.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/skills/route-84943536516b00b2.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/sync/route-84943536516b00b2.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/tree-version/route-84943536516b00b2.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/uninstall/route-84943536516b00b2.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/update/route-84943536516b00b2.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/update-check/route-84943536516b00b2.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/update-status/route-84943536516b00b2.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/workflows/route-84943536516b00b2.js +1 -0
  219. package/_standalone/.next/static/chunks/app/echo/page-84943536516b00b2.js +1 -0
  220. package/_standalone/.next/static/chunks/app/help/page-2325d25b6846ca07.js +1 -0
  221. package/_standalone/.next/static/chunks/app/{layout-9378c1c8d3e5761b.js → layout-7cb442df92212140.js} +55 -55
  222. package/_standalone/.next/static/chunks/app/{page-9bae420fbbdc5fff.js → page-aaee2d9bd3d3eabb.js} +1 -1
  223. package/_standalone/.next/static/chunks/app/setup/page-6132ea7632e08a9b.js +1 -0
  224. package/_standalone/.next/static/chunks/app/trash/{page-b61ef2d5cd4f8d73.js → page-7b5cbf541c315db2.js} +1 -1
  225. package/_standalone/.next/static/chunks/app/view/[...path]/loading-84943536516b00b2.js +1 -0
  226. package/_standalone/.next/static/chunks/app/view/[...path]/page-b72e4f88c8c48181.js +12 -0
  227. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-84943536516b00b2.js +1 -0
  228. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-84943536516b00b2.js +1 -0
  229. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-84943536516b00b2.js +1 -0
  230. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-84943536516b00b2.js +1 -0
  231. package/_standalone/.next/static/chunks/{webpack-c28c55d0a6021a6b.js → webpack-7b276daaa930d480.js} +1 -1
  232. package/_standalone/.next/static/css/bc9179074eaf65ae.css +1 -0
  233. package/_standalone/.next/trace +63 -63
  234. package/_standalone/.next/types/routes.d.ts +2 -1
  235. package/_standalone/.next/types/validator.ts +9 -0
  236. package/_standalone/__tests__/api/mcp-install.test.ts +23 -0
  237. package/_standalone/__tests__/cli/agent-routing.test.ts +232 -0
  238. package/_standalone/__tests__/cli/file-subcommands.test.ts +379 -0
  239. package/_standalone/__tests__/core/tools.test.ts +3 -6
  240. package/_standalone/components/FileTree.tsx +3 -2
  241. package/_standalone/components/MarkdownView.tsx +30 -15
  242. package/_standalone/components/RightAskPanel.tsx +36 -6
  243. package/_standalone/components/Sidebar.tsx +3 -3
  244. package/_standalone/components/agents/AgentsMcpSection.tsx +27 -5
  245. package/_standalone/components/settings/McpAgentInstall.tsx +94 -27
  246. package/_standalone/components/settings/McpSkillsSection.tsx +1 -1
  247. package/_standalone/components/settings/McpTab.tsx +484 -340
  248. package/_standalone/components/settings/SettingsContent.tsx +12 -6
  249. package/_standalone/components/settings/types.ts +3 -0
  250. package/_standalone/components/setup/StepAgents.tsx +113 -47
  251. package/_standalone/components/setup/StepReview.tsx +14 -27
  252. package/_standalone/components/setup/types.ts +7 -0
  253. package/_standalone/data/skills/mindos/SKILL.md +92 -92
  254. package/_standalone/data/skills/mindos/references/write-supplement.md +119 -0
  255. package/_standalone/data/skills/mindos-zh/SKILL.md +100 -104
  256. package/_standalone/data/skills/mindos-zh/references/write-supplement.md +119 -0
  257. package/_standalone/lib/i18n/modules/features.ts +4 -4
  258. package/_standalone/lib/i18n/modules/knowledge.ts +4 -0
  259. package/_standalone/lib/i18n/modules/onboarding.ts +40 -30
  260. package/_standalone/lib/i18n/modules/panels.ts +6 -2
  261. package/_standalone/lib/i18n/modules/settings.ts +78 -6
  262. package/_standalone/lib/mcp-snippets.ts +5 -1
  263. package/_standalone/tsconfig.tsbuildinfo +1 -1
  264. package/app/app/api/ask/route.ts +3 -2
  265. package/app/app/api/mcp/install/route.ts +15 -3
  266. package/app/app/api/mcp/status/route.ts +14 -6
  267. package/app/app/api/mcp/uninstall/route.ts +130 -0
  268. package/app/app/api/skills/route.ts +14 -1
  269. package/app/app/view/[...path]/ViewPageClient.tsx +12 -27
  270. package/app/components/FileTree.tsx +3 -2
  271. package/app/components/MarkdownView.tsx +30 -15
  272. package/app/components/RightAskPanel.tsx +36 -6
  273. package/app/components/Sidebar.tsx +3 -3
  274. package/app/components/agents/AgentsMcpSection.tsx +27 -5
  275. package/app/components/help/HelpContent.tsx +1 -0
  276. package/app/components/settings/McpAgentInstall.tsx +94 -27
  277. package/app/components/settings/McpSkillsSection.tsx +1 -1
  278. package/app/components/settings/McpTab.tsx +484 -340
  279. package/app/components/settings/SettingsContent.tsx +12 -6
  280. package/app/components/settings/types.ts +3 -0
  281. package/app/components/setup/StepAgents.tsx +113 -47
  282. package/app/components/setup/StepReview.tsx +14 -27
  283. package/app/components/setup/index.tsx +16 -14
  284. package/app/components/setup/types.ts +7 -0
  285. package/app/data/skills/mindos/SKILL.md +92 -92
  286. package/app/data/skills/mindos/references/write-supplement.md +119 -0
  287. package/app/data/skills/mindos-zh/SKILL.md +100 -104
  288. package/app/data/skills/mindos-zh/references/write-supplement.md +119 -0
  289. package/app/lib/fs.ts +0 -6
  290. package/app/lib/i18n/modules/features.ts +4 -4
  291. package/app/lib/i18n/modules/knowledge.ts +4 -0
  292. package/app/lib/i18n/modules/onboarding.ts +40 -30
  293. package/app/lib/i18n/modules/panels.ts +6 -2
  294. package/app/lib/i18n/modules/settings.ts +78 -6
  295. package/app/lib/mcp-agents.ts +1 -2
  296. package/app/lib/mcp-snippets.ts +5 -1
  297. package/app/lib/renderers/index.ts +2 -1
  298. package/app/lib/settings.ts +32 -0
  299. package/bin/cli.js +168 -1404
  300. package/bin/commands/agent.js +156 -20
  301. package/bin/commands/api.js +14 -11
  302. package/bin/commands/ask.js +79 -68
  303. package/bin/commands/build.js +26 -0
  304. package/bin/commands/config.js +170 -0
  305. package/bin/commands/dev.js +58 -0
  306. package/bin/commands/doctor.js +205 -0
  307. package/bin/commands/file.js +551 -36
  308. package/bin/commands/gateway.js +42 -0
  309. package/bin/commands/init-skills.js +56 -0
  310. package/bin/commands/logs.js +32 -0
  311. package/bin/commands/mcp-cmd.js +57 -0
  312. package/bin/commands/onboard.js +25 -0
  313. package/bin/commands/open.js +41 -0
  314. package/bin/commands/restart.js +48 -0
  315. package/bin/commands/search.js +16 -14
  316. package/bin/commands/space.js +96 -25
  317. package/bin/commands/start.js +272 -0
  318. package/bin/commands/status.js +2 -2
  319. package/bin/commands/stop.js +14 -0
  320. package/bin/commands/sync-cmd.js +134 -0
  321. package/bin/commands/token.js +98 -0
  322. package/bin/commands/uninstall.js +154 -0
  323. package/bin/commands/update.js +286 -0
  324. package/bin/lib/build.js +1 -1
  325. package/bin/lib/colors.js +8 -7
  326. package/bin/lib/command.js +37 -96
  327. package/bin/lib/config.js +5 -0
  328. package/bin/lib/csv.js +19 -0
  329. package/bin/lib/jsonc.js +12 -0
  330. package/bin/lib/markdown.js +69 -0
  331. package/bin/lib/mcp-agents.js +1 -6
  332. package/bin/lib/mcp-build.js +1 -1
  333. package/bin/lib/mcp-install.js +2 -1
  334. package/bin/lib/one-shot.js +88 -0
  335. package/bin/lib/path-expand.js +9 -0
  336. package/bin/lib/remote.js +65 -0
  337. package/bin/lib/repl.js +167 -0
  338. package/bin/lib/{utils.js → shell.js} +10 -26
  339. package/bin/lib/skill-check.js +116 -21
  340. package/bin/lib/sse-stream.js +167 -0
  341. package/package.json +2 -2
  342. package/scripts/setup.js +210 -120
  343. package/skills/mindos/SKILL.md +94 -95
  344. package/skills/mindos-zh/SKILL.md +103 -106
  345. package/_standalone/.next/server/chunks/1955.js +0 -11
  346. package/_standalone/.next/server/chunks/3680.js +0 -1
  347. package/_standalone/.next/server/chunks/4497.js +0 -219
  348. package/_standalone/.next/server/chunks/5560.js +0 -2
  349. package/_standalone/.next/static/chunks/1053-0adaccc98a752a58.js +0 -29
  350. package/_standalone/.next/static/chunks/3637.f9a42cca59fd5bb5.js +0 -1
  351. package/_standalone/.next/static/chunks/4563-c2afaeacb241d1d0.js +0 -6
  352. package/_standalone/.next/static/chunks/6090-c98268ca726a68d3.js +0 -1
  353. package/_standalone/.next/static/chunks/9371-575600301da5d6bb.js +0 -1
  354. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-400c3c09b1540c14.js +0 -1
  355. package/_standalone/.next/static/chunks/app/_global-error/page-400c3c09b1540c14.js +0 -1
  356. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-3e08abb495ecd5fd.js +0 -1
  357. package/_standalone/.next/static/chunks/app/agents/page-e7e0f87ad3d765ac.js +0 -5
  358. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-400c3c09b1540c14.js +0 -1
  359. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-400c3c09b1540c14.js +0 -1
  360. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-400c3c09b1540c14.js +0 -1
  361. package/_standalone/.next/static/chunks/app/api/a2a/route-400c3c09b1540c14.js +0 -1
  362. package/_standalone/.next/static/chunks/app/api/acp/config/route-400c3c09b1540c14.js +0 -1
  363. package/_standalone/.next/static/chunks/app/api/acp/detect/route-400c3c09b1540c14.js +0 -1
  364. package/_standalone/.next/static/chunks/app/api/acp/install/route-400c3c09b1540c14.js +0 -1
  365. package/_standalone/.next/static/chunks/app/api/acp/registry/route-400c3c09b1540c14.js +0 -1
  366. package/_standalone/.next/static/chunks/app/api/acp/session/route-400c3c09b1540c14.js +0 -1
  367. package/_standalone/.next/static/chunks/app/api/agent-activity/route-400c3c09b1540c14.js +0 -1
  368. package/_standalone/.next/static/chunks/app/api/ask/route-400c3c09b1540c14.js +0 -1
  369. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-400c3c09b1540c14.js +0 -1
  370. package/_standalone/.next/static/chunks/app/api/auth/route-400c3c09b1540c14.js +0 -1
  371. package/_standalone/.next/static/chunks/app/api/backlinks/route-400c3c09b1540c14.js +0 -1
  372. package/_standalone/.next/static/chunks/app/api/bootstrap/route-400c3c09b1540c14.js +0 -1
  373. package/_standalone/.next/static/chunks/app/api/changes/route-400c3c09b1540c14.js +0 -1
  374. package/_standalone/.next/static/chunks/app/api/export/route-400c3c09b1540c14.js +0 -1
  375. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-400c3c09b1540c14.js +0 -1
  376. package/_standalone/.next/static/chunks/app/api/file/import/route-400c3c09b1540c14.js +0 -1
  377. package/_standalone/.next/static/chunks/app/api/file/route-400c3c09b1540c14.js +0 -1
  378. package/_standalone/.next/static/chunks/app/api/files/route-400c3c09b1540c14.js +0 -1
  379. package/_standalone/.next/static/chunks/app/api/git/route-400c3c09b1540c14.js +0 -1
  380. package/_standalone/.next/static/chunks/app/api/graph/route-400c3c09b1540c14.js +0 -1
  381. package/_standalone/.next/static/chunks/app/api/health/route-400c3c09b1540c14.js +0 -1
  382. package/_standalone/.next/static/chunks/app/api/inbox/route-400c3c09b1540c14.js +0 -1
  383. package/_standalone/.next/static/chunks/app/api/init/route-400c3c09b1540c14.js +0 -1
  384. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-400c3c09b1540c14.js +0 -1
  385. package/_standalone/.next/static/chunks/app/api/mcp/install/route-400c3c09b1540c14.js +0 -1
  386. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-400c3c09b1540c14.js +0 -1
  387. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-400c3c09b1540c14.js +0 -1
  388. package/_standalone/.next/static/chunks/app/api/mcp/status/route-400c3c09b1540c14.js +0 -1
  389. package/_standalone/.next/static/chunks/app/api/monitoring/route-400c3c09b1540c14.js +0 -1
  390. package/_standalone/.next/static/chunks/app/api/recent-files/route-400c3c09b1540c14.js +0 -1
  391. package/_standalone/.next/static/chunks/app/api/restart/route-400c3c09b1540c14.js +0 -1
  392. package/_standalone/.next/static/chunks/app/api/search/route-400c3c09b1540c14.js +0 -1
  393. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-400c3c09b1540c14.js +0 -1
  394. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-400c3c09b1540c14.js +0 -1
  395. package/_standalone/.next/static/chunks/app/api/settings/route-400c3c09b1540c14.js +0 -1
  396. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-400c3c09b1540c14.js +0 -1
  397. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-400c3c09b1540c14.js +0 -1
  398. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-400c3c09b1540c14.js +0 -1
  399. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-400c3c09b1540c14.js +0 -1
  400. package/_standalone/.next/static/chunks/app/api/setup/ls/route-400c3c09b1540c14.js +0 -1
  401. package/_standalone/.next/static/chunks/app/api/setup/route-400c3c09b1540c14.js +0 -1
  402. package/_standalone/.next/static/chunks/app/api/skills/route-400c3c09b1540c14.js +0 -1
  403. package/_standalone/.next/static/chunks/app/api/sync/route-400c3c09b1540c14.js +0 -1
  404. package/_standalone/.next/static/chunks/app/api/tree-version/route-400c3c09b1540c14.js +0 -1
  405. package/_standalone/.next/static/chunks/app/api/uninstall/route-400c3c09b1540c14.js +0 -1
  406. package/_standalone/.next/static/chunks/app/api/update/route-400c3c09b1540c14.js +0 -1
  407. package/_standalone/.next/static/chunks/app/api/update-check/route-400c3c09b1540c14.js +0 -1
  408. package/_standalone/.next/static/chunks/app/api/update-status/route-400c3c09b1540c14.js +0 -1
  409. package/_standalone/.next/static/chunks/app/api/workflows/route-400c3c09b1540c14.js +0 -1
  410. package/_standalone/.next/static/chunks/app/echo/page-400c3c09b1540c14.js +0 -1
  411. package/_standalone/.next/static/chunks/app/help/page-3d0e1ceaa4abc243.js +0 -1
  412. package/_standalone/.next/static/chunks/app/setup/page-99ed3d1bb6b8f4ef.js +0 -1
  413. package/_standalone/.next/static/chunks/app/view/[...path]/loading-400c3c09b1540c14.js +0 -1
  414. package/_standalone/.next/static/chunks/app/view/[...path]/page-44fa78cbea613a78.js +0 -12
  415. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-400c3c09b1540c14.js +0 -1
  416. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-400c3c09b1540c14.js +0 -1
  417. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-400c3c09b1540c14.js +0 -1
  418. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-400c3c09b1540c14.js +0 -1
  419. package/_standalone/.next/static/css/d300701f384db50d.css +0 -1
  420. package/_standalone/.next/static/rZLs1krFuduixvcVNe6q3/_buildManifest.js +0 -1
  421. package/_standalone/components/renderers/agent-inspector/manifest.ts +0 -16
  422. /package/_standalone/.next/static/{rZLs1krFuduixvcVNe6q3 → GB-YReQ58tsvCuwlzrkMZ}/_ssgManifest.js +0 -0
@@ -0,0 +1,167 @@
1
+ /**
2
+ * SSE streaming client for CLI → /api/ask
3
+ *
4
+ * Handles the text/event-stream protocol emitted by the MindOS Ask API.
5
+ * Supports text_delta, thinking_delta, tool_start, tool_end, done, error, status events.
6
+ */
7
+
8
+ import { dim, cyan, red } from './colors.js';
9
+
10
+ /**
11
+ * Stream an SSE response from /api/ask and print to stdout.
12
+ *
13
+ * @param {Response} res - fetch Response with Content-Type: text/event-stream
14
+ * @param {object} opts
15
+ * @param {boolean} [opts.showTools=true] - Show tool call / result lines
16
+ * @param {boolean} [opts.json=false] - Collect full output and return as object instead of printing
17
+ * @returns {Promise<{ text: string, toolCalls: string[], error?: string }>}
18
+ */
19
+ export async function streamSSE(res, opts = {}) {
20
+ const { showTools = true, json = false } = opts;
21
+ const decoder = new TextDecoder();
22
+ if (!res.body) {
23
+ return { text: '', toolCalls: [], error: 'Empty response body' };
24
+ }
25
+ const reader = res.body.getReader();
26
+
27
+ let textBuffer = '';
28
+ const toolCalls = [];
29
+ let error = null;
30
+ let buffer = '';
31
+ let firstTextPrinted = false;
32
+
33
+ try {
34
+ while (true) {
35
+ const { done, value } = await reader.read();
36
+ if (done) break;
37
+
38
+ buffer += decoder.decode(value, { stream: true });
39
+
40
+ const lines = buffer.split('\n');
41
+ // Keep the last incomplete line in buffer
42
+ buffer = lines.pop() || '';
43
+
44
+ for (const line of lines) {
45
+ if (!line.startsWith('data:')) continue;
46
+ const payload = line.slice(5);
47
+ if (!payload) continue;
48
+
49
+ let event;
50
+ try {
51
+ event = JSON.parse(payload);
52
+ } catch {
53
+ continue;
54
+ }
55
+
56
+ if (event.type === 'text_delta') {
57
+ if (!firstTextPrinted && !json) {
58
+ // Clear "Thinking..." spinner
59
+ process.stdout.write('\r\x1b[K');
60
+ firstTextPrinted = true;
61
+ }
62
+ textBuffer += event.text;
63
+ if (!json) process.stdout.write(event.text);
64
+ }
65
+
66
+ if (event.type === 'thinking_delta') {
67
+ // Suppress thinking in CLI output (it's internal reasoning)
68
+ }
69
+
70
+ if (event.type === 'tool_start' && showTools && !json) {
71
+ if (!firstTextPrinted) {
72
+ process.stdout.write('\r\x1b[K');
73
+ firstTextPrinted = true;
74
+ }
75
+ const name = event.name || 'unknown';
76
+ const inputSnippet = event.input
77
+ ? JSON.stringify(event.input).slice(0, 80)
78
+ : '';
79
+ const toolLine = `\n ${dim('[')}${cyan('tool')}${dim(']')} ${name}${inputSnippet ? dim(': ' + inputSnippet) : ''}`;
80
+ process.stdout.write(toolLine);
81
+ toolCalls.push(name);
82
+ }
83
+
84
+ if (event.type === 'tool_end' && showTools && !json) {
85
+ const result = event.result || '';
86
+ const preview = typeof result === 'string'
87
+ ? result.slice(0, 120)
88
+ : JSON.stringify(result).slice(0, 120);
89
+ if (preview) {
90
+ process.stdout.write(dim(' → ' + preview));
91
+ }
92
+ process.stdout.write('\n');
93
+ }
94
+
95
+ if (event.type === 'status' && !json) {
96
+ if (!firstTextPrinted) {
97
+ process.stdout.write('\r\x1b[K');
98
+ firstTextPrinted = true;
99
+ }
100
+ process.stdout.write(dim(` [${event.message || 'processing'}]\n`));
101
+ }
102
+
103
+ if (event.type === 'error') {
104
+ error = event.message || event.error || 'Unknown error';
105
+ if (!json) {
106
+ if (!firstTextPrinted) {
107
+ process.stdout.write('\r\x1b[K');
108
+ }
109
+ process.stderr.write('\n' + red('Error: ' + error) + '\n');
110
+ }
111
+ }
112
+
113
+ if (event.type === 'done') {
114
+ // Stream complete
115
+ }
116
+ }
117
+ }
118
+ } catch (err) {
119
+ if (!json && !firstTextPrinted) {
120
+ process.stdout.write('\r\x1b[K');
121
+ }
122
+ error = err.message || 'Stream interrupted';
123
+ if (!json) {
124
+ if (textBuffer) process.stdout.write('\n');
125
+ process.stderr.write(red('Error: ' + error) + '\n');
126
+ }
127
+ }
128
+
129
+ if (!json && textBuffer && !textBuffer.endsWith('\n')) {
130
+ process.stdout.write('\n');
131
+ }
132
+
133
+ return { text: textBuffer, toolCalls, error };
134
+ }
135
+
136
+ /**
137
+ * POST to /api/ask with proper headers and message format.
138
+ *
139
+ * @param {string} baseUrl - e.g. http://localhost:3456
140
+ * @param {object} body - { messages, mode, attachedFiles, maxSteps, ... }
141
+ * @param {string} [token] - Auth token
142
+ * @returns {Promise<Response>}
143
+ */
144
+ export async function postAsk(baseUrl, body, token) {
145
+ const headers = { 'Content-Type': 'application/json' };
146
+ if (token) headers['Authorization'] = `Bearer ${token}`;
147
+
148
+ return fetch(`${baseUrl}/api/ask`, {
149
+ method: 'POST',
150
+ headers,
151
+ body: JSON.stringify(body),
152
+ });
153
+ }
154
+
155
+ /**
156
+ * Check if MindOS is running by hitting /api/health.
157
+ * @param {string} baseUrl
158
+ * @returns {Promise<boolean>}
159
+ */
160
+ export async function checkHealth(baseUrl) {
161
+ try {
162
+ const res = await fetch(`${baseUrl}/api/health`);
163
+ return res.ok;
164
+ } catch {
165
+ return false;
166
+ }
167
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geminilight/mindos",
3
- "version": "0.6.40",
3
+ "version": "0.6.42",
4
4
  "description": "MindOS — Human-Agent Collaborative Mind System. Local-first knowledge base that syncs your mind to all AI Agents via MCP.",
5
5
  "keywords": [
6
6
  "mindos",
@@ -19,7 +19,7 @@
19
19
  "type": "git",
20
20
  "url": "https://github.com/GeminiLight/MindOS"
21
21
  },
22
- "homepage": "https://mindos.app",
22
+ "homepage": "https://mindos.you",
23
23
  "bugs": {
24
24
  "url": "https://github.com/GeminiLight/MindOS/issues"
25
25
  },
package/scripts/setup.js CHANGED
@@ -55,8 +55,8 @@ const T = {
55
55
  // step labels
56
56
  step: { en: (n, total) => `Step ${n}/${total}`, zh: (n, total) => `步骤 ${n}/${total}` },
57
57
  stepTitles: {
58
- en: ['Knowledge Base', 'AI Provider', 'Ports', 'Auth Token', 'Web Password', 'Start Mode', 'Agent Tools'],
59
- zh: ['知识库', 'AI 服务商', '端口', 'Auth Token', 'Web 密码', '启动方式', 'Agent 工具'],
58
+ en: ['Knowledge Base', 'AI Provider', 'Ports', 'Auth Token', 'Web Password', 'Start Mode', 'Connection Mode', 'Agent Connection'],
59
+ zh: ['知识库', 'AI 服务商', '端口', 'Auth Token', 'Web 密码', '启动方式', '连接模式', 'Agent 连接'],
60
60
  },
61
61
 
62
62
  // path
@@ -125,20 +125,16 @@ const T = {
125
125
  syncSetup: { en: 'Set up cross-device sync via Git?', zh: '是否配置 Git 跨设备同步?' },
126
126
  syncLater: { en: ' → Run `mindos sync init` anytime to set up sync later.', zh: ' → 随时运行 `mindos sync init` 配置同步。' },
127
127
 
128
- // mcp install step
129
- mcpStepTitle: { en: 'Agent Tools (MCP)', zh: 'Agent 工具 (MCP)' },
130
- mcpStepHint: { en: 'Select AI agents to configure with MindOS MCP (Space to toggle, A for all, Enter to confirm).\nAgents not yet installed can be pre-configured — they will work once you install the app.', zh: '选择要配置 MindOS MCP 的 AI Agent(空格切换,A 全选,Enter 确认)。\n未安装的 Agent 可以预先配置,安装应用后即可生效。' },
131
- mcpInstalling: { en: (n) => `⏳ Configuring ${n} agent(s)...`, zh: (n) => `⏳ 正在配置 ${n} 个 Agent...` },
132
- mcpInstallOk: { en: (name, path) => ` ${c.green('✔')} ${name} ${c.dim('→ ' + path)}`, zh: (name, path) => ` ${c.green('✔')} ${name} ${c.dim('→ ' + path)}` },
133
- mcpInstallFail: { en: (name, msg) => ` ${c.red('✘')} ${name} ${c.dim(msg)}`, zh: (name, msg) => ` ${c.red('✘')} ${name} ${c.dim(msg)}` },
134
- mcpInstallDone: { en: (n) => `✔ ${n} agent(s) configured`, zh: (n) => `✔ 已配置 ${n} 个 Agent` },
135
- mcpSkipped: { en: ' → Skipped. Run `mindos mcp install` anytime to configure agents.', zh: ' → 已跳过。随时运行 `mindos mcp install` 配置 Agent。' },
136
-
137
- // skill install step
138
- skillInstalling: { en: (name) => `⏳ Installing Skill "${name}"...`, zh: (name) => `⏳ 正在安装 Skill "${name}"...` },
139
- skillInstallOk: { en: (name) => ` ${c.green('✔')} Skill "${name}" installed`, zh: (name) => ` ${c.green('✔')} Skill "${name}" 已安装` },
140
- skillInstallFail: { en: (name, msg) => ` ${c.red('✘')} Skill "${name}" failed: ${msg}`, zh: (name, msg) => ` ${c.red('✘')} Skill "${name}" 安装失败:${msg}` },
141
- skillSkipped: { en: ' → No agents selected, skill install skipped.', zh: ' → 未选择 Agent,跳过 Skill 安装。' },
128
+ // mode selection step (Step 7)
129
+ modeSelectHint: { en: 'Connection mode (Space to toggle, Enter to confirm):', zh: '连接模式(空格切换,Enter 确认):' },
130
+ modeCli: { en: 'CLI Operate KB via command line', zh: 'CLI 通过命令行操作知识库' },
131
+ modeCliHint: { en: 'recommended, more token-efficient', zh: '推荐,更省 token' },
132
+ modeMcp: { en: 'MCP Connect via MCP protocol', zh: 'MCP 通过 MCP 协议连接' },
133
+ modeMcpHint: { en: 'optional, may consume more tokens', zh: '可选,可能消耗更多 token' },
134
+ modeNoneError: { en: 'Please select at least one mode.', zh: '请至少选择一种模式。' },
135
+
136
+ // agent config install (internal, Skill concept hidden from user)
137
+ skillInstallFail: { en: (name, msg) => ` ${c.red('✘')} Configuration failed: ${msg}`, zh: (name, msg) => ` ${c.red('✘')} 配置失败:${msg}` },
142
138
 
143
139
  // restart prompts (re-onboard with config changes)
144
140
  restartRequired: { en: 'Config changed. Service restart required.', zh: '配置已变更,需要重启服务。' },
@@ -151,14 +147,14 @@ const T = {
151
147
  '─────────────────────────────────────────────',
152
148
  '🚀 Setup complete! Start MindOS:\n',
153
149
  ` ${c.cyan(cmd)}`,
154
- ` ${c.dim('MCP config, auth token, and skills info will be shown on startup.')}\n`,
150
+ ` ${c.dim('Connection details and auth token will be shown on startup.')}\n`,
155
151
  '─────────────────────────────────────────────',
156
152
  ],
157
153
  zh: (cmd) => [
158
154
  '─────────────────────────────────────────────',
159
155
  '🚀 初始化完成!启动 MindOS:\n',
160
156
  ` ${c.cyan(cmd)}`,
161
- ` ${c.dim('MCP 配置、Auth token、Skills 信息将在启动后显示。')}\n`,
157
+ ` ${c.dim('连接信息和 Auth token 将在启动后显示。')}\n`,
162
158
  '─────────────────────────────────────────────',
163
159
  ],
164
160
  },
@@ -217,7 +213,7 @@ const tf = (key, ...args) => {
217
213
 
218
214
  // ── Step header ───────────────────────────────────────────────────────────────
219
215
 
220
- const TOTAL_STEPS = 7;
216
+ const TOTAL_STEPS = 8;
221
217
  function stepHeader(n) {
222
218
  const title = T.stepTitles[uiLang][n - 1] ?? T.stepTitles.en[n - 1];
223
219
  const stepLabel = tf('step', n, TOTAL_STEPS);
@@ -598,10 +594,11 @@ function expandHomePath(p) {
598
594
  return p.startsWith('~/') ? resolve(homedir(), p.slice(2)) : p;
599
595
  }
600
596
 
601
- /** Parse JSONC: JSON plus line // comments and slash-star block comments (e.g. VS Code configs). */
597
+ /** Parse JSONC: JSON plus comments (e.g. VS Code configs). Returns {} for empty input. */
602
598
  function parseJsonc(text) {
603
599
  let stripped = text.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*$)/gm, (m, g) => g ? '' : m);
604
600
  stripped = stripped.replace(/\/\*[\s\S]*?\*\//g, '');
601
+ if (!stripped.trim()) return {};
605
602
  return JSON.parse(stripped);
606
603
  }
607
604
 
@@ -622,14 +619,79 @@ function isAgentInstalled(agentKey) {
622
619
  }
623
620
 
624
621
  /**
625
- * Step 8: interactive multi-select of agents to configure, then install.
626
- * Uses the same interactiveMultiSelect as mcp-install.js (re-implemented inline
627
- * because this script uses its own raw-mode helpers).
622
+ * Step 7: mode selection CLI (default-on) vs MCP (default-off).
623
+ * Returns { cli: boolean, mcp: boolean }.
628
624
  */
629
- async function runMcpInstallStep(mcpPort, authToken) {
625
+ async function runModeSelect() {
626
+ const modes = [
627
+ { key: 'cli', label: t('modeCli'), hint: t('modeCliHint'), preselect: true },
628
+ { key: 'mcp', label: t('modeMcp'), hint: t('modeMcpHint'), preselect: false },
629
+ ];
630
+
631
+ return new Promise((resolve) => {
632
+ let cursor = 0;
633
+ const chosen = new Set(modes.map((m, i) => m.preselect ? i : -1).filter(i => i >= 0));
634
+
635
+ const render = (first = false, errMsg = '') => {
636
+ if (!first) write(`\x1b[${modes.length + (errMsg ? 3 : 2)}A\x1b[J`);
637
+ write(`${c.bold(t('modeSelectHint'))}\n`);
638
+ for (let i = 0; i < modes.length; i++) {
639
+ const m = modes[i];
640
+ const check = chosen.has(i) ? c.green('✔') : c.dim('○');
641
+ const pointer = i === cursor ? c.cyan('❯') : ' ';
642
+ const label = i === cursor ? (chosen.has(i) ? c.green(m.label) : c.cyan(m.label)) : (chosen.has(i) ? c.green(m.label) : m.label);
643
+ write(` ${pointer} ${check} ${label} ${c.dim('(' + m.hint + ')')}\n`);
644
+ }
645
+ if (errMsg) {
646
+ write(` ${c.yellow('⚠ ' + errMsg)}\n`);
647
+ }
648
+ write(c.dim(` ${chosen.size} ${uiLang === 'zh' ? '已选' : 'selected'}\n`));
649
+ };
650
+
651
+ write('\n');
652
+ render(true);
653
+
654
+ process.stdin.setRawMode(true);
655
+ process.stdin.resume();
656
+ process.stdin.setEncoding('utf8');
657
+
658
+ const onKey = (key) => {
659
+ if (key === '\x03') { cleanup(); process.exit(1); }
660
+ if (key === `${ESC}[A`) { cursor = (cursor - 1 + modes.length) % modes.length; render(); }
661
+ else if (key === `${ESC}[B`) { cursor = (cursor + 1) % modes.length; render(); }
662
+ else if (key === ' ') {
663
+ if (chosen.has(cursor)) chosen.delete(cursor); else chosen.add(cursor);
664
+ render();
665
+ } else if (key === '\r' || key === '\n') {
666
+ if (chosen.size === 0) {
667
+ render(false, t('modeNoneError'));
668
+ return;
669
+ }
670
+ cleanup();
671
+ resolve({
672
+ cli: chosen.has(0),
673
+ mcp: chosen.has(1),
674
+ });
675
+ }
676
+ };
677
+
678
+ const cleanup = () => {
679
+ process.stdin.removeListener('data', onKey);
680
+ process.stdin.setRawMode(false);
681
+ process.stdin.pause();
682
+ };
683
+
684
+ process.stdin.on('data', onKey);
685
+ });
686
+ }
687
+
688
+ /**
689
+ * Agent multi-select UI — shared by both CLI-only and MCP modes.
690
+ * Returns array of selected agent keys.
691
+ */
692
+ async function runAgentSelect() {
630
693
  const keys = Object.keys(MCP_AGENTS);
631
694
 
632
- // Build options with installed/detected status shown as hint
633
695
  const options = keys.map(k => {
634
696
  const installed = isAgentInstalled(k);
635
697
  const present = detectAgentPresence(k);
@@ -641,89 +703,82 @@ async function runMcpInstallStep(mcpPort, authToken) {
641
703
  };
642
704
  });
643
705
 
644
- // Sort: configured > detected > not found (stable within each group)
645
706
  options.sort((a, b) => {
646
707
  const rank = (o) => o.hint.includes('configured') || o.hint.includes('已配置') ? 0 : o.preselect ? 1 : 2;
647
708
  return rank(a) - rank(b);
648
709
  });
649
710
 
650
- // Multi-select using raw mode
651
- const selected = await (async () => {
652
- return new Promise((resolveSelected) => {
653
- let cursor = 0;
654
- const chosen = new Set(options.map((o, i) => o.preselect ? i : -1).filter(i => i >= 0));
655
-
656
- const render = (first = false) => {
657
- if (!first) write(`\x1b[${options.length + 2}A\x1b[J`);
658
- write(`${c.bold(uiLang === 'zh' ? '选择 Agent:' : 'Select agents:')} ${c.dim(uiLang === 'zh' ? '(↑↓ 移动 空格 切换 D 已检测 A 全选 Enter 确认)' : '(↑↓ move Space toggle D detected A all Enter confirm)')}\n`);
659
- for (let i = 0; i < options.length; i++) {
660
- const o = options[i];
661
- const check = chosen.has(i) ? c.green('✔') : c.dim('○');
662
- const pointer = i === cursor ? c.cyan('') : ' ';
663
- const label = i === cursor ? (chosen.has(i) ? c.green(o.label) : c.cyan(o.label)) : (chosen.has(i) ? c.green(o.label) : o.label);
664
- write(` ${pointer} ${check} ${label} ${c.dim('(' + o.hint + ')')}\n`);
665
- }
666
- write(c.dim(` ${chosen.size} ${uiLang === 'zh' ? '已选' : 'selected'}\n`));
667
- };
711
+ const selected = await new Promise((resolveSelected) => {
712
+ let cursor = 0;
713
+ const chosen = new Set(options.map((o, i) => o.preselect ? i : -1).filter(i => i >= 0));
714
+
715
+ const render = (first = false) => {
716
+ if (!first) write(`\x1b[${options.length + 2}A\x1b[J`);
717
+ write(`${c.bold(uiLang === 'zh' ? '选择 Agent:' : 'Select agents:')} ${c.dim(uiLang === 'zh' ? '(↑↓ 移动 空格 切换 D 已检测 A 全选 Enter 确认)' : '(↑↓ move Space toggle D detected A all Enter confirm)')}\n`);
718
+ for (let i = 0; i < options.length; i++) {
719
+ const o = options[i];
720
+ const check = chosen.has(i) ? c.green('✔') : c.dim('○');
721
+ const pointer = i === cursor ? c.cyan('❯') : ' ';
722
+ const label = i === cursor ? (chosen.has(i) ? c.green(o.label) : c.cyan(o.label)) : (chosen.has(i) ? c.green(o.label) : o.label);
723
+ write(` ${pointer} ${check} ${label} ${c.dim('(' + o.hint + ')')}\n`);
724
+ }
725
+ write(c.dim(` ${chosen.size} ${uiLang === 'zh' ? '已选' : 'selected'}\n`));
726
+ };
668
727
 
669
- write('\n');
670
- render(true);
671
-
672
- process.stdin.setRawMode(true);
673
- process.stdin.resume();
674
- process.stdin.setEncoding('utf8');
675
-
676
- const onKey = (key) => {
677
- if (key === '\x03') { cleanup(); process.exit(1); }
678
- if (key === `${ESC}[A`) { cursor = (cursor - 1 + options.length) % options.length; render(); }
679
- else if (key === `${ESC}[B`) { cursor = (cursor + 1) % options.length; render(); }
680
- else if (key === ' ') {
681
- if (chosen.has(cursor)) chosen.delete(cursor); else chosen.add(cursor);
682
- render();
683
- } else if (key === 'a' || key === 'A') {
684
- if (chosen.size === options.length) chosen.clear();
685
- else options.forEach((_, i) => chosen.add(i));
686
- render();
687
- } else if (key === 'd' || key === 'D') {
688
- // Select only detected/configured agents
689
- chosen.clear();
690
- options.forEach((o, i) => { if (o.preselect) chosen.add(i); });
691
- render();
692
- } else if (key === '\r' || key === '\n') {
693
- cleanup();
694
- resolveSelected([...chosen].sort().map(i => options[i].value));
695
- }
696
- };
728
+ write('\n');
729
+ render(true);
730
+
731
+ process.stdin.setRawMode(true);
732
+ process.stdin.resume();
733
+ process.stdin.setEncoding('utf8');
734
+
735
+ const onKey = (key) => {
736
+ if (key === '\x03') { cleanup(); process.exit(1); }
737
+ if (key === `${ESC}[A`) { cursor = (cursor - 1 + options.length) % options.length; render(); }
738
+ else if (key === `${ESC}[B`) { cursor = (cursor + 1) % options.length; render(); }
739
+ else if (key === ' ') {
740
+ if (chosen.has(cursor)) chosen.delete(cursor); else chosen.add(cursor);
741
+ render();
742
+ } else if (key === 'a' || key === 'A') {
743
+ if (chosen.size === options.length) chosen.clear();
744
+ else options.forEach((_, i) => chosen.add(i));
745
+ render();
746
+ } else if (key === 'd' || key === 'D') {
747
+ chosen.clear();
748
+ options.forEach((o, i) => { if (o.preselect) chosen.add(i); });
749
+ render();
750
+ } else if (key === '\r' || key === '\n') {
751
+ cleanup();
752
+ resolveSelected([...chosen].sort().map(i => options[i].value));
753
+ }
754
+ };
697
755
 
698
- const cleanup = () => {
699
- process.stdin.removeListener('data', onKey);
700
- process.stdin.setRawMode(false);
701
- process.stdin.pause();
702
- };
756
+ const cleanup = () => {
757
+ process.stdin.removeListener('data', onKey);
758
+ process.stdin.setRawMode(false);
759
+ process.stdin.pause();
760
+ };
703
761
 
704
- process.stdin.on('data', onKey);
705
- });
706
- })();
762
+ process.stdin.on('data', onKey);
763
+ });
707
764
 
708
765
  if (selected.length === 0) {
709
- write(c.dim(t('mcpSkipped') + '\n'));
710
- return [];
766
+ write(c.dim(uiLang === 'zh' ? ' → 未选择 Agent。\n' : ' → No agents selected.\n'));
711
767
  }
768
+ return selected;
769
+ }
712
770
 
713
- write('\n' + c.dim(tf('mcpInstalling', selected.length) + '\n'));
714
-
715
- // stdio entry (same as mcp-install.js)
771
+ /**
772
+ * Write MCP config into selected agents' config files.
773
+ * Agent selection is handled separately by runAgentSelect().
774
+ */
775
+ function installMcpConfig(selected, mcpPort, authToken) {
716
776
  const entry = { type: 'stdio', command: 'mindos', args: ['mcp'], env: { MCP_TRANSPORT: 'stdio' } };
717
- let okCount = 0;
718
777
 
719
778
  for (const agentKey of selected) {
720
779
  const agent = MCP_AGENTS[agentKey];
721
- // prefer global scope; fall back to project
722
780
  const cfgPath = agent.global || agent.project;
723
- if (!cfgPath) {
724
- write(tf('mcpInstallFail', agent.name, 'no config path') + '\n');
725
- continue;
726
- }
781
+ if (!cfgPath) continue;
727
782
  const abs = expandHomePath(cfgPath);
728
783
  try {
729
784
  let config = {};
@@ -733,15 +788,8 @@ async function runMcpInstallStep(mcpPort, authToken) {
733
788
  const dir = resolve(abs, '..');
734
789
  if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
735
790
  writeFileSync(abs, JSON.stringify(config, null, 2) + '\n', 'utf-8');
736
- write(tf('mcpInstallOk', agent.name, cfgPath) + '\n');
737
- okCount++;
738
- } catch (err) {
739
- write(tf('mcpInstallFail', agent.name, String(err)) + '\n');
740
- }
791
+ } catch { /* logged by caller via agent count */ }
741
792
  }
742
-
743
- console.log(`\n${c.green(tf('mcpInstallDone', okCount))}`);
744
- return selected;
745
793
  }
746
794
 
747
795
  /* ── Skill auto-install ────────────────────────────────────────────────────── */
@@ -758,20 +806,15 @@ const SKILL_UNSUPPORTED = new Set([]);
758
806
  * @param {string[]} selectedAgents - MCP agent keys from the multi-select step
759
807
  */
760
808
  function runSkillInstallStep(template, selectedAgents) {
761
- if (!selectedAgents || selectedAgents.length === 0) {
762
- write(c.dim(t('skillSkipped') + '\n'));
763
- return;
764
- }
809
+ if (!selectedAgents || selectedAgents.length === 0) return true;
765
810
 
766
811
  const skillName = template === 'zh' ? 'mindos-zh' : 'mindos';
767
812
  const localSource = resolve(ROOT, 'skills');
768
813
  const githubSource = 'GeminiLight/MindOS';
769
814
 
770
- // Filter to non-universal, skill-capable agents
771
815
  const additionalAgents = selectedAgents
772
816
  .flatMap((key) => {
773
817
  if (SKILL_UNSUPPORTED.has(key)) return [];
774
- // Keep backward-compatibility for non-MCP universal keys.
775
818
  if (UNIVERSAL_AGENTS.has(key)) return [];
776
819
  const reg = SKILL_AGENT_REGISTRY[key];
777
820
  if (!reg) return [key];
@@ -780,18 +823,13 @@ function runSkillInstallStep(template, selectedAgents) {
780
823
  return [reg.skillAgentName || key];
781
824
  });
782
825
 
783
- // Each agent needs its own -a flag (skills CLI does NOT accept comma-separated)
784
826
  const agentFlags = additionalAgents.length > 0
785
827
  ? additionalAgents.map(a => `-a ${a}`).join(' ')
786
828
  : '-a universal';
787
829
 
788
- // Try GitHub source first, fall back to local path
789
830
  const sources = [githubSource, localSource];
790
831
 
791
- write(tf('skillInstalling', skillName) + '\n');
792
-
793
832
  for (const source of sources) {
794
- // Quote local paths for shell safety
795
833
  const quotedSource = /[/\\]/.test(source) ? `"${source}"` : source;
796
834
  const cmd = `npx skills add ${quotedSource} --skill ${skillName} ${agentFlags} -g -y`;
797
835
  try {
@@ -801,12 +839,11 @@ function runSkillInstallStep(template, selectedAgents) {
801
839
  env: { ...process.env, NODE_ENV: 'production' },
802
840
  stdio: 'pipe',
803
841
  });
804
- write(tf('skillInstallOk', skillName) + '\n');
805
- return;
842
+ return true;
806
843
  } catch { /* try next source */ }
807
844
  }
808
845
 
809
- write(tf('skillInstallFail', skillName, 'All sources failed') + '\n');
846
+ return false;
810
847
  }
811
848
 
812
849
  // ── GUI Setup ─────────────────────────────────────────────────────────────────
@@ -1230,17 +1267,42 @@ async function main() {
1230
1267
  // ── Skill rules are now built into SKILL.md — no install needed ──────────
1231
1268
  // .mindos/user-preferences.md will be created on first preference capture or via `mindos init-skills`.
1232
1269
 
1233
- // ── Step 7: MCP Agent Install ──────────────────────────────────────────────
1270
+ // ── Step 7: Connection Mode ─────────────────────────────────────────────────
1234
1271
  write('\n');
1235
1272
  stepHeader(7);
1236
- write(c.dim(tf('mcpStepHint') + '\n\n'));
1273
+ const modes = await runModeSelect();
1237
1274
 
1238
- const selectedAgents = await runMcpInstallStep(mcpPort, authToken);
1275
+ // ── Step 8: Agent Connection ────────────────────────────────────────────────
1276
+ write('\n');
1277
+ stepHeader(8);
1278
+ const selectedAgents = await runAgentSelect();
1239
1279
 
1240
- // ── Skill auto-install ────────────────────────────────────────────────────
1241
- if (selectedAgents && selectedAgents.length > 0) {
1242
- write('\n');
1243
- runSkillInstallStep(selectedTemplate, selectedAgents);
1280
+ if (selectedAgents.length > 0) {
1281
+ const agentCount = selectedAgents.length;
1282
+ write('\n' + c.dim(uiLang === 'zh'
1283
+ ? ` 正在为 ${agentCount} 个 Agent 配置连接…`
1284
+ : ` Configuring connection for ${agentCount} agent${agentCount > 1 ? 's' : ''}…`) + '\n');
1285
+
1286
+ if (modes.mcp) {
1287
+ installMcpConfig(selectedAgents, mcpPort, authToken);
1288
+ }
1289
+ const skillOk = runSkillInstallStep(selectedTemplate, selectedAgents);
1290
+
1291
+ if (skillOk) {
1292
+ write(c.green(uiLang === 'zh'
1293
+ ? ` ✔ ${agentCount} 个 Agent 已配置完成\n`
1294
+ : ` ✔ ${agentCount} agent${agentCount > 1 ? 's' : ''} configured\n`));
1295
+ } else {
1296
+ write(c.yellow(uiLang === 'zh'
1297
+ ? ` ⚠ ${agentCount} 个 Agent 配置部分完成,CLI 指令文档安装失败\n`
1298
+ : ` ⚠ ${agentCount} agent${agentCount > 1 ? 's' : ''} partially configured — CLI guide install failed\n`));
1299
+ }
1300
+
1301
+ if (!modes.mcp) {
1302
+ write(c.dim(uiLang === 'zh'
1303
+ ? ' → 如需启用 MCP 模式,随时运行 `mindos mcp install`。\n'
1304
+ : ' → To enable MCP mode later, run `mindos mcp install`.\n'));
1305
+ }
1244
1306
  }
1245
1307
 
1246
1308
  // ── Sync setup (optional) ──────────────────────────────────────────────────
@@ -1252,10 +1314,38 @@ async function main() {
1252
1314
  console.log(c.dim(t('syncLater')));
1253
1315
  }
1254
1316
 
1317
+ // ── Register CLI globally if not already in PATH ────────────────────────────
1318
+ ensureCliInPath();
1319
+
1255
1320
  const installDaemon = startMode === 'daemon' || process.argv.includes('--install-daemon');
1256
1321
  finish(mindDir, config.startMode, config.mcpPort, config.authToken, installDaemon, needsRestart, resumeCfg.port ?? 3456);
1257
1322
  }
1258
1323
 
1324
+ function ensureCliInPath() {
1325
+ try {
1326
+ execSync('command -v mindos', { stdio: 'ignore' });
1327
+ return; // already in PATH (npm -g install or previous link)
1328
+ } catch { /* not found */ }
1329
+
1330
+ // Only auto-register for source/dev installations.
1331
+ // Desktop (Electron) manages its own process; npx is ephemeral.
1332
+ const isDesktop = !!(process.env.ELECTRON_RUN_AS_NODE || process.env.MINDOS_DESKTOP);
1333
+ const isDevInstall = existsSync(resolve(ROOT, '.git'));
1334
+ if (isDesktop || !isDevInstall) return;
1335
+
1336
+ write('\n');
1337
+ try {
1338
+ execSync('npm link', { cwd: ROOT, stdio: 'ignore' });
1339
+ write(c.green(uiLang === 'zh'
1340
+ ? ' ✔ mindos CLI 已注册到全局路径\n'
1341
+ : ' ✔ mindos CLI registered globally\n'));
1342
+ } catch {
1343
+ write(c.yellow(uiLang === 'zh'
1344
+ ? ' ⚠ 无法自动注册 CLI,请手动运行:npm link\n'
1345
+ : ' ⚠ Could not register CLI automatically. Run manually: npm link\n'));
1346
+ }
1347
+ }
1348
+
1259
1349
  function getLocalIP() {
1260
1350
  for (const ifaces of Object.values(networkInterfaces())) {
1261
1351
  for (const iface of ifaces) {