@geminilight/mindos 0.6.39 → 0.6.40

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 (714) hide show
  1. package/README.md +31 -15
  2. package/README_zh.md +31 -15
  3. package/_standalone/.mindos-build-version +1 -1
  4. package/_standalone/.next/BUILD_ID +1 -1
  5. package/_standalone/.next/app-path-routes-manifest.json +18 -17
  6. package/_standalone/.next/build-manifest.json +3 -3
  7. package/_standalone/.next/cache/.previewinfo +1 -1
  8. package/_standalone/.next/cache/.rscinfo +1 -1
  9. package/_standalone/.next/cache/config.json +3 -3
  10. package/_standalone/.next/prerender-manifest.json +3 -3
  11. package/_standalone/.next/react-loadable-manifest.json +68 -6
  12. package/_standalone/.next/routes-manifest.json +6 -0
  13. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  14. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  15. package/_standalone/.next/server/app/_global-error.html +2 -2
  16. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  22. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  23. package/_standalone/.next/server/app/_not-found/page.js +2 -2
  24. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  25. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page.js +2 -2
  27. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  28. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  29. package/_standalone/.next/server/app/agents/page.js +3 -3
  30. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  31. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/config/route.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/config/route.js.nft.json +1 -1
  38. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/detect/route.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/detect/route.js.nft.json +1 -1
  41. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/acp/session/route.js +1 -1
  45. package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +1 -1
  46. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/agent-activity/route.js +1 -1
  48. package/_standalone/.next/server/app/api/agent-activity/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/ask/route.js +137 -99
  51. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  52. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/backlinks/route.js +1 -1
  56. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  57. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/bootstrap/route.js +1 -1
  59. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  60. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/changes/route.js +1 -1
  62. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  63. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/export/route.js +3 -3
  65. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  66. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/file/import/route.js +2 -19
  69. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/file/route.js +1 -18
  72. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  73. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/files/route.js +1 -1
  75. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  76. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/git/route.js +1 -1
  78. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/graph/route.js +1 -1
  81. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  82. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/inbox/route.js +1 -0
  85. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -0
  86. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -0
  87. package/_standalone/.next/server/app/api/init/route.js +1 -1
  88. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  89. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
  91. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  92. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/mcp/install/route.js +1 -1
  94. package/_standalone/.next/server/app/api/mcp/install/route.js.nft.json +1 -1
  95. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
  99. package/_standalone/.next/server/app/api/mcp/status/route.js.nft.json +1 -1
  100. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/monitoring/route.js +1 -1
  102. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/recent-files/route.js +1 -1
  105. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  106. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/search/route.js +1 -1
  109. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  110. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  112. package/_standalone/.next/server/app/api/settings/list-models/route.js.nft.json +1 -1
  113. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/settings/reset-token/route.js +1 -1
  115. package/_standalone/.next/server/app/api/settings/reset-token/route.js.nft.json +1 -1
  116. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  118. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  119. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  121. package/_standalone/.next/server/app/api/settings/test-key/route.js.nft.json +1 -1
  122. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  123. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  126. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/api/setup/route.js +1 -1
  128. package/_standalone/.next/server/app/api/setup/route.js.nft.json +1 -1
  129. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/api/skills/route.js +2 -2
  131. package/_standalone/.next/server/app/api/skills/route.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/api/sync/route.js +1 -1
  134. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  135. package/_standalone/.next/server/app/api/tree-version/route.js +1 -1
  136. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  137. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  138. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  140. package/_standalone/.next/server/app/api/update-check/route.js +1 -1
  141. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  143. package/_standalone/.next/server/app/api/workflows/route.js +2 -2
  144. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  145. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  146. package/_standalone/.next/server/app/changes/page.js +2 -2
  147. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  148. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  149. package/_standalone/.next/server/app/echo/[segment]/page.js +6 -6
  150. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  151. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  152. package/_standalone/.next/server/app/echo/page.js +2 -2
  153. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  154. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  155. package/_standalone/.next/server/app/explore/page.js +3 -3
  156. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  157. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  158. package/_standalone/.next/server/app/help/page.js +2 -2
  159. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  160. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  161. package/_standalone/.next/server/app/login/page.js +2 -2
  162. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  163. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  164. package/_standalone/.next/server/app/page.js +3 -3
  165. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  166. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  167. package/_standalone/.next/server/app/setup/page.js +2 -2
  168. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  169. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  170. package/_standalone/.next/server/app/trash/page.js +3 -3
  171. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  172. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  173. package/_standalone/.next/server/app/view/[...path]/page.js +4 -4
  174. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  175. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  176. package/_standalone/.next/server/app-paths-manifest.json +18 -17
  177. package/_standalone/.next/server/chunks/1550.js +1 -1
  178. package/_standalone/.next/server/chunks/1750.js +1 -0
  179. package/_standalone/.next/server/chunks/1955.js +11 -0
  180. package/_standalone/.next/server/chunks/3680.js +1 -0
  181. package/_standalone/.next/server/chunks/4497.js +219 -0
  182. package/_standalone/.next/server/chunks/5560.js +2 -0
  183. package/_standalone/.next/server/chunks/6365.js +52 -0
  184. package/_standalone/.next/server/chunks/6539.js +1 -1
  185. package/_standalone/.next/server/chunks/8388.js +15 -0
  186. package/_standalone/.next/server/chunks/953.js +42 -2
  187. package/_standalone/.next/server/functions-config-manifest.json +2 -1
  188. package/_standalone/.next/server/instrumentation.js +1 -1
  189. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  190. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  191. package/_standalone/.next/server/next-font-manifest.js +1 -1
  192. package/_standalone/.next/server/next-font-manifest.json +1 -1
  193. package/_standalone/.next/server/pages/500.html +2 -2
  194. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  195. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  196. package/_standalone/.next/static/chunks/1053-0adaccc98a752a58.js +29 -0
  197. package/_standalone/.next/static/chunks/1239.10a0710c2772ab34.js +1 -0
  198. package/_standalone/.next/static/chunks/{1814.e2da5460ded71d71.js → 1814.2ee1d03297c0bccd.js} +1 -1
  199. package/_standalone/.next/static/chunks/{1a258343-030e4d6735874dd4.js → 1a258343-9803591e4aaee1f6.js} +1 -1
  200. package/_standalone/.next/static/chunks/2631.dc56e83472bde281.js +1 -0
  201. package/_standalone/.next/static/chunks/2872.045858d00bd8307f.js +8 -0
  202. package/_standalone/.next/static/chunks/2968.f10ccee9e7e2324d.js +2 -0
  203. package/_standalone/.next/static/chunks/3160-83a7e0b94414b3ac.js +1 -0
  204. package/_standalone/.next/static/chunks/{3637.4bcd01a4db78b894.js → 3637.f9a42cca59fd5bb5.js} +1 -1
  205. package/_standalone/.next/static/chunks/4033.6666700547b20141.js +1 -0
  206. package/_standalone/.next/static/chunks/4563-c2afaeacb241d1d0.js +6 -0
  207. package/_standalone/.next/static/chunks/516.24ee058b1d4b1fed.js +8 -0
  208. package/_standalone/.next/static/chunks/5627.c4337d7289acb31f.js +1 -0
  209. package/_standalone/.next/static/chunks/5956.b445072b35915129.js +1 -0
  210. package/_standalone/.next/static/chunks/6090-c98268ca726a68d3.js +1 -0
  211. package/_standalone/.next/static/chunks/6357-c645842834c0d4cd.js +1 -0
  212. package/_standalone/.next/static/chunks/6826.7b7d94dd0fd83812.js +1 -0
  213. package/_standalone/.next/static/chunks/{8409-de5726a4a278d28f.js → 6926-4af497b83952fa87.js} +1 -1
  214. package/_standalone/.next/static/chunks/7266-bb7be1128eccd48e.js +13 -0
  215. package/_standalone/.next/static/chunks/7753.63831cfc54a55fbb.js +1 -0
  216. package/_standalone/.next/static/chunks/862.9f526e964489e2e5.js +1 -0
  217. package/_standalone/.next/static/chunks/{1384-55276d40a9da4e88.js → 8663-de911d2d395622be.js} +2 -2
  218. package/_standalone/.next/static/chunks/9300.118b8c840634383f.js +28 -0
  219. package/_standalone/.next/static/chunks/9371-575600301da5d6bb.js +1 -0
  220. package/_standalone/.next/static/chunks/95247769.3b5caae1c1a76ce1.js +4 -0
  221. package/_standalone/.next/static/chunks/9602-423291fdb36396d1.js +1 -0
  222. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-400c3c09b1540c14.js +1 -0
  223. package/_standalone/.next/static/chunks/app/_global-error/page-400c3c09b1540c14.js +1 -0
  224. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-3e08abb495ecd5fd.js +1 -0
  225. package/_standalone/.next/static/chunks/app/agents/page-e7e0f87ad3d765ac.js +5 -0
  226. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-400c3c09b1540c14.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-400c3c09b1540c14.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-400c3c09b1540c14.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/a2a/route-400c3c09b1540c14.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/acp/config/route-400c3c09b1540c14.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/acp/detect/route-400c3c09b1540c14.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/acp/install/route-400c3c09b1540c14.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/acp/registry/route-400c3c09b1540c14.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/acp/session/route-400c3c09b1540c14.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/agent-activity/route-400c3c09b1540c14.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/ask/route-400c3c09b1540c14.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-400c3c09b1540c14.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/auth/route-400c3c09b1540c14.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/backlinks/route-400c3c09b1540c14.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/bootstrap/route-400c3c09b1540c14.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/changes/route-400c3c09b1540c14.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/export/route-400c3c09b1540c14.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-400c3c09b1540c14.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/file/import/route-400c3c09b1540c14.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/file/route-400c3c09b1540c14.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/files/route-400c3c09b1540c14.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/git/route-400c3c09b1540c14.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/graph/route-400c3c09b1540c14.js +1 -0
  249. package/_standalone/.next/static/chunks/app/api/health/route-400c3c09b1540c14.js +1 -0
  250. package/_standalone/.next/static/chunks/app/api/inbox/route-400c3c09b1540c14.js +1 -0
  251. package/_standalone/.next/static/chunks/app/api/init/route-400c3c09b1540c14.js +1 -0
  252. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-400c3c09b1540c14.js +1 -0
  253. package/_standalone/.next/static/chunks/app/api/mcp/install/route-400c3c09b1540c14.js +1 -0
  254. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-400c3c09b1540c14.js +1 -0
  255. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-400c3c09b1540c14.js +1 -0
  256. package/_standalone/.next/static/chunks/app/api/mcp/status/route-400c3c09b1540c14.js +1 -0
  257. package/_standalone/.next/static/chunks/app/api/monitoring/route-400c3c09b1540c14.js +1 -0
  258. package/_standalone/.next/static/chunks/app/api/recent-files/route-400c3c09b1540c14.js +1 -0
  259. package/_standalone/.next/static/chunks/app/api/restart/route-400c3c09b1540c14.js +1 -0
  260. package/_standalone/.next/static/chunks/app/api/search/route-400c3c09b1540c14.js +1 -0
  261. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-400c3c09b1540c14.js +1 -0
  262. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-400c3c09b1540c14.js +1 -0
  263. package/_standalone/.next/static/chunks/app/api/settings/route-400c3c09b1540c14.js +1 -0
  264. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-400c3c09b1540c14.js +1 -0
  265. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-400c3c09b1540c14.js +1 -0
  266. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-400c3c09b1540c14.js +1 -0
  267. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-400c3c09b1540c14.js +1 -0
  268. package/_standalone/.next/static/chunks/app/api/setup/ls/route-400c3c09b1540c14.js +1 -0
  269. package/_standalone/.next/static/chunks/app/api/setup/route-400c3c09b1540c14.js +1 -0
  270. package/_standalone/.next/static/chunks/app/api/skills/route-400c3c09b1540c14.js +1 -0
  271. package/_standalone/.next/static/chunks/app/api/sync/route-400c3c09b1540c14.js +1 -0
  272. package/_standalone/.next/static/chunks/app/api/tree-version/route-400c3c09b1540c14.js +1 -0
  273. package/_standalone/.next/static/chunks/app/api/uninstall/route-400c3c09b1540c14.js +1 -0
  274. package/_standalone/.next/static/chunks/app/api/update/route-400c3c09b1540c14.js +1 -0
  275. package/_standalone/.next/static/chunks/app/api/update-check/route-400c3c09b1540c14.js +1 -0
  276. package/_standalone/.next/static/chunks/app/api/update-status/route-400c3c09b1540c14.js +1 -0
  277. package/_standalone/.next/static/chunks/app/api/workflows/route-400c3c09b1540c14.js +1 -0
  278. package/_standalone/.next/static/chunks/app/changes/page-350992cf5091bc5b.js +1 -0
  279. package/_standalone/.next/static/chunks/app/echo/[segment]/page-addf014fcf23fad5.js +11 -0
  280. package/_standalone/.next/static/chunks/app/echo/page-400c3c09b1540c14.js +1 -0
  281. package/_standalone/.next/static/chunks/app/explore/page-5eb2835e9e3ab4bb.js +4 -0
  282. package/_standalone/.next/static/chunks/app/help/page-3d0e1ceaa4abc243.js +1 -0
  283. package/_standalone/.next/static/chunks/app/layout-9378c1c8d3e5761b.js +186 -0
  284. package/_standalone/.next/static/chunks/app/login/page-24236460fa7c11d0.js +1 -0
  285. package/_standalone/.next/static/chunks/app/page-9bae420fbbdc5fff.js +7 -0
  286. package/_standalone/.next/static/chunks/app/setup/page-99ed3d1bb6b8f4ef.js +1 -0
  287. package/_standalone/.next/static/chunks/app/trash/page-b61ef2d5cd4f8d73.js +1 -0
  288. package/_standalone/.next/static/chunks/app/view/[...path]/loading-400c3c09b1540c14.js +1 -0
  289. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-61474670d6bb6116.js +1 -0
  290. package/_standalone/.next/static/chunks/app/view/[...path]/page-44fa78cbea613a78.js +12 -0
  291. package/_standalone/.next/static/chunks/e71f6c19-4df85185bf989b49.js +1 -0
  292. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-400c3c09b1540c14.js +1 -0
  293. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-400c3c09b1540c14.js +1 -0
  294. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-400c3c09b1540c14.js +1 -0
  295. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-400c3c09b1540c14.js +1 -0
  296. package/_standalone/.next/static/chunks/webpack-c28c55d0a6021a6b.js +1 -0
  297. package/_standalone/.next/static/css/d300701f384db50d.css +1 -0
  298. package/_standalone/.next/static/rZLs1krFuduixvcVNe6q3/_buildManifest.js +1 -0
  299. package/_standalone/.next/trace +63 -53
  300. package/_standalone/.next/types/routes.d.ts +2 -1
  301. package/_standalone/.next/types/validator.ts +9 -0
  302. package/_standalone/__tests__/agent/chat-mode.test.ts +103 -0
  303. package/_standalone/__tests__/agents/agents-content-dashboard.test.tsx +4 -3
  304. package/_standalone/__tests__/api/bootstrap.test.ts +0 -2
  305. package/_standalone/__tests__/api/file.test.ts +22 -1
  306. package/_standalone/__tests__/api/install-skill.test.ts +2 -2
  307. package/_standalone/__tests__/api/mcp-install.test.ts +9 -10
  308. package/_standalone/__tests__/api/setup.test.ts +2 -2
  309. package/_standalone/__tests__/api/test-key.test.ts +73 -147
  310. package/_standalone/__tests__/ask/ask-content-input-during-run.test.tsx +1 -1
  311. package/_standalone/__tests__/ask/mode-capsule.test.ts +95 -0
  312. package/_standalone/__tests__/core/inbox.test.ts +250 -0
  313. package/_standalone/__tests__/core/skill-install-logic.test.ts +3 -3
  314. package/_standalone/__tests__/core/sync-status.test.ts +1 -1
  315. package/_standalone/__tests__/core/tools.test.ts +11 -6
  316. package/_standalone/__tests__/lib/echo-pages-visual-i18n.test.ts +2 -2
  317. package/_standalone/__tests__/lib/i18n-new-keys.test.ts +2 -2
  318. package/_standalone/__tests__/panels/agents-panel-hub.test.tsx +2 -2
  319. package/_standalone/__tests__/settings/activity-bar-update-badge.test.tsx +1 -1
  320. package/_standalone/__tests__/settings/settings-update-badge.test.tsx +1 -1
  321. package/_standalone/__tests__/settings/update-tab-availability-sync.test.tsx +1 -1
  322. package/_standalone/__tests__/settings/update-tab-browser.test.tsx +1 -1
  323. package/_standalone/__tests__/settings/update-tab-desktop.test.tsx +1 -1
  324. package/_standalone/__tests__/setup.ts +3 -5
  325. package/_standalone/app/globals.css +11 -1
  326. package/_standalone/components/ActivityBar.tsx +26 -10
  327. package/_standalone/components/AskFab.tsx +1 -1
  328. package/_standalone/components/AskModal.tsx +1 -1
  329. package/_standalone/components/Backlinks.tsx +1 -1
  330. package/_standalone/components/CreateSpaceModal.tsx +7 -55
  331. package/_standalone/components/EchoSpotlight.tsx +1 -1
  332. package/_standalone/components/ExportModal.tsx +1 -1
  333. package/_standalone/components/FileTree.tsx +64 -79
  334. package/_standalone/components/FindInPage.tsx +1 -1
  335. package/_standalone/components/GuideCard.tsx +1 -1
  336. package/_standalone/components/ImportModal.tsx +1 -1
  337. package/_standalone/components/KeyboardShortcuts.tsx +1 -1
  338. package/_standalone/components/MarkdownView.tsx +11 -1
  339. package/_standalone/components/OnboardingView.tsx +1 -1
  340. package/_standalone/components/OrganizeToast.tsx +1 -1
  341. package/_standalone/components/Panel.tsx +82 -4
  342. package/_standalone/components/QuickSuggestion.tsx +1 -1
  343. package/_standalone/components/RightAgentDetailPanel.tsx +2 -2
  344. package/_standalone/components/RightAskPanel.tsx +58 -22
  345. package/_standalone/components/SearchModal.tsx +1 -1
  346. package/_standalone/components/Sidebar.tsx +1 -1
  347. package/_standalone/components/SidebarLayout.tsx +52 -16
  348. package/_standalone/components/SpaceInitToast.tsx +1 -1
  349. package/_standalone/components/SyncStatusBar.tsx +2 -2
  350. package/_standalone/components/SystemPulse.tsx +12 -6
  351. package/_standalone/components/TableOfContents.tsx +86 -39
  352. package/_standalone/components/agents/AgentActivitySection.tsx +225 -0
  353. package/_standalone/components/agents/AgentsMcpSection.tsx +7 -16
  354. package/_standalone/components/agents/AgentsOverviewSection.tsx +28 -27
  355. package/_standalone/components/agents/AgentsPanelA2aTab.tsx +1 -1
  356. package/_standalone/components/agents/AgentsPanelSessionsTab.tsx +6 -1
  357. package/_standalone/components/agents/AgentsSkillsSection.tsx +1 -1
  358. package/_standalone/components/agents/DiscoverAgentModal.tsx +1 -1
  359. package/_standalone/components/agents/RecentActivityFeed.tsx +49 -88
  360. package/_standalone/components/agents/agent-activity-shared.tsx +110 -0
  361. package/_standalone/components/ask/AgentSelectorCapsule.tsx +1 -1
  362. package/_standalone/components/ask/AskContent.tsx +332 -486
  363. package/_standalone/components/ask/AskHeader.tsx +61 -0
  364. package/_standalone/components/ask/FileChip.tsx +9 -5
  365. package/_standalone/components/ask/MessageList.tsx +88 -21
  366. package/_standalone/components/ask/ModeCapsule.tsx +180 -0
  367. package/_standalone/components/ask/ProviderModelCapsule.tsx +284 -0
  368. package/_standalone/components/ask/SessionHistory.tsx +63 -10
  369. package/_standalone/components/ask/SessionTabBar.tsx +1 -1
  370. package/_standalone/components/ask/ThinkingBlock.tsx +1 -1
  371. package/_standalone/components/ask/ToolCallBlock.tsx +28 -24
  372. package/_standalone/components/changes/ChangesBanner.tsx +1 -1
  373. package/_standalone/components/echo/EchoInsightCollapsible.tsx +1 -1
  374. package/_standalone/components/echo/EchoSegmentNav.tsx +1 -1
  375. package/_standalone/components/home/InboxSection.tsx +268 -0
  376. package/_standalone/components/panels/AgentsPanel.tsx +3 -2
  377. package/_standalone/components/panels/AgentsPanelHubNav.tsx +2 -6
  378. package/_standalone/components/panels/DiscoverPanel.tsx +1 -1
  379. package/_standalone/components/panels/EchoPanel.tsx +1 -1
  380. package/_standalone/components/panels/EchoSidebarStats.tsx +1 -1
  381. package/_standalone/components/panels/ImportHistoryPanel.tsx +1 -1
  382. package/_standalone/components/panels/PanelHeader.tsx +1 -1
  383. package/_standalone/components/panels/PluginsPanel.tsx +1 -1
  384. package/_standalone/components/panels/SearchPanel.tsx +5 -2
  385. package/_standalone/components/panels/SyncPopover.tsx +1 -1
  386. package/_standalone/components/panels/WorkflowsPanel.tsx +1 -1
  387. package/_standalone/components/renderers/agent-inspector/AgentInspectorRenderer.tsx +18 -0
  388. package/_standalone/components/renderers/agent-inspector/manifest.ts +16 -0
  389. package/_standalone/components/renderers/todo/TodoRenderer.tsx +489 -75
  390. package/_standalone/components/settings/AiTab.tsx +198 -127
  391. package/_standalone/components/settings/AppearanceTab.tsx +48 -50
  392. package/_standalone/components/settings/KnowledgeTab.tsx +92 -27
  393. package/_standalone/components/settings/McpAgentInstall.tsx +1 -1
  394. package/_standalone/components/settings/McpSkillsSection.tsx +1 -1
  395. package/_standalone/components/settings/McpTab.tsx +145 -7
  396. package/_standalone/components/settings/PluginsTab.tsx +1 -1
  397. package/_standalone/components/settings/SettingsContent.tsx +5 -2
  398. package/_standalone/components/settings/SyncTab.tsx +615 -230
  399. package/_standalone/components/settings/UninstallTab.tsx +1 -1
  400. package/_standalone/components/settings/UpdateTab.tsx +2 -2
  401. package/_standalone/components/settings/types.ts +4 -5
  402. package/_standalone/components/setup/StepAI.tsx +70 -49
  403. package/_standalone/components/setup/StepDots.tsx +1 -1
  404. package/_standalone/components/setup/StepReview.tsx +176 -8
  405. package/_standalone/components/setup/types.ts +11 -8
  406. package/_standalone/components/shared/ProviderSelect.tsx +134 -0
  407. package/_standalone/components/walkthrough/WalkthroughOverlay.tsx +2 -2
  408. package/_standalone/components/walkthrough/WalkthroughTooltip.tsx +2 -2
  409. package/_standalone/components/walkthrough/index.ts +1 -1
  410. package/_standalone/data/skills/mindos/SKILL.md +3 -3
  411. package/_standalone/data/skills/mindos-zh/SKILL.md +3 -3
  412. package/_standalone/hooks/useAcpDetection.ts +1 -1
  413. package/_standalone/hooks/useAskChat.ts +248 -0
  414. package/_standalone/hooks/useAskPanel.ts +24 -4
  415. package/_standalone/hooks/useAskSession.ts +15 -0
  416. package/_standalone/lib/acp/types.ts +1 -1
  417. package/_standalone/lib/api.ts +3 -1
  418. package/_standalone/lib/core/types.ts +2 -0
  419. package/_standalone/lib/i18n/modules/ai-chat.ts +35 -13
  420. package/_standalone/lib/i18n/modules/features.ts +2 -2
  421. package/_standalone/lib/i18n/modules/knowledge.ts +82 -2
  422. package/_standalone/lib/i18n/modules/navigation.ts +6 -2
  423. package/_standalone/lib/i18n/modules/onboarding.ts +39 -9
  424. package/_standalone/lib/i18n/modules/panels.ts +78 -29
  425. package/_standalone/lib/i18n/modules/settings.ts +207 -23
  426. package/_standalone/lib/inbox-upload.ts +93 -0
  427. package/_standalone/lib/settings-ai-client.ts +13 -12
  428. package/_standalone/lib/space-ai-init.ts +66 -0
  429. package/_standalone/lib/stores/McpStoreInit.tsx +18 -0
  430. package/_standalone/lib/stores/WalkthroughInit.tsx +20 -0
  431. package/_standalone/lib/stores/locale-store.ts +55 -0
  432. package/_standalone/lib/stores/mcp-store.ts +156 -0
  433. package/_standalone/lib/stores/walkthrough-store.ts +118 -0
  434. package/_standalone/package-lock.json +40 -8
  435. package/_standalone/package.json +3 -1
  436. package/_standalone/tsconfig.json +1 -1
  437. package/_standalone/tsconfig.tsbuildinfo +1 -1
  438. package/app/app/api/acp/detect/route.ts +29 -20
  439. package/app/app/api/agent-activity/route.ts +1 -1
  440. package/app/app/api/ask/route.ts +103 -29
  441. package/app/app/api/ask-sessions/route.ts +1 -0
  442. package/app/app/api/bootstrap/route.ts +1 -3
  443. package/app/app/api/file/route.ts +34 -4
  444. package/app/app/api/inbox/route.ts +61 -0
  445. package/app/app/api/settings/list-models/route.ts +73 -53
  446. package/app/app/api/settings/route.ts +46 -55
  447. package/app/app/api/settings/test-key/route.ts +57 -114
  448. package/app/app/api/setup/route.ts +31 -21
  449. package/app/app/api/sync/route.ts +122 -12
  450. package/app/app/api/update-check/route.ts +2 -2
  451. package/app/app/globals.css +11 -1
  452. package/app/app/layout.tsx +2 -3
  453. package/app/app/login/page.tsx +1 -1
  454. package/app/app/view/[...path]/ViewPageClient.tsx +10 -10
  455. package/app/app/view/[...path]/not-found.tsx +1 -1
  456. package/app/components/ActivityBar.tsx +26 -10
  457. package/app/components/AskFab.tsx +1 -1
  458. package/app/components/AskModal.tsx +1 -1
  459. package/app/components/Backlinks.tsx +1 -1
  460. package/app/components/CreateSpaceModal.tsx +7 -55
  461. package/app/components/DirView.tsx +93 -11
  462. package/app/components/EchoSpotlight.tsx +1 -1
  463. package/app/components/ExportModal.tsx +1 -1
  464. package/app/components/FileTree.tsx +64 -79
  465. package/app/components/FindInPage.tsx +1 -1
  466. package/app/components/GuideCard.tsx +1 -1
  467. package/app/components/HomeContent.tsx +21 -14
  468. package/app/components/ImportModal.tsx +1 -1
  469. package/app/components/KeyboardShortcuts.tsx +1 -1
  470. package/app/components/MarkdownView.tsx +11 -1
  471. package/app/components/OnboardingView.tsx +1 -1
  472. package/app/components/OrganizeToast.tsx +1 -1
  473. package/app/components/Panel.tsx +82 -4
  474. package/app/components/QuickSuggestion.tsx +1 -1
  475. package/app/components/RightAgentDetailPanel.tsx +2 -2
  476. package/app/components/RightAskPanel.tsx +58 -22
  477. package/app/components/SearchModal.tsx +1 -1
  478. package/app/components/Sidebar.tsx +1 -1
  479. package/app/components/SidebarLayout.tsx +52 -16
  480. package/app/components/SpaceInitToast.tsx +1 -1
  481. package/app/components/SyncStatusBar.tsx +2 -2
  482. package/app/components/SystemPulse.tsx +12 -6
  483. package/app/components/TableOfContents.tsx +86 -39
  484. package/app/components/TrashPageClient.tsx +1 -1
  485. package/app/components/UpdateOverlay.tsx +2 -2
  486. package/app/components/agents/AgentActivitySection.tsx +225 -0
  487. package/app/components/agents/AgentDetailContent.tsx +234 -3
  488. package/app/components/agents/AgentsContentPage.tsx +13 -2
  489. package/app/components/agents/AgentsMcpSection.tsx +7 -16
  490. package/app/components/agents/AgentsOverviewSection.tsx +28 -27
  491. package/app/components/agents/AgentsPanelA2aTab.tsx +1 -1
  492. package/app/components/agents/AgentsPanelSessionsTab.tsx +6 -1
  493. package/app/components/agents/AgentsSkillsSection.tsx +1 -1
  494. package/app/components/agents/DiscoverAgentModal.tsx +1 -1
  495. package/app/components/agents/RecentActivityFeed.tsx +49 -88
  496. package/app/components/agents/agent-activity-shared.tsx +110 -0
  497. package/app/components/agents/agents-content-model.ts +2 -2
  498. package/app/components/ask/AgentSelectorCapsule.tsx +1 -1
  499. package/app/components/ask/AskContent.tsx +332 -486
  500. package/app/components/ask/AskHeader.tsx +61 -0
  501. package/app/components/ask/FileChip.tsx +9 -5
  502. package/app/components/ask/MessageList.tsx +88 -21
  503. package/app/components/ask/ModeCapsule.tsx +180 -0
  504. package/app/components/ask/ProviderModelCapsule.tsx +284 -0
  505. package/app/components/ask/SessionHistory.tsx +63 -10
  506. package/app/components/ask/SessionTabBar.tsx +1 -1
  507. package/app/components/ask/ThinkingBlock.tsx +1 -1
  508. package/app/components/ask/ToolCallBlock.tsx +28 -24
  509. package/app/components/changes/ChangesBanner.tsx +1 -1
  510. package/app/components/changes/ChangesContentPage.tsx +1 -1
  511. package/app/components/echo/EchoInsightCollapsible.tsx +1 -1
  512. package/app/components/echo/EchoSegmentNav.tsx +1 -1
  513. package/app/components/echo/EchoSegmentPageClient.tsx +1 -1
  514. package/app/components/explore/ExploreContent.tsx +1 -1
  515. package/app/components/help/HelpContent.tsx +1 -1
  516. package/app/components/home/InboxSection.tsx +268 -0
  517. package/app/components/panels/AgentsPanel.tsx +3 -2
  518. package/app/components/panels/AgentsPanelHubNav.tsx +2 -6
  519. package/app/components/panels/DiscoverPanel.tsx +1 -1
  520. package/app/components/panels/EchoPanel.tsx +1 -1
  521. package/app/components/panels/EchoSidebarStats.tsx +1 -1
  522. package/app/components/panels/ImportHistoryPanel.tsx +1 -1
  523. package/app/components/panels/PanelHeader.tsx +1 -1
  524. package/app/components/panels/PluginsPanel.tsx +1 -1
  525. package/app/components/panels/SearchPanel.tsx +5 -2
  526. package/app/components/panels/SyncPopover.tsx +1 -1
  527. package/app/components/panels/WorkflowsPanel.tsx +1 -1
  528. package/app/components/renderers/agent-inspector/AgentInspectorRenderer.tsx +18 -0
  529. package/app/components/renderers/todo/TodoRenderer.tsx +489 -75
  530. package/app/components/settings/AiTab.tsx +198 -127
  531. package/app/components/settings/AppearanceTab.tsx +48 -50
  532. package/app/components/settings/KnowledgeTab.tsx +92 -27
  533. package/app/components/settings/McpAgentInstall.tsx +1 -1
  534. package/app/components/settings/McpSkillsSection.tsx +1 -1
  535. package/app/components/settings/McpTab.tsx +145 -7
  536. package/app/components/settings/PluginsTab.tsx +1 -1
  537. package/app/components/settings/SettingsContent.tsx +5 -2
  538. package/app/components/settings/SyncTab.tsx +615 -230
  539. package/app/components/settings/UninstallTab.tsx +1 -1
  540. package/app/components/settings/UpdateTab.tsx +2 -2
  541. package/app/components/settings/types.ts +4 -5
  542. package/app/components/setup/StepAI.tsx +70 -49
  543. package/app/components/setup/StepDots.tsx +1 -1
  544. package/app/components/setup/StepReview.tsx +176 -8
  545. package/app/components/setup/index.tsx +73 -39
  546. package/app/components/setup/types.ts +11 -8
  547. package/app/components/shared/ProviderSelect.tsx +134 -0
  548. package/app/components/walkthrough/WalkthroughOverlay.tsx +2 -2
  549. package/app/components/walkthrough/WalkthroughTooltip.tsx +2 -2
  550. package/app/components/walkthrough/index.ts +1 -1
  551. package/app/data/skills/mindos/SKILL.md +3 -3
  552. package/app/data/skills/mindos-zh/SKILL.md +3 -3
  553. package/app/hooks/useAcpDetection.ts +1 -1
  554. package/app/hooks/useAskChat.ts +248 -0
  555. package/app/hooks/useAskPanel.ts +24 -4
  556. package/app/hooks/useAskSession.ts +15 -0
  557. package/app/lib/acp/types.ts +1 -1
  558. package/app/lib/actions.ts +13 -0
  559. package/app/lib/agent/log.ts +2 -0
  560. package/app/lib/agent/model.ts +69 -81
  561. package/app/lib/agent/prompt.ts +27 -0
  562. package/app/lib/agent/providers.ts +299 -0
  563. package/app/lib/agent/tools.ts +26 -4
  564. package/app/lib/api.ts +3 -1
  565. package/app/lib/core/agent-audit-log.ts +7 -0
  566. package/app/lib/core/fs-ops.ts +9 -4
  567. package/app/lib/core/inbox.ts +181 -0
  568. package/app/lib/core/index.ts +4 -0
  569. package/app/lib/core/tree.ts +3 -0
  570. package/app/lib/core/types.ts +2 -0
  571. package/app/lib/fs.ts +26 -2
  572. package/app/lib/i18n/modules/ai-chat.ts +35 -13
  573. package/app/lib/i18n/modules/features.ts +2 -2
  574. package/app/lib/i18n/modules/knowledge.ts +82 -2
  575. package/app/lib/i18n/modules/navigation.ts +6 -2
  576. package/app/lib/i18n/modules/onboarding.ts +39 -9
  577. package/app/lib/i18n/modules/panels.ts +78 -29
  578. package/app/lib/i18n/modules/settings.ts +207 -23
  579. package/app/lib/inbox-upload.ts +93 -0
  580. package/app/lib/mcp-agents.ts +6 -7
  581. package/app/lib/renderers/index.ts +1 -2
  582. package/app/lib/settings-ai-client.ts +13 -12
  583. package/app/lib/settings.ts +48 -33
  584. package/app/lib/space-ai-init.ts +66 -0
  585. package/app/lib/stores/LocaleStoreInit.tsx +18 -0
  586. package/app/lib/stores/McpStoreInit.tsx +18 -0
  587. package/app/lib/stores/WalkthroughInit.tsx +20 -0
  588. package/app/lib/stores/locale-store.ts +55 -0
  589. package/app/lib/stores/mcp-store.ts +156 -0
  590. package/app/lib/stores/walkthrough-store.ts +118 -0
  591. package/app/lib/types.ts +20 -0
  592. package/app/package.json +3 -1
  593. package/app/tsconfig.json +1 -1
  594. package/bin/cli.js +46 -27
  595. package/bin/commands/file.js +7 -4
  596. package/bin/commands/space.js +4 -0
  597. package/bin/lib/mcp-agents.js +26 -2
  598. package/bin/lib/mcp-install.js +11 -3
  599. package/bin/lib/sync.js +140 -34
  600. package/mcp/README.md +2 -2
  601. package/mcp/dist/index.cjs +43 -43
  602. package/mcp/package.json +1 -1
  603. package/mcp/src/index.ts +77 -61
  604. package/package.json +1 -1
  605. package/scripts/setup.js +1 -1
  606. package/skills/mindos/SKILL.md +3 -3
  607. package/skills/mindos/references/preference-capture.md +4 -4
  608. package/skills/mindos/references/write-supplement.md +2 -2
  609. package/skills/mindos-zh/SKILL.md +3 -3
  610. package/skills/mindos-zh/references/preference-capture.md +4 -4
  611. package/skills/mindos-zh/references/write-supplement.md +2 -2
  612. package/templates/empty/INSTRUCTION.md +0 -1
  613. package/templates/en/INSTRUCTION.md +0 -1
  614. package/templates/template-generation-skill.md +0 -1
  615. package/templates/zh/INSTRUCTION.md +0 -1
  616. package/_standalone/.next/server/chunks/1473.js +0 -52
  617. package/_standalone/.next/server/chunks/248.js +0 -15
  618. package/_standalone/.next/server/chunks/359.js +0 -2
  619. package/_standalone/.next/server/chunks/4931.js +0 -202
  620. package/_standalone/.next/server/chunks/7670.js +0 -1
  621. package/_standalone/.next/server/chunks/9414.js +0 -11
  622. package/_standalone/.next/static/chunks/1038-ed04d6651ec92312.js +0 -1
  623. package/_standalone/.next/static/chunks/1263-6df1734e4273adb1.js +0 -25
  624. package/_standalone/.next/static/chunks/275-ebcaaedabe706903.js +0 -1
  625. package/_standalone/.next/static/chunks/5637-b97c869adf70c82e.js +0 -1
  626. package/_standalone/.next/static/chunks/5681-a53362a1cd629dc6.js +0 -1
  627. package/_standalone/.next/static/chunks/9602-35ca17b688f1a4fe.js +0 -1
  628. package/_standalone/.next/static/chunks/9670-d59e4d45ed705f58.js +0 -6
  629. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-d4762cc48529e566.js +0 -1
  630. package/_standalone/.next/static/chunks/app/_global-error/page-d4762cc48529e566.js +0 -1
  631. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-519d4da1142db5ef.js +0 -1
  632. package/_standalone/.next/static/chunks/app/agents/page-b709cf3103321609.js +0 -5
  633. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-d4762cc48529e566.js +0 -1
  634. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-d4762cc48529e566.js +0 -1
  635. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-d4762cc48529e566.js +0 -1
  636. package/_standalone/.next/static/chunks/app/api/a2a/route-d4762cc48529e566.js +0 -1
  637. package/_standalone/.next/static/chunks/app/api/acp/config/route-d4762cc48529e566.js +0 -1
  638. package/_standalone/.next/static/chunks/app/api/acp/detect/route-d4762cc48529e566.js +0 -1
  639. package/_standalone/.next/static/chunks/app/api/acp/install/route-d4762cc48529e566.js +0 -1
  640. package/_standalone/.next/static/chunks/app/api/acp/registry/route-d4762cc48529e566.js +0 -1
  641. package/_standalone/.next/static/chunks/app/api/acp/session/route-d4762cc48529e566.js +0 -1
  642. package/_standalone/.next/static/chunks/app/api/agent-activity/route-d4762cc48529e566.js +0 -1
  643. package/_standalone/.next/static/chunks/app/api/ask/route-d4762cc48529e566.js +0 -1
  644. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-d4762cc48529e566.js +0 -1
  645. package/_standalone/.next/static/chunks/app/api/auth/route-d4762cc48529e566.js +0 -1
  646. package/_standalone/.next/static/chunks/app/api/backlinks/route-d4762cc48529e566.js +0 -1
  647. package/_standalone/.next/static/chunks/app/api/bootstrap/route-d4762cc48529e566.js +0 -1
  648. package/_standalone/.next/static/chunks/app/api/changes/route-d4762cc48529e566.js +0 -1
  649. package/_standalone/.next/static/chunks/app/api/export/route-d4762cc48529e566.js +0 -1
  650. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-d4762cc48529e566.js +0 -1
  651. package/_standalone/.next/static/chunks/app/api/file/import/route-d4762cc48529e566.js +0 -1
  652. package/_standalone/.next/static/chunks/app/api/file/route-d4762cc48529e566.js +0 -1
  653. package/_standalone/.next/static/chunks/app/api/files/route-d4762cc48529e566.js +0 -1
  654. package/_standalone/.next/static/chunks/app/api/git/route-d4762cc48529e566.js +0 -1
  655. package/_standalone/.next/static/chunks/app/api/graph/route-d4762cc48529e566.js +0 -1
  656. package/_standalone/.next/static/chunks/app/api/health/route-d4762cc48529e566.js +0 -1
  657. package/_standalone/.next/static/chunks/app/api/init/route-d4762cc48529e566.js +0 -1
  658. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-d4762cc48529e566.js +0 -1
  659. package/_standalone/.next/static/chunks/app/api/mcp/install/route-d4762cc48529e566.js +0 -1
  660. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-d4762cc48529e566.js +0 -1
  661. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-d4762cc48529e566.js +0 -1
  662. package/_standalone/.next/static/chunks/app/api/mcp/status/route-d4762cc48529e566.js +0 -1
  663. package/_standalone/.next/static/chunks/app/api/monitoring/route-d4762cc48529e566.js +0 -1
  664. package/_standalone/.next/static/chunks/app/api/recent-files/route-d4762cc48529e566.js +0 -1
  665. package/_standalone/.next/static/chunks/app/api/restart/route-d4762cc48529e566.js +0 -1
  666. package/_standalone/.next/static/chunks/app/api/search/route-d4762cc48529e566.js +0 -1
  667. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-d4762cc48529e566.js +0 -1
  668. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-d4762cc48529e566.js +0 -1
  669. package/_standalone/.next/static/chunks/app/api/settings/route-d4762cc48529e566.js +0 -1
  670. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-d4762cc48529e566.js +0 -1
  671. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-d4762cc48529e566.js +0 -1
  672. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-d4762cc48529e566.js +0 -1
  673. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-d4762cc48529e566.js +0 -1
  674. package/_standalone/.next/static/chunks/app/api/setup/ls/route-d4762cc48529e566.js +0 -1
  675. package/_standalone/.next/static/chunks/app/api/setup/route-d4762cc48529e566.js +0 -1
  676. package/_standalone/.next/static/chunks/app/api/skills/route-d4762cc48529e566.js +0 -1
  677. package/_standalone/.next/static/chunks/app/api/sync/route-d4762cc48529e566.js +0 -1
  678. package/_standalone/.next/static/chunks/app/api/tree-version/route-d4762cc48529e566.js +0 -1
  679. package/_standalone/.next/static/chunks/app/api/uninstall/route-d4762cc48529e566.js +0 -1
  680. package/_standalone/.next/static/chunks/app/api/update/route-d4762cc48529e566.js +0 -1
  681. package/_standalone/.next/static/chunks/app/api/update-check/route-d4762cc48529e566.js +0 -1
  682. package/_standalone/.next/static/chunks/app/api/update-status/route-d4762cc48529e566.js +0 -1
  683. package/_standalone/.next/static/chunks/app/api/workflows/route-d4762cc48529e566.js +0 -1
  684. package/_standalone/.next/static/chunks/app/changes/page-def5210095f8698d.js +0 -1
  685. package/_standalone/.next/static/chunks/app/echo/[segment]/page-be28eff31b1a186e.js +0 -11
  686. package/_standalone/.next/static/chunks/app/echo/page-d4762cc48529e566.js +0 -1
  687. package/_standalone/.next/static/chunks/app/explore/page-e4b8098dca200389.js +0 -4
  688. package/_standalone/.next/static/chunks/app/help/page-d5e57d73d94bad19.js +0 -1
  689. package/_standalone/.next/static/chunks/app/layout-d91cdbe2ecf135e1.js +0 -173
  690. package/_standalone/.next/static/chunks/app/login/page-321875768b70938a.js +0 -1
  691. package/_standalone/.next/static/chunks/app/page-718fdf170428b43c.js +0 -7
  692. package/_standalone/.next/static/chunks/app/setup/page-01ab1f549d636057.js +0 -1
  693. package/_standalone/.next/static/chunks/app/trash/page-89b1430cc8a16f18.js +0 -1
  694. package/_standalone/.next/static/chunks/app/view/[...path]/loading-d4762cc48529e566.js +0 -1
  695. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-f22c513bbc348cc8.js +0 -1
  696. package/_standalone/.next/static/chunks/app/view/[...path]/page-6e3dc47699a01de1.js +0 -12
  697. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d4762cc48529e566.js +0 -1
  698. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d4762cc48529e566.js +0 -1
  699. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d4762cc48529e566.js +0 -1
  700. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d4762cc48529e566.js +0 -1
  701. package/_standalone/.next/static/chunks/webpack-3489a2b6c2882b0c.js +0 -1
  702. package/_standalone/.next/static/css/f16595bc58a16d5d.css +0 -1
  703. package/_standalone/.next/static/ushZ_NJ8rE3rG5hZfaYOX/_buildManifest.js +0 -1
  704. package/_standalone/components/walkthrough/WalkthroughProvider.tsx +0 -133
  705. package/_standalone/hooks/useMcpData.tsx +0 -169
  706. package/_standalone/lib/i18n-en.ts +0 -2
  707. package/_standalone/lib/i18n-zh.ts +0 -2
  708. package/_standalone/lib/types.ts +0 -70
  709. package/app/components/walkthrough/WalkthroughProvider.tsx +0 -133
  710. package/app/hooks/useMcpData.tsx +0 -169
  711. package/app/lib/LocaleContext.tsx +0 -60
  712. package/app/lib/i18n-en.ts +0 -2
  713. package/app/lib/i18n-zh.ts +0 -2
  714. /package/_standalone/.next/static/{ushZ_NJ8rE3rG5hZfaYOX → rZLs1krFuduixvcVNe6q3}/_ssgManifest.js +0 -0
@@ -2,7 +2,7 @@
2
2
  // Do not edit this file manually
3
3
 
4
4
  type AppRoutes = "/" | "/agents" | "/agents/[agentKey]" | "/changes" | "/echo" | "/echo/[segment]" | "/explore" | "/help" | "/login" | "/setup" | "/trash" | "/view/[...path]"
5
- type AppRouteHandlerRoutes = "/.well-known/agent-card.json" | "/api/a2a" | "/api/a2a/agents" | "/api/a2a/delegations" | "/api/a2a/discover" | "/api/acp/config" | "/api/acp/detect" | "/api/acp/install" | "/api/acp/registry" | "/api/acp/session" | "/api/agent-activity" | "/api/ask" | "/api/ask-sessions" | "/api/auth" | "/api/backlinks" | "/api/bootstrap" | "/api/changes" | "/api/export" | "/api/extract-pdf" | "/api/file" | "/api/file/import" | "/api/files" | "/api/git" | "/api/graph" | "/api/health" | "/api/init" | "/api/mcp/agents" | "/api/mcp/install" | "/api/mcp/install-skill" | "/api/mcp/restart" | "/api/mcp/status" | "/api/monitoring" | "/api/recent-files" | "/api/restart" | "/api/search" | "/api/settings" | "/api/settings/list-models" | "/api/settings/reset-token" | "/api/settings/test-key" | "/api/setup" | "/api/setup/check-path" | "/api/setup/check-port" | "/api/setup/generate-token" | "/api/setup/ls" | "/api/skills" | "/api/sync" | "/api/tree-version" | "/api/uninstall" | "/api/update" | "/api/update-check" | "/api/update-status" | "/api/workflows"
5
+ type AppRouteHandlerRoutes = "/.well-known/agent-card.json" | "/api/a2a" | "/api/a2a/agents" | "/api/a2a/delegations" | "/api/a2a/discover" | "/api/acp/config" | "/api/acp/detect" | "/api/acp/install" | "/api/acp/registry" | "/api/acp/session" | "/api/agent-activity" | "/api/ask" | "/api/ask-sessions" | "/api/auth" | "/api/backlinks" | "/api/bootstrap" | "/api/changes" | "/api/export" | "/api/extract-pdf" | "/api/file" | "/api/file/import" | "/api/files" | "/api/git" | "/api/graph" | "/api/health" | "/api/inbox" | "/api/init" | "/api/mcp/agents" | "/api/mcp/install" | "/api/mcp/install-skill" | "/api/mcp/restart" | "/api/mcp/status" | "/api/monitoring" | "/api/recent-files" | "/api/restart" | "/api/search" | "/api/settings" | "/api/settings/list-models" | "/api/settings/reset-token" | "/api/settings/test-key" | "/api/setup" | "/api/setup/check-path" | "/api/setup/check-port" | "/api/setup/generate-token" | "/api/setup/ls" | "/api/skills" | "/api/sync" | "/api/tree-version" | "/api/uninstall" | "/api/update" | "/api/update-check" | "/api/update-status" | "/api/workflows"
6
6
  type PageRoutes = never
7
7
  type LayoutRoutes = "/"
8
8
  type RedirectRoutes = never
@@ -39,6 +39,7 @@ interface ParamMap {
39
39
  "/api/git": {}
40
40
  "/api/graph": {}
41
41
  "/api/health": {}
42
+ "/api/inbox": {}
42
43
  "/api/init": {}
43
44
  "/api/mcp/agents": {}
44
45
  "/api/mcp/install": {}
@@ -380,6 +380,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
380
380
  type __Unused = __Check
381
381
  }
382
382
 
383
+ // Validate ../../app/api/inbox/route.ts
384
+ {
385
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/inbox">> = Specific
386
+ const handler = {} as typeof import("../../app/api/inbox/route.js")
387
+ type __Check = __IsExpected<typeof handler>
388
+ // @ts-ignore
389
+ type __Unused = __Check
390
+ }
391
+
383
392
  // Validate ../../app/api/init/route.ts
384
393
  {
385
394
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/init">> = Specific
@@ -0,0 +1,103 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getChatTools, knowledgeBaseTools, WRITE_TOOLS } from '@/lib/agent/tools';
3
+ import { CHAT_SYSTEM_PROMPT, AGENT_SYSTEM_PROMPT } from '@/lib/agent/prompt';
4
+
5
+ // ---------------------------------------------------------------------------
6
+ // getChatTools — tool set correctness
7
+ // ---------------------------------------------------------------------------
8
+
9
+ describe('getChatTools', () => {
10
+ const chatTools = getChatTools();
11
+ const chatToolNames = chatTools.map(t => t.name);
12
+
13
+ it('returns a non-empty array of tools', () => {
14
+ expect(chatTools.length).toBeGreaterThan(0);
15
+ });
16
+
17
+ it('returns exactly the 8 approved read-only tools', () => {
18
+ const expected = [
19
+ 'list_files', 'read_file', 'read_file_chunk',
20
+ 'search', 'get_recent', 'get_backlinks',
21
+ 'web_search', 'web_fetch',
22
+ ];
23
+ expect(new Set(chatToolNames)).toEqual(new Set(expected));
24
+ });
25
+
26
+ it('is a strict subset of knowledgeBaseTools', () => {
27
+ const allNames = new Set(knowledgeBaseTools.map(t => t.name));
28
+ for (const name of chatToolNames) {
29
+ expect(allNames.has(name)).toBe(true);
30
+ }
31
+ });
32
+
33
+ it('contains zero write tools', () => {
34
+ for (const name of chatToolNames) {
35
+ expect(WRITE_TOOLS.has(name)).toBe(false);
36
+ }
37
+ });
38
+
39
+ it('is significantly smaller than full tool set', () => {
40
+ expect(chatTools.length).toBeLessThan(knowledgeBaseTools.length);
41
+ });
42
+
43
+ it('each tool has a valid execute function', () => {
44
+ for (const tool of chatTools) {
45
+ expect(typeof tool.execute).toBe('function');
46
+ }
47
+ });
48
+ });
49
+
50
+ // ---------------------------------------------------------------------------
51
+ // CHAT_SYSTEM_PROMPT — content correctness
52
+ // ---------------------------------------------------------------------------
53
+
54
+ describe('CHAT_SYSTEM_PROMPT', () => {
55
+ it('exists and is a non-empty string', () => {
56
+ expect(typeof CHAT_SYSTEM_PROMPT).toBe('string');
57
+ expect(CHAT_SYSTEM_PROMPT.length).toBeGreaterThan(100);
58
+ });
59
+
60
+ it('mentions Chat (Read-Only) mode', () => {
61
+ expect(CHAT_SYSTEM_PROMPT).toContain('Chat');
62
+ expect(CHAT_SYSTEM_PROMPT).toContain('Read-Only');
63
+ });
64
+
65
+ it('contains anti-hallucination directive', () => {
66
+ expect(CHAT_SYSTEM_PROMPT).toContain('Anti-Hallucination');
67
+ });
68
+
69
+ it('contains cite-sources directive', () => {
70
+ expect(CHAT_SYSTEM_PROMPT).toContain('Cite Sources');
71
+ });
72
+
73
+ it('instructs to suggest switching to Agent mode for writes', () => {
74
+ expect(CHAT_SYSTEM_PROMPT).toContain('Agent mode');
75
+ });
76
+
77
+ it('is significantly shorter than AGENT_SYSTEM_PROMPT', () => {
78
+ expect(CHAT_SYSTEM_PROMPT.length).toBeLessThan(AGENT_SYSTEM_PROMPT.length);
79
+ });
80
+
81
+ it('does not contain write-related directives', () => {
82
+ expect(CHAT_SYSTEM_PROMPT).not.toContain('Read-Before-Write');
83
+ expect(CHAT_SYSTEM_PROMPT).not.toContain('write_file');
84
+ expect(CHAT_SYSTEM_PROMPT).not.toContain('create_file');
85
+ });
86
+ });
87
+
88
+ // ---------------------------------------------------------------------------
89
+ // AskMode type — compile-time type check
90
+ // ---------------------------------------------------------------------------
91
+
92
+ describe('AskMode type', () => {
93
+ it('accepts valid mode values', async () => {
94
+ const { AskMode } = await import('@/lib/types') as any;
95
+ const validModes: Array<import('@/lib/types').AskMode> = ['chat', 'agent'];
96
+ expect(validModes).toHaveLength(2);
97
+ });
98
+
99
+ it('AskModeApi includes organize', async () => {
100
+ const validModes: Array<import('@/lib/types').AskModeApi> = ['chat', 'agent', 'organize'];
101
+ expect(validModes).toHaveLength(3);
102
+ });
103
+ });
@@ -93,11 +93,11 @@ const baseMcpState = {
93
93
  installAgent: async () => true,
94
94
  };
95
95
 
96
- vi.mock('@/hooks/useMcpData', () => ({
96
+ vi.mock('@/lib/stores/mcp-store', () => ({
97
97
  useMcpData: () => baseMcpState,
98
98
  }));
99
99
 
100
- vi.mock('@/lib/LocaleContext', () => ({
100
+ vi.mock('@/lib/stores/locale-store', () => ({
101
101
  useLocale: () => ({ locale: 'en' as const, setLocale: () => {}, t: messages.en }),
102
102
  }));
103
103
 
@@ -113,7 +113,8 @@ describe('Agents content dashboard', () => {
113
113
  expect(html).toContain(a.overview.pulseMcp);
114
114
  expect(html).toContain('Cursor');
115
115
  expect(html).toContain('Codex');
116
- expect(html).toContain('Ghost Agent');
116
+ // Ghost Agent (present: false) is hidden from overview — only present agents shown
117
+ expect(html).not.toContain('Ghost Agent');
117
118
  expect(html).toContain('MCP');
118
119
  expect(html).toContain('Skills');
119
120
  });
@@ -9,7 +9,6 @@ describe('GET /api/bootstrap', () => {
9
9
  seedFile('INSTRUCTION.md', '# Instructions');
10
10
  seedFile('README.md', '# Index');
11
11
  seedFile('CONFIG.json', '{"key": "val"}');
12
- seedFile('CONFIG.md', '# Config');
13
12
  invalidateCache();
14
13
 
15
14
  const req = new NextRequest('http://localhost/api/bootstrap');
@@ -19,7 +18,6 @@ describe('GET /api/bootstrap', () => {
19
18
  expect(body.instruction).toBe('# Instructions');
20
19
  expect(body.index).toBe('# Index');
21
20
  expect(body.config_json).toBe('{"key": "val"}');
22
- expect(body.config_md).toBe('# Config');
23
21
  });
24
22
 
25
23
  it('returns undefined for missing root files', async () => {
@@ -129,13 +129,34 @@ describe('POST /api/file', () => {
129
129
  expect((await res.json()).error).toBe('missing content');
130
130
  });
131
131
 
132
- it('delete_file removes a file', async () => {
132
+ it('delete_file moves file to trash instead of permanent delete', async () => {
133
133
  seedFile('to-delete.md', 'bye');
134
134
  invalidateCache();
135
135
 
136
136
  const res = await POST(post({ op: 'delete_file', path: 'to-delete.md' }));
137
137
  expect(res.status).toBe(200);
138
+ const body = await res.json();
139
+ expect(body.ok).toBe(true);
140
+ expect(body.trashId).toBeTruthy();
141
+
142
+ // File should no longer exist at original location
138
143
  expect(fs.existsSync(path.join(root(), 'to-delete.md'))).toBe(false);
144
+
145
+ // File should exist in trash
146
+ const trashDir = path.join(path.dirname(root()), '.trash');
147
+ expect(fs.existsSync(trashDir)).toBe(true);
148
+ const trashFile = path.join(trashDir, body.trashId as string);
149
+ expect(fs.existsSync(trashFile)).toBe(true);
150
+
151
+ // Trash content should match original
152
+ const trashContent = fs.readFileSync(trashFile, 'utf-8');
153
+ expect(trashContent).toBe('bye');
154
+ });
155
+
156
+ it('delete_file returns error for non-existent file', async () => {
157
+ invalidateCache();
158
+ const res = await POST(post({ op: 'delete_file', path: 'does-not-exist.md' }));
159
+ expect(res.status).toBe(500);
139
160
  });
140
161
 
141
162
  it('rename_file renames a file', async () => {
@@ -133,9 +133,9 @@ describe('POST /api/mcp/install-skill — agent filtering', () => {
133
133
  expect(cmd).toContain('-a universal');
134
134
  });
135
135
 
136
- it('treats vscode as universal in skill install', async () => {
136
+ it('treats github-copilot as universal in skill install', async () => {
137
137
  const { POST } = await importRoute();
138
- await POST(makeReq({ skill: 'mindos', agents: ['vscode'] }));
138
+ await POST(makeReq({ skill: 'mindos', agents: ['github-copilot'] }));
139
139
 
140
140
  const cmd = execSyncMock.mock.calls[0][0] as string;
141
141
  expect(cmd).toContain('-a universal');
@@ -176,12 +176,12 @@ describe('POST /api/mcp/install', () => {
176
176
  expect(content).toContain('[mcp_servers.mindos]');
177
177
  });
178
178
 
179
- it('installs vscode agent with correct nested key for global scope', async () => {
179
+ it('installs github-copilot agent with servers key for global scope', async () => {
180
180
  const { POST } = await importInstallRoute();
181
181
  const req = new NextRequest('http://localhost/api/mcp/install', {
182
182
  method: 'POST',
183
183
  body: JSON.stringify({
184
- agents: [{ key: 'vscode', scope: 'global' }],
184
+ agents: [{ key: 'github-copilot', scope: 'global' }],
185
185
  transport: 'stdio',
186
186
  }),
187
187
  headers: { 'content-type': 'application/json' },
@@ -194,14 +194,13 @@ describe('POST /api/mcp/install', () => {
194
194
  const absPath = configPath.replace('~', tempHome);
195
195
  expect(fs.existsSync(absPath)).toBe(true);
196
196
  const config = JSON.parse(fs.readFileSync(absPath, 'utf-8'));
197
- // VS Code global config must nest under mcp.servers, not just servers
198
- expect(config.mcp).toBeDefined();
199
- expect(config.mcp.servers).toBeDefined();
200
- expect(config.mcp.servers.mindos).toBeDefined();
201
- expect(config.mcp.servers.mindos.type).toBe('stdio');
197
+ // GitHub Copilot global uses standalone mcp.json with top-level 'servers'
198
+ expect(config.servers).toBeDefined();
199
+ expect(config.servers.mindos).toBeDefined();
200
+ expect(config.servers.mindos.type).toBe('stdio');
202
201
  });
203
202
 
204
- it('installs vscode project scope with flat key', async () => {
203
+ it('installs github-copilot project scope with servers key', async () => {
205
204
  // Create the .vscode directory first
206
205
  fs.mkdirSync(path.join(process.cwd(), '.vscode'), { recursive: true });
207
206
 
@@ -209,7 +208,7 @@ describe('POST /api/mcp/install', () => {
209
208
  const req = new NextRequest('http://localhost/api/mcp/install', {
210
209
  method: 'POST',
211
210
  body: JSON.stringify({
212
- agents: [{ key: 'vscode', scope: 'project' }],
211
+ agents: [{ key: 'github-copilot', scope: 'project' }],
213
212
  transport: 'stdio',
214
213
  }),
215
214
  headers: { 'content-type': 'application/json' },
@@ -251,7 +250,7 @@ describe('GET /api/mcp/agents', () => {
251
250
  expect(keys).toContain('qoder');
252
251
  expect(keys).toContain('trae-cn');
253
252
  expect(keys).toContain('roo');
254
- expect(keys).toContain('vscode');
253
+ expect(keys).toContain('github-copilot');
255
254
  expect(keys).toContain('codex');
256
255
  });
257
256
 
@@ -75,12 +75,12 @@ describe('GET /api/setup', () => {
75
75
  expect(body.mcpPort).toBe(8781);
76
76
  });
77
77
 
78
- it('masks API keys', async () => {
78
+ it('masks API keys in providerConfigs', async () => {
79
79
  mockSettings.ai.providers.anthropic.apiKey = 'sk-ant-1234567890abcdef';
80
80
  const { GET } = await importSetupRoute();
81
81
  const res = await GET();
82
82
  const body = await res.json();
83
- expect(body.anthropicApiKey).toBe('sk-ant***');
83
+ expect(body.providerConfigs.anthropic.apiKeyMask).toBe('sk-ant***');
84
84
  mockSettings.ai.providers.anthropic.apiKey = '';
85
85
  });
86
86
  });
@@ -1,19 +1,25 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
2
  import { NextRequest } from 'next/server';
3
- import { POST } from '../../app/api/settings/test-key/route';
4
-
5
- // setup.ts already mocks @/lib/settings with effectiveAiConfig returning empty keys
6
3
 
7
- const originalFetch = global.fetch;
4
+ // Mock pi-ai complete
5
+ vi.mock('@mariozechner/pi-ai', () => ({
6
+ complete: vi.fn(),
7
+ getModel: vi.fn(),
8
+ }));
9
+
10
+ // Mock getModelConfig to avoid loading the real pi-ai registry
11
+ vi.mock('@/lib/agent/model', () => ({
12
+ getModelConfig: vi.fn(() => ({
13
+ model: { id: 'mock-model', api: 'openai-completions', provider: 'openai' },
14
+ modelName: 'mock-model',
15
+ apiKey: 'mock-key',
16
+ provider: 'anthropic',
17
+ })),
18
+ }));
8
19
 
9
- beforeEach(() => {
10
- // Reset fetch mock before each test
11
- global.fetch = vi.fn();
12
- });
13
-
14
- afterEach(() => {
15
- global.fetch = originalFetch;
16
- });
20
+ import { POST } from '../../app/api/settings/test-key/route';
21
+ import { complete } from '@mariozechner/pi-ai';
22
+ import { getModelConfig } from '@/lib/agent/model';
17
23
 
18
24
  function makeReq(body: Record<string, unknown>) {
19
25
  return new NextRequest('http://localhost/api/settings/test-key', {
@@ -24,10 +30,13 @@ function makeReq(body: Record<string, unknown>) {
24
30
  }
25
31
 
26
32
  describe('POST /api/settings/test-key', () => {
27
- // ─── Validation ──────────────────────────────────────────────
33
+
34
+ beforeEach(() => {
35
+ vi.clearAllMocks();
36
+ });
28
37
 
29
38
  it('rejects invalid provider', async () => {
30
- const res = await POST(makeReq({ provider: 'gemini', apiKey: 'test' }));
39
+ const res = await POST(makeReq({ provider: 'invalid', apiKey: 'test' }));
31
40
  expect(res.status).toBe(400);
32
41
  const body = await res.json();
33
42
  expect(body.ok).toBe(false);
@@ -35,28 +44,15 @@ describe('POST /api/settings/test-key', () => {
35
44
  });
36
45
 
37
46
  it('returns auth_error when no key configured', async () => {
38
- // effectiveAiConfig returns empty keys, and we pass no apiKey
39
47
  const res = await POST(makeReq({ provider: 'anthropic' }));
40
- expect(res.status).toBe(200);
41
48
  const body = await res.json();
42
49
  expect(body.ok).toBe(false);
43
50
  expect(body.code).toBe('auth_error');
44
51
  expect(body.error).toBe('No API key configured');
45
52
  });
46
53
 
47
- it('returns auth_error for openai when no key configured', async () => {
48
- const res = await POST(makeReq({ provider: 'openai' }));
49
- const body = await res.json();
50
- expect(body.ok).toBe(false);
51
- expect(body.code).toBe('auth_error');
52
- });
53
-
54
- // ─── Anthropic success ───────────────────────────────────────
55
-
56
- it('returns ok with latency on successful anthropic test', async () => {
57
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
58
- new Response('{}', { status: 200 }),
59
- );
54
+ it('returns ok when pi-ai complete() succeeds', async () => {
55
+ (complete as ReturnType<typeof vi.fn>).mockResolvedValueOnce({ text: 'hello' });
60
56
 
61
57
  const res = await POST(makeReq({ provider: 'anthropic', apiKey: 'sk-ant-test', model: 'claude-sonnet-4-6' }));
62
58
  const body = await res.json();
@@ -64,89 +60,36 @@ describe('POST /api/settings/test-key', () => {
64
60
  expect(body.ok).toBe(true);
65
61
  expect(body.latency).toBeTypeOf('number');
66
62
 
67
- // Verify fetch was called with correct Anthropic endpoint and headers
68
- expect(global.fetch).toHaveBeenCalledOnce();
69
- const [url, opts] = (global.fetch as ReturnType<typeof vi.fn>).mock.calls[0];
70
- expect(url).toBe('https://api.anthropic.com/v1/messages');
71
- expect(opts.headers['x-api-key']).toBe('sk-ant-test');
72
- expect(opts.headers['anthropic-version']).toBe('2023-06-01');
73
- });
74
-
75
- // ─── OpenAI success ──────────────────────────────────────────
76
-
77
- it('returns ok on successful openai test', async () => {
78
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
79
- new Response('{}', { status: 200 }),
80
- );
81
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
82
- new Response('{}', { status: 200 }),
83
- );
84
-
85
- const res = await POST(makeReq({ provider: 'openai', apiKey: 'sk-test', model: 'gpt-5.4' }));
86
- const body = await res.json();
87
-
88
- expect(body.ok).toBe(true);
89
- expect(body.latency).toBeTypeOf('number');
63
+ expect(getModelConfig).toHaveBeenCalledWith(expect.objectContaining({
64
+ provider: 'anthropic',
65
+ apiKey: 'sk-ant-test',
66
+ model: 'claude-sonnet-4-6',
67
+ }));
90
68
 
91
- const [url, opts] = (global.fetch as ReturnType<typeof vi.fn>).mock.calls[0];
92
- expect(url).toBe('https://api.openai.com/v1/chat/completions');
93
- expect(opts.headers['Authorization']).toBe('Bearer sk-test');
94
- expect(global.fetch).toHaveBeenCalledTimes(2);
69
+ expect(complete).toHaveBeenCalledOnce();
95
70
  });
96
71
 
97
- it('uses custom baseUrl for openai', async () => {
98
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
99
- new Response('{}', { status: 200 }),
100
- );
101
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
102
- new Response('{}', { status: 200 }),
103
- );
72
+ it('passes overrides to getModelConfig for unsaved values', async () => {
73
+ (complete as ReturnType<typeof vi.fn>).mockResolvedValueOnce({ text: 'ok' });
104
74
 
105
75
  await POST(makeReq({
106
76
  provider: 'openai',
107
- apiKey: 'sk-test',
77
+ apiKey: 'sk-new-key',
108
78
  model: 'gpt-5.4',
109
- baseUrl: 'https://custom.api.com/v1/',
79
+ baseUrl: 'https://custom.api.com/v1',
110
80
  }));
111
81
 
112
- const [url] = (global.fetch as ReturnType<typeof vi.fn>).mock.calls[0];
113
- expect(url).toBe('https://custom.api.com/v1/chat/completions');
114
- });
115
-
116
- it('does not send max_tokens in OpenAI test requests (gpt-5.4 compat)', async () => {
117
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(new Response('{}', { status: 200 }));
118
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(new Response('{}', { status: 200 }));
119
-
120
- await POST(makeReq({ provider: 'openai', apiKey: 'sk-test', model: 'gpt-5.4' }));
121
-
122
- const calls = (global.fetch as ReturnType<typeof vi.fn>).mock.calls;
123
- for (const [, opts] of calls) {
124
- const parsed = JSON.parse(opts.body);
125
- expect(parsed).not.toHaveProperty('max_tokens');
126
- expect(parsed).not.toHaveProperty('max_completion_tokens');
127
- }
128
- });
129
-
130
- it('returns incompatibility error when tool-call check fails for openai', async () => {
131
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
132
- new Response('{}', { status: 200 }),
133
- );
134
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
135
- new Response(JSON.stringify({ error: { message: 'tools is not supported' } }), { status: 400 }),
136
- );
137
-
138
- const res = await POST(makeReq({ provider: 'openai', apiKey: 'sk-test', model: 'gpt-5.4' }));
139
- const body = await res.json();
140
-
141
- expect(body.ok).toBe(false);
142
- expect(body.error).toContain('incompatible with agent tool calls');
82
+ expect(getModelConfig).toHaveBeenCalledWith(expect.objectContaining({
83
+ provider: 'openai',
84
+ apiKey: 'sk-new-key',
85
+ model: 'gpt-5.4',
86
+ baseUrl: 'https://custom.api.com/v1',
87
+ }));
143
88
  });
144
89
 
145
- // ─── Error classification ────────────────────────────────────
146
-
147
- it('classifies 401 as auth_error', async () => {
148
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
149
- new Response('{"error":"invalid_api_key"}', { status: 401 }),
90
+ it('classifies auth errors from pi-ai', async () => {
91
+ (complete as ReturnType<typeof vi.fn>).mockRejectedValueOnce(
92
+ new Error('401 Unauthorized: Invalid API key'),
150
93
  );
151
94
 
152
95
  const res = await POST(makeReq({ provider: 'anthropic', apiKey: 'bad-key' }));
@@ -156,76 +99,48 @@ describe('POST /api/settings/test-key', () => {
156
99
  expect(body.code).toBe('auth_error');
157
100
  });
158
101
 
159
- it('classifies 403 as auth_error', async () => {
160
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
161
- new Response('{}', { status: 403 }),
162
- );
163
-
164
- const res = await POST(makeReq({ provider: 'openai', apiKey: 'bad-key' }));
165
- const body = await res.json();
166
-
167
- expect(body.ok).toBe(false);
168
- expect(body.code).toBe('auth_error');
169
- });
170
-
171
- it('classifies 404 as model_not_found', async () => {
172
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
173
- new Response('{}', { status: 404 }),
102
+ it('classifies model not found errors', async () => {
103
+ (complete as ReturnType<typeof vi.fn>).mockRejectedValueOnce(
104
+ new Error('404 Model not found: nonexistent-model does not exist'),
174
105
  );
175
106
 
176
- const res = await POST(makeReq({ provider: 'anthropic', apiKey: 'sk-ant-test', model: 'nonexistent' }));
107
+ const res = await POST(makeReq({ provider: 'anthropic', apiKey: 'sk-test', model: 'nonexistent-model' }));
177
108
  const body = await res.json();
178
109
 
179
110
  expect(body.ok).toBe(false);
180
111
  expect(body.code).toBe('model_not_found');
181
112
  });
182
113
 
183
- it('classifies 429 as rate_limited', async () => {
184
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
185
- new Response('{}', { status: 429 }),
114
+ it('classifies rate limit errors', async () => {
115
+ (complete as ReturnType<typeof vi.fn>).mockRejectedValueOnce(
116
+ new Error('429 Rate limit exceeded'),
186
117
  );
187
118
 
188
- const res = await POST(makeReq({ provider: 'anthropic', apiKey: 'sk-ant-test' }));
119
+ const res = await POST(makeReq({ provider: 'groq', apiKey: 'sk-test' }));
189
120
  const body = await res.json();
190
121
 
191
122
  expect(body.ok).toBe(false);
192
123
  expect(body.code).toBe('rate_limited');
193
124
  });
194
125
 
195
- it('extracts error message from JSON response body', async () => {
196
- (global.fetch as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
197
- new Response(JSON.stringify({ error: { message: 'Quota exceeded' } }), { status: 500 }),
198
- );
199
-
200
- const res = await POST(makeReq({ provider: 'anthropic', apiKey: 'sk-ant-test' }));
201
- const body = await res.json();
202
-
203
- expect(body.ok).toBe(false);
204
- expect(body.code).toBe('unknown');
205
- expect(body.error).toBe('Quota exceeded');
206
- });
207
-
208
- // ─── Network errors ──────────────────────────────────────────
209
-
210
- it('classifies fetch rejection as network_error', async () => {
211
- (global.fetch as ReturnType<typeof vi.fn>).mockRejectedValueOnce(
126
+ it('classifies network errors', async () => {
127
+ (complete as ReturnType<typeof vi.fn>).mockRejectedValueOnce(
212
128
  new Error('ECONNREFUSED'),
213
129
  );
214
130
 
215
- const res = await POST(makeReq({ provider: 'anthropic', apiKey: 'sk-ant-test' }));
131
+ const res = await POST(makeReq({ provider: 'deepseek', apiKey: 'sk-test' }));
216
132
  const body = await res.json();
217
133
 
218
134
  expect(body.ok).toBe(false);
219
135
  expect(body.code).toBe('network_error');
220
- expect(body.error).toBe('ECONNREFUSED');
221
136
  });
222
137
 
223
138
  it('classifies abort as network_error with timeout message', async () => {
224
139
  const abortErr = new Error('The operation was aborted');
225
140
  abortErr.name = 'AbortError';
226
- (global.fetch as ReturnType<typeof vi.fn>).mockRejectedValueOnce(abortErr);
141
+ (complete as ReturnType<typeof vi.fn>).mockRejectedValueOnce(abortErr);
227
142
 
228
- const res = await POST(makeReq({ provider: 'anthropic', apiKey: 'sk-ant-test' }));
143
+ const res = await POST(makeReq({ provider: 'google', apiKey: 'sk-test' }));
229
144
  const body = await res.json();
230
145
 
231
146
  expect(body.ok).toBe(false);
@@ -233,15 +148,26 @@ describe('POST /api/settings/test-key', () => {
233
148
  expect(body.error).toBe('Request timed out');
234
149
  });
235
150
 
236
- // ─── Masked key fallback ─────────────────────────────────────
237
-
238
- it('treats ***set*** as masked and falls back to config (which is empty → auth_error)', async () => {
151
+ it('treats ***set*** as masked and falls back to config', async () => {
239
152
  const res = await POST(makeReq({ provider: 'anthropic', apiKey: '***set***' }));
240
153
  const body = await res.json();
241
154
 
242
- // effectiveAiConfig returns empty anthropicApiKey → auth_error
155
+ // effectiveAiConfig returns empty apiKey → auth_error
243
156
  expect(body.ok).toBe(false);
244
157
  expect(body.code).toBe('auth_error');
245
158
  expect(body.error).toBe('No API key configured');
246
159
  });
160
+
161
+ it('accepts new providers like google and deepseek', async () => {
162
+ (complete as ReturnType<typeof vi.fn>).mockResolvedValueOnce({ text: 'ok' });
163
+
164
+ const res = await POST(makeReq({ provider: 'google', apiKey: 'AI-key-test' }));
165
+ const body = await res.json();
166
+
167
+ expect(body.ok).toBe(true);
168
+ expect(getModelConfig).toHaveBeenCalledWith(expect.objectContaining({
169
+ provider: 'google',
170
+ apiKey: 'AI-key-test',
171
+ }));
172
+ });
247
173
  });
@@ -9,7 +9,7 @@ const mockPersistSession = vi.fn();
9
9
  const mockClearPersistTimer = vi.fn();
10
10
  const mockInitSessions = vi.fn();
11
11
 
12
- vi.mock('@/lib/LocaleContext', () => ({
12
+ vi.mock('@/lib/stores/locale-store', () => ({
13
13
  useLocale: () => ({
14
14
  t: {
15
15
  ask: {