@geminilight/mindos 0.6.38 → 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 (715) hide show
  1. package/README.md +37 -9
  2. package/README_zh.md +37 -9
  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 +21 -20
  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 +133 -95
  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 +21 -20
  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 +373 -109
  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 +27 -12
  411. package/_standalone/data/skills/mindos-zh/SKILL.md +27 -12
  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 +236 -20
  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 +115 -31
  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 +373 -109
  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 +27 -12
  552. package/app/data/skills/mindos-zh/SKILL.md +27 -12
  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 +236 -20
  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/build-runtime-archive.sh +113 -0
  606. package/scripts/setup.js +1 -1
  607. package/skills/mindos/SKILL.md +27 -12
  608. package/skills/mindos/references/preference-capture.md +4 -4
  609. package/skills/mindos/references/write-supplement.md +46 -4
  610. package/skills/mindos-zh/SKILL.md +27 -12
  611. package/skills/mindos-zh/references/preference-capture.md +4 -4
  612. package/skills/mindos-zh/references/write-supplement.md +47 -5
  613. package/templates/empty/INSTRUCTION.md +0 -1
  614. package/templates/en/INSTRUCTION.md +0 -1
  615. package/templates/template-generation-skill.md +0 -1
  616. package/templates/zh/INSTRUCTION.md +0 -1
  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/8407.js +0 -52
  622. package/_standalone/.next/server/chunks/9414.js +0 -11
  623. package/_standalone/.next/static/VAb8MoUUpoXjVJalRJogO/_buildManifest.js +0 -1
  624. package/_standalone/.next/static/chunks/1038-ed04d6651ec92312.js +0 -1
  625. package/_standalone/.next/static/chunks/1263-79beb8734dee7bbd.js +0 -25
  626. package/_standalone/.next/static/chunks/275-ebcaaedabe706903.js +0 -1
  627. package/_standalone/.next/static/chunks/5637-b97c869adf70c82e.js +0 -1
  628. package/_standalone/.next/static/chunks/5681-a53362a1cd629dc6.js +0 -1
  629. package/_standalone/.next/static/chunks/9602-35ca17b688f1a4fe.js +0 -1
  630. package/_standalone/.next/static/chunks/9670-d59e4d45ed705f58.js +0 -6
  631. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-d4762cc48529e566.js +0 -1
  632. package/_standalone/.next/static/chunks/app/_global-error/page-d4762cc48529e566.js +0 -1
  633. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-519d4da1142db5ef.js +0 -1
  634. package/_standalone/.next/static/chunks/app/agents/page-b709cf3103321609.js +0 -5
  635. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-d4762cc48529e566.js +0 -1
  636. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-d4762cc48529e566.js +0 -1
  637. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-d4762cc48529e566.js +0 -1
  638. package/_standalone/.next/static/chunks/app/api/a2a/route-d4762cc48529e566.js +0 -1
  639. package/_standalone/.next/static/chunks/app/api/acp/config/route-d4762cc48529e566.js +0 -1
  640. package/_standalone/.next/static/chunks/app/api/acp/detect/route-d4762cc48529e566.js +0 -1
  641. package/_standalone/.next/static/chunks/app/api/acp/install/route-d4762cc48529e566.js +0 -1
  642. package/_standalone/.next/static/chunks/app/api/acp/registry/route-d4762cc48529e566.js +0 -1
  643. package/_standalone/.next/static/chunks/app/api/acp/session/route-d4762cc48529e566.js +0 -1
  644. package/_standalone/.next/static/chunks/app/api/agent-activity/route-d4762cc48529e566.js +0 -1
  645. package/_standalone/.next/static/chunks/app/api/ask/route-d4762cc48529e566.js +0 -1
  646. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-d4762cc48529e566.js +0 -1
  647. package/_standalone/.next/static/chunks/app/api/auth/route-d4762cc48529e566.js +0 -1
  648. package/_standalone/.next/static/chunks/app/api/backlinks/route-d4762cc48529e566.js +0 -1
  649. package/_standalone/.next/static/chunks/app/api/bootstrap/route-d4762cc48529e566.js +0 -1
  650. package/_standalone/.next/static/chunks/app/api/changes/route-d4762cc48529e566.js +0 -1
  651. package/_standalone/.next/static/chunks/app/api/export/route-d4762cc48529e566.js +0 -1
  652. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-d4762cc48529e566.js +0 -1
  653. package/_standalone/.next/static/chunks/app/api/file/import/route-d4762cc48529e566.js +0 -1
  654. package/_standalone/.next/static/chunks/app/api/file/route-d4762cc48529e566.js +0 -1
  655. package/_standalone/.next/static/chunks/app/api/files/route-d4762cc48529e566.js +0 -1
  656. package/_standalone/.next/static/chunks/app/api/git/route-d4762cc48529e566.js +0 -1
  657. package/_standalone/.next/static/chunks/app/api/graph/route-d4762cc48529e566.js +0 -1
  658. package/_standalone/.next/static/chunks/app/api/health/route-d4762cc48529e566.js +0 -1
  659. package/_standalone/.next/static/chunks/app/api/init/route-d4762cc48529e566.js +0 -1
  660. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-d4762cc48529e566.js +0 -1
  661. package/_standalone/.next/static/chunks/app/api/mcp/install/route-d4762cc48529e566.js +0 -1
  662. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-d4762cc48529e566.js +0 -1
  663. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-d4762cc48529e566.js +0 -1
  664. package/_standalone/.next/static/chunks/app/api/mcp/status/route-d4762cc48529e566.js +0 -1
  665. package/_standalone/.next/static/chunks/app/api/monitoring/route-d4762cc48529e566.js +0 -1
  666. package/_standalone/.next/static/chunks/app/api/recent-files/route-d4762cc48529e566.js +0 -1
  667. package/_standalone/.next/static/chunks/app/api/restart/route-d4762cc48529e566.js +0 -1
  668. package/_standalone/.next/static/chunks/app/api/search/route-d4762cc48529e566.js +0 -1
  669. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-d4762cc48529e566.js +0 -1
  670. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-d4762cc48529e566.js +0 -1
  671. package/_standalone/.next/static/chunks/app/api/settings/route-d4762cc48529e566.js +0 -1
  672. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-d4762cc48529e566.js +0 -1
  673. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-d4762cc48529e566.js +0 -1
  674. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-d4762cc48529e566.js +0 -1
  675. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-d4762cc48529e566.js +0 -1
  676. package/_standalone/.next/static/chunks/app/api/setup/ls/route-d4762cc48529e566.js +0 -1
  677. package/_standalone/.next/static/chunks/app/api/setup/route-d4762cc48529e566.js +0 -1
  678. package/_standalone/.next/static/chunks/app/api/skills/route-d4762cc48529e566.js +0 -1
  679. package/_standalone/.next/static/chunks/app/api/sync/route-d4762cc48529e566.js +0 -1
  680. package/_standalone/.next/static/chunks/app/api/tree-version/route-d4762cc48529e566.js +0 -1
  681. package/_standalone/.next/static/chunks/app/api/uninstall/route-d4762cc48529e566.js +0 -1
  682. package/_standalone/.next/static/chunks/app/api/update/route-d4762cc48529e566.js +0 -1
  683. package/_standalone/.next/static/chunks/app/api/update-check/route-d4762cc48529e566.js +0 -1
  684. package/_standalone/.next/static/chunks/app/api/update-status/route-d4762cc48529e566.js +0 -1
  685. package/_standalone/.next/static/chunks/app/api/workflows/route-d4762cc48529e566.js +0 -1
  686. package/_standalone/.next/static/chunks/app/changes/page-def5210095f8698d.js +0 -1
  687. package/_standalone/.next/static/chunks/app/echo/[segment]/page-be28eff31b1a186e.js +0 -11
  688. package/_standalone/.next/static/chunks/app/echo/page-d4762cc48529e566.js +0 -1
  689. package/_standalone/.next/static/chunks/app/explore/page-e4b8098dca200389.js +0 -4
  690. package/_standalone/.next/static/chunks/app/help/page-d5e57d73d94bad19.js +0 -1
  691. package/_standalone/.next/static/chunks/app/layout-aab90c2b4faf8d57.js +0 -173
  692. package/_standalone/.next/static/chunks/app/login/page-321875768b70938a.js +0 -1
  693. package/_standalone/.next/static/chunks/app/page-9a15cf85f0962c59.js +0 -7
  694. package/_standalone/.next/static/chunks/app/setup/page-01ab1f549d636057.js +0 -1
  695. package/_standalone/.next/static/chunks/app/trash/page-7df0139c6b0f87e0.js +0 -1
  696. package/_standalone/.next/static/chunks/app/view/[...path]/loading-d4762cc48529e566.js +0 -1
  697. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-f22c513bbc348cc8.js +0 -1
  698. package/_standalone/.next/static/chunks/app/view/[...path]/page-35811d7e49e08157.js +0 -12
  699. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d4762cc48529e566.js +0 -1
  700. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d4762cc48529e566.js +0 -1
  701. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d4762cc48529e566.js +0 -1
  702. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d4762cc48529e566.js +0 -1
  703. package/_standalone/.next/static/chunks/webpack-3489a2b6c2882b0c.js +0 -1
  704. package/_standalone/.next/static/css/f16595bc58a16d5d.css +0 -1
  705. package/_standalone/components/walkthrough/WalkthroughProvider.tsx +0 -133
  706. package/_standalone/hooks/useMcpData.tsx +0 -169
  707. package/_standalone/lib/i18n-en.ts +0 -2
  708. package/_standalone/lib/i18n-zh.ts +0 -2
  709. package/_standalone/lib/types.ts +0 -70
  710. package/app/components/walkthrough/WalkthroughProvider.tsx +0 -133
  711. package/app/hooks/useMcpData.tsx +0 -169
  712. package/app/lib/LocaleContext.tsx +0 -60
  713. package/app/lib/i18n-en.ts +0 -2
  714. package/app/lib/i18n-zh.ts +0 -2
  715. /package/_standalone/.next/static/{VAb8MoUUpoXjVJalRJogO → rZLs1krFuduixvcVNe6q3}/_ssgManifest.js +0 -0
@@ -1,10 +1,12 @@
1
1
  'use client';
2
2
 
3
- import { useState, useRef, useCallback, useEffect } from 'react';
4
- import { AlertCircle, ChevronDown, Loader2, Sparkles, Bot, Monitor } from 'lucide-react';
3
+ import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
4
+ import { AlertCircle, ChevronDown, Loader2, Sparkles, Bot, Monitor, ExternalLink } from 'lucide-react';
5
5
  import type { AiSettings, AgentSettings, ProviderConfig, SettingsData, AiTabProps } from './types';
6
6
  import { Field, Select, Input, EnvBadge, ApiKeyInput, Toggle, SettingCard, SettingRow } from './Primitives';
7
- import { useLocale } from '@/lib/LocaleContext';
7
+ import { useLocale } from '@/lib/stores/locale-store';
8
+ import { type ProviderId, PROVIDER_PRESETS, isProviderId, getApiKeyEnvVar, getDefaultBaseUrl } from '@/lib/agent/providers';
9
+ import ProviderSelect from '@/components/shared/ProviderSelect';
8
10
 
9
11
  type TestState = 'idle' | 'testing' | 'ok' | 'error';
10
12
  type ErrorCode = 'auth_error' | 'model_not_found' | 'rate_limited' | 'network_error' | 'unknown';
@@ -27,16 +29,16 @@ function errorMessage(t: AiTabProps['t'], code?: ErrorCode): string {
27
29
  }
28
30
 
29
31
  export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
32
+ const { locale } = useLocale();
30
33
  const env = data.envOverrides ?? {};
31
34
  const envVal = data.envValues ?? {};
32
35
  const provider = data.ai.provider;
36
+ const preset = isProviderId(provider) ? PROVIDER_PRESETS[provider] : null;
33
37
 
34
- // --- Test key state ---
35
38
  const [testResult, setTestResult] = useState<Record<string, TestResult>>({});
36
39
  const okTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);
37
40
  const prevProviderRef = useRef(provider);
38
41
 
39
- // Reset test result when provider changes
40
42
  useEffect(() => {
41
43
  if (prevProviderRef.current !== provider) {
42
44
  prevProviderRef.current = provider;
@@ -45,16 +47,14 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
45
47
  }
46
48
  }, [provider]);
47
49
 
48
- // Cleanup ok timer
49
50
  useEffect(() => () => { if (okTimerRef.current) clearTimeout(okTimerRef.current); }, []);
50
51
 
51
- // Sync reconnectRetries to localStorage so AskContent can read it without fetching settings
52
52
  useEffect(() => {
53
53
  const v = data.agent?.reconnectRetries ?? 3;
54
54
  try { localStorage.setItem('mindos-reconnect-retries', String(v)); } catch (err) { console.warn("[AiTab] localStorage setItem reconnectRetries failed:", err); }
55
55
  }, [data.agent?.reconnectRetries]);
56
56
 
57
- const handleTestKey = useCallback(async (providerName: 'anthropic' | 'openai') => {
57
+ const handleTestKey = useCallback(async (providerName: ProviderId) => {
58
58
  const prov = data.ai.providers?.[providerName] ?? {} as ProviderConfig;
59
59
  setTestResult(prev => ({ ...prev, [providerName]: { state: 'testing' } }));
60
60
 
@@ -62,7 +62,7 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
62
62
  const body: Record<string, string> = { provider: providerName };
63
63
  if (prov.apiKey) body.apiKey = prov.apiKey;
64
64
  if (prov.model) body.model = prov.model;
65
- if (providerName === 'openai' && prov.baseUrl) body.baseUrl = prov.baseUrl;
65
+ if (prov.baseUrl) body.baseUrl = prov.baseUrl;
66
66
 
67
67
  const res = await fetch('/api/settings/test-key', {
68
68
  method: 'POST',
@@ -91,8 +91,7 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
91
91
  }
92
92
  }, [data.ai.providers]);
93
93
 
94
- // Reset test result when key changes
95
- const patchProviderWithReset = useCallback((name: 'anthropic' | 'openai', patch: Partial<ProviderConfig>) => {
94
+ const patchProvider = useCallback((name: ProviderId, patch: Partial<ProviderConfig>) => {
96
95
  if ('apiKey' in patch) {
97
96
  setTestResult(prev => ({ ...prev, [name]: { state: 'idle' } }));
98
97
  }
@@ -104,21 +103,23 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
104
103
  });
105
104
  }, [data.ai.providers, updateAi]);
106
105
 
107
- function patchProvider(name: 'anthropic' | 'openai', patch: Partial<ProviderConfig>) {
108
- patchProviderWithReset(name, patch);
109
- }
110
-
111
- const anthropic = data.ai.providers?.anthropic ?? { apiKey: '', model: '' };
112
- const openai = data.ai.providers?.openai ?? { apiKey: '', model: '', baseUrl: '' };
113
-
114
- const activeApiKey = provider === 'anthropic' ? anthropic.apiKey : openai.apiKey;
115
- const activeEnvKey = provider === 'anthropic' ? env.ANTHROPIC_API_KEY : env.OPENAI_API_KEY;
116
- const missingApiKey = !activeApiKey && !activeEnvKey;
106
+ const currentConfig = data.ai.providers?.[provider] ?? { apiKey: '', model: '', baseUrl: '' };
107
+ const envKeyName = preset ? getApiKeyEnvVar(provider) : undefined;
108
+ const activeApiKey = currentConfig.apiKey;
109
+ const activeEnvKey = envKeyName ? env[envKeyName] : false;
110
+ const hasFallbackKey = !!preset?.apiKeyFallback;
111
+ const missingApiKey = !activeApiKey && !activeEnvKey && !hasFallbackKey;
112
+
113
+ const configuredProviders = new Set(
114
+ Object.entries(data.ai.providers ?? {})
115
+ .filter(([id, cfg]) => (cfg && cfg.apiKey) || PROVIDER_PRESETS[id as ProviderId]?.apiKeyFallback)
116
+ .map(([id]) => id as ProviderId),
117
+ );
117
118
 
118
- // Test button helper
119
- const renderTestButton = (providerName: 'anthropic' | 'openai', hasKey: boolean, hasEnv: boolean) => {
119
+ const renderTestButton = (providerName: ProviderId, hasKey: boolean, hasEnv: boolean) => {
120
120
  const result = testResult[providerName] ?? { state: 'idle' as TestState };
121
- const disabled = result.state === 'testing' || (!hasKey && !hasEnv);
121
+ const hasFallback = !!PROVIDER_PRESETS[providerName]?.apiKeyFallback;
122
+ const disabled = result.state === 'testing' || (!hasKey && !hasEnv && !hasFallback);
122
123
 
123
124
  return (
124
125
  <div className="flex items-center gap-2 mt-1.5">
@@ -150,95 +151,83 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
150
151
  );
151
152
  };
152
153
 
154
+ const displayName = preset ? (locale === 'zh' ? preset.nameZh : preset.name) : provider;
155
+
153
156
  return (
154
157
  <div className="space-y-4">
155
158
  {/* ── Card 1: AI Provider ── */}
156
159
  <SettingCard
157
160
  icon={<Sparkles size={15} />}
158
161
  title={t.settings.ai.provider}
159
- description={provider === 'anthropic' ? 'Anthropic Claude' : 'OpenAI / compatible'}
162
+ description={displayName}
160
163
  >
161
- {/* Provider toggle — two clickable mini-cards */}
162
- <div className="flex gap-2">
163
- {(['anthropic', 'openai'] as const).map(p => (
164
- <button
165
- key={p}
166
- type="button"
167
- onClick={() => updateAi({ provider: p })}
168
- className={`flex-1 flex items-center gap-2.5 px-3.5 py-2.5 rounded-lg border transition-all ${
169
- provider === p
170
- ? 'border-[var(--amber)] bg-[var(--amber-subtle)] shadow-sm'
171
- : 'border-border/50 hover:border-border hover:bg-muted/30'
172
- }`}
173
- >
174
- <span className={`text-sm font-medium ${provider === p ? 'text-foreground' : 'text-muted-foreground'}`}>
175
- {p === 'anthropic' ? 'Anthropic' : 'OpenAI'}
176
- </span>
177
- <EnvBadge overridden={env.AI_PROVIDER} />
178
- </button>
179
- ))}
180
- </div>
164
+ <ProviderSelect
165
+ value={provider}
166
+ onChange={id => { if (id !== 'skip') updateAi({ provider: id }); }}
167
+ compact
168
+ configuredProviders={configuredProviders}
169
+ />
181
170
 
182
- {/* Model + API Key */}
183
- {provider === 'anthropic' ? (
184
- <>
185
- <Field label={<>{t.settings.ai.model} <EnvBadge overridden={env.ANTHROPIC_MODEL} /></>}>
186
- <ModelInput
187
- value={anthropic.model}
188
- onChange={v => patchProvider('anthropic', { model: v })}
189
- placeholder={envVal.ANTHROPIC_MODEL || 'claude-sonnet-4-6'}
190
- provider="anthropic"
191
- apiKey={anthropic.apiKey}
192
- envKey={env.ANTHROPIC_API_KEY}
193
- t={t}
194
- />
195
- </Field>
171
+ {/* Provider configuration fields */}
172
+ {preset && (
173
+ <div className="space-y-3 pt-3" style={{ borderTop: '1px solid var(--border)' }}>
174
+ {/* 1. API Key — most essential, enter first */}
196
175
  <Field
197
- label={<>{t.settings.ai.apiKey} <EnvBadge overridden={env.ANTHROPIC_API_KEY} /></>}
198
- hint={env.ANTHROPIC_API_KEY ? t.settings.ai.envFieldNote('ANTHROPIC_API_KEY') : t.settings.ai.keyHint}
176
+ label={<>{t.settings.ai.apiKey} {envKeyName && <EnvBadge overridden={env[envKeyName]} />}</>}
177
+ hint={activeEnvKey ? t.settings.ai.envFieldNote(envKeyName!) : hasFallbackKey ? t.settings.ai.keyOptionalHint : t.settings.ai.keyHint}
199
178
  >
200
179
  <ApiKeyInput
201
- value={anthropic.apiKey}
202
- onChange={v => patchProvider('anthropic', { apiKey: v })}
180
+ value={currentConfig.apiKey}
181
+ onChange={v => patchProvider(provider, { apiKey: v })}
203
182
  />
204
- {renderTestButton('anthropic', !!anthropic.apiKey, !!env.ANTHROPIC_API_KEY)}
183
+ {preset.signupUrl && !currentConfig.apiKey && !activeEnvKey && (
184
+ <a
185
+ href={preset.signupUrl}
186
+ target="_blank"
187
+ rel="noopener noreferrer"
188
+ className="inline-flex items-center gap-1 text-xs mt-1.5 hover:underline"
189
+ style={{ color: 'var(--amber)' }}
190
+ >
191
+ <ExternalLink size={10} />
192
+ {hasFallbackKey
193
+ ? (locale === 'zh' ? `下载 ${preset.nameZh}` : `Download ${preset.name}`)
194
+ : (locale === 'zh' ? `获取 ${preset.nameZh} API Key` : `Get ${preset.name} API Key`)}
195
+ </a>
196
+ )}
205
197
  </Field>
206
- </>
207
- ) : (
208
- <>
209
- <Field label={<>{t.settings.ai.model} <EnvBadge overridden={env.OPENAI_MODEL} /></>}>
198
+
199
+ {/* 2. Base URL — before Model so "List Models" uses the correct endpoint */}
200
+ {preset.supportsBaseUrl && (
201
+ <Field
202
+ label={t.settings.ai.baseUrl}
203
+ hint={t.settings.ai.baseUrlHint}
204
+ >
205
+ <Input
206
+ value={currentConfig.baseUrl ?? ''}
207
+ onChange={e => patchProvider(provider, { baseUrl: e.target.value })}
208
+ placeholder={preset.fixedBaseUrl || getDefaultBaseUrl(provider) || 'https://api.openai.com/v1'}
209
+ />
210
+ </Field>
211
+ )}
212
+
213
+ {/* 3. Model — after Base URL so "List Models" queries the right endpoint */}
214
+ <Field label={t.settings.ai.model}>
210
215
  <ModelInput
211
- value={openai.model}
212
- onChange={v => patchProvider('openai', { model: v })}
213
- placeholder={envVal.OPENAI_MODEL || 'gpt-5.4'}
214
- provider="openai"
215
- apiKey={openai.apiKey}
216
- envKey={env.OPENAI_API_KEY}
217
- baseUrl={openai.baseUrl}
216
+ value={currentConfig.model}
217
+ onChange={v => patchProvider(provider, { model: v })}
218
+ placeholder={preset.defaultModel}
219
+ provider={provider}
220
+ apiKey={currentConfig.apiKey}
221
+ envKey={!!activeEnvKey}
222
+ baseUrl={currentConfig.baseUrl}
223
+ supportsListModels={preset.supportsListModels}
218
224
  t={t}
219
225
  />
220
226
  </Field>
221
- <Field
222
- label={<>{t.settings.ai.apiKey} <EnvBadge overridden={env.OPENAI_API_KEY} /></>}
223
- hint={env.OPENAI_API_KEY ? t.settings.ai.envFieldNote('OPENAI_API_KEY') : t.settings.ai.keyHint}
224
- >
225
- <ApiKeyInput
226
- value={openai.apiKey}
227
- onChange={v => patchProvider('openai', { apiKey: v })}
228
- />
229
- {renderTestButton('openai', !!openai.apiKey, !!env.OPENAI_API_KEY)}
230
- </Field>
231
- <Field
232
- label={<>{t.settings.ai.baseUrl} <EnvBadge overridden={env.OPENAI_BASE_URL} /></>}
233
- hint={t.settings.ai.baseUrlHint}
234
- >
235
- <Input
236
- value={openai.baseUrl ?? ''}
237
- onChange={e => patchProvider('openai', { baseUrl: e.target.value })}
238
- placeholder={envVal.OPENAI_BASE_URL || 'https://api.openai.com/v1'}
239
- />
240
- </Field>
241
- </>
227
+
228
+ {/* 4. Test after all fields, tests the complete configuration */}
229
+ {renderTestButton(provider, !!currentConfig.apiKey, !!activeEnvKey)}
230
+ </div>
242
231
  )}
243
232
 
244
233
  {/* Inline warnings */}
@@ -307,7 +296,8 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
307
296
  </Select>
308
297
  </SettingRow>
309
298
 
310
- {provider === 'anthropic' && (
299
+ {/* Thinking show for providers that support it */}
300
+ {preset?.supportsThinking && (
311
301
  <>
312
302
  <SettingRow label={t.settings.agent.thinking} hint={t.settings.agent.thinkingHint}>
313
303
  <Toggle checked={data.agent?.enableThinking ?? false} onChange={() => updateAgent({ enableThinking: !(data.agent?.enableThinking ?? false) })} />
@@ -341,29 +331,45 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
341
331
  /* ── Model Input with "List models" picker ── */
342
332
 
343
333
  function ModelInput({
344
- value, onChange, placeholder, provider, apiKey, envKey, baseUrl, t,
334
+ value, onChange, placeholder, provider, apiKey, envKey, baseUrl, supportsListModels, t,
345
335
  }: {
346
336
  value: string;
347
337
  onChange: (v: string) => void;
348
338
  placeholder: string;
349
- provider: 'anthropic' | 'openai';
339
+ provider: ProviderId;
350
340
  apiKey: string;
351
341
  envKey?: boolean;
352
342
  baseUrl?: string;
343
+ supportsListModels: boolean;
353
344
  t: AiTabProps['t'];
354
345
  }) {
355
346
  const [models, setModels] = useState<string[] | null>(null);
356
347
  const [loading, setLoading] = useState(false);
357
348
  const [open, setOpen] = useState(false);
358
349
  const [error, setError] = useState('');
350
+ const [focused, setFocused] = useState(false);
351
+ const [highlightIdx, setHighlightIdx] = useState(-1);
359
352
  const containerRef = useRef<HTMLDivElement>(null);
353
+ const listRef = useRef<HTMLDivElement>(null);
354
+ const fetchedRef = useRef(false);
355
+ const fetchVersionRef = useRef(0);
356
+ const loadingRef = useRef(false);
360
357
 
361
- const hasKey = !!apiKey || !!envKey;
358
+ const hasKey = !!apiKey || !!envKey || !!PROVIDER_PRESETS[provider]?.apiKeyFallback;
362
359
 
363
- const fetchModels = useCallback(async () => {
364
- if (loading) return;
360
+ // Reset fetched cache when provider/key/baseUrl changes
361
+ useEffect(() => {
362
+ fetchedRef.current = false;
363
+ fetchVersionRef.current++;
364
+ setModels(null);
365
+ }, [provider, apiKey, baseUrl]);
366
+
367
+ const fetchModels = useCallback(async (silent = false) => {
368
+ if (loadingRef.current) return;
369
+ loadingRef.current = true;
365
370
  setLoading(true);
366
- setError('');
371
+ if (!silent) setError('');
372
+ const version = fetchVersionRef.current;
367
373
  try {
368
374
  const body: Record<string, string> = { provider };
369
375
  if (apiKey) body.apiKey = apiKey;
@@ -374,67 +380,133 @@ function ModelInput({
374
380
  headers: { 'Content-Type': 'application/json' },
375
381
  body: JSON.stringify(body),
376
382
  });
383
+ if (version !== fetchVersionRef.current) return;
377
384
  const json = await res.json();
385
+ if (version !== fetchVersionRef.current) return;
378
386
  if (json.ok && Array.isArray(json.models)) {
379
387
  setModels(json.models);
380
- setOpen(true);
381
- } else {
388
+ fetchedRef.current = true;
389
+ if (!silent) setOpen(true);
390
+ } else if (!silent) {
382
391
  setError(json.error || 'Failed to fetch models');
383
392
  }
384
393
  } catch {
385
- setError('Network error');
394
+ if (version !== fetchVersionRef.current) return;
395
+ if (!silent) setError('Network error');
386
396
  } finally {
397
+ loadingRef.current = false;
387
398
  setLoading(false);
388
399
  }
389
- }, [provider, apiKey, baseUrl, loading]);
400
+ }, [provider, apiKey, baseUrl]);
401
+
402
+ const handleFocus = useCallback(() => {
403
+ setFocused(true);
404
+ if (!fetchedRef.current && supportsListModels && hasKey && !loadingRef.current) {
405
+ fetchModels(true);
406
+ }
407
+ }, [supportsListModels, hasKey, fetchModels]);
390
408
 
409
+ // Filtered models for typeahead
410
+ const filtered = useMemo(() => {
411
+ if (!models || !value.trim()) return models ?? [];
412
+ const q = value.toLowerCase();
413
+ return models.filter(m => m.toLowerCase().includes(q));
414
+ }, [models, value]);
415
+
416
+ // Show typeahead when focused + models loaded + user is typing (or Browse was clicked)
417
+ const showDropdown = open || (focused && models !== null && value.trim().length > 0 && filtered.length > 0);
418
+
419
+ // Reset highlight when filtered list changes
420
+ useEffect(() => { setHighlightIdx(-1); }, [filtered]);
421
+
422
+ // Scroll highlighted item into view
391
423
  useEffect(() => {
392
- if (!open) return;
424
+ if (highlightIdx < 0 || !listRef.current) return;
425
+ const items = listRef.current.querySelectorAll('[data-model-item]');
426
+ items[highlightIdx]?.scrollIntoView({ block: 'nearest' });
427
+ }, [highlightIdx]);
428
+
429
+ const handleKeyDown = useCallback((e: React.KeyboardEvent) => {
430
+ const items = showDropdown ? filtered : [];
431
+ if (!items.length) return;
432
+
433
+ if (e.key === 'ArrowDown') {
434
+ e.preventDefault();
435
+ setHighlightIdx(i => (i + 1) % items.length);
436
+ } else if (e.key === 'ArrowUp') {
437
+ e.preventDefault();
438
+ setHighlightIdx(i => (i - 1 + items.length) % items.length);
439
+ } else if (e.key === 'Enter' && highlightIdx >= 0 && highlightIdx < items.length) {
440
+ e.preventDefault();
441
+ onChange(items[highlightIdx]);
442
+ setOpen(false);
443
+ setFocused(false);
444
+ } else if (e.key === 'Escape') {
445
+ setOpen(false);
446
+ setFocused(false);
447
+ }
448
+ }, [showDropdown, filtered, highlightIdx, onChange]);
449
+
450
+ useEffect(() => {
451
+ if (!showDropdown) return;
393
452
  function handleClickOutside(e: MouseEvent) {
394
453
  if (containerRef.current && !containerRef.current.contains(e.target as Node)) {
395
454
  setOpen(false);
455
+ setFocused(false);
396
456
  }
397
457
  }
398
458
  document.addEventListener('mousedown', handleClickOutside);
399
459
  return () => document.removeEventListener('mousedown', handleClickOutside);
400
- }, [open]);
460
+ }, [showDropdown]);
461
+
462
+ const displayList = filtered;
401
463
 
402
464
  return (
403
465
  <div ref={containerRef} className="relative">
404
466
  <div className="flex gap-1.5">
405
467
  <Input
406
468
  value={value}
407
- onChange={e => onChange(e.target.value)}
469
+ onChange={e => { onChange(e.target.value); if (!open) setFocused(true); }}
470
+ onFocus={handleFocus}
471
+ onKeyDown={handleKeyDown}
408
472
  placeholder={placeholder}
409
473
  className="flex-1"
474
+ autoComplete="off"
410
475
  />
411
- <button
412
- type="button"
413
- disabled={!hasKey || loading}
414
- onClick={fetchModels}
415
- title={t.settings.ai.listModels}
416
- className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-lg border border-border text-muted-foreground hover:text-foreground hover:border-foreground/20 transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0"
417
- >
418
- {loading ? <Loader2 size={12} className="animate-spin" /> : <ChevronDown size={12} />}
419
- {t.settings.ai.listModels}
420
- </button>
476
+ {supportsListModels && (
477
+ <button
478
+ type="button"
479
+ disabled={!hasKey || loading}
480
+ onClick={() => fetchModels(false)}
481
+ title={t.settings.ai.listModels}
482
+ className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-lg border border-border text-muted-foreground hover:text-foreground hover:border-foreground/20 transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0"
483
+ >
484
+ {loading ? <Loader2 size={12} className="animate-spin" /> : <ChevronDown size={12} />}
485
+ {t.settings.ai.listModels}
486
+ </button>
487
+ )}
421
488
  </div>
422
489
  {error && <p className="text-xs text-error mt-1">{error}</p>}
423
- {open && models && models.length > 0 && (
424
- <div className="absolute z-50 mt-1 w-full max-h-48 overflow-y-auto rounded-lg border border-border bg-popover shadow-lg">
425
- {models.map(m => (
490
+ {showDropdown && displayList.length > 0 && (
491
+ <div ref={listRef} className="absolute z-50 mt-1 w-full max-h-48 overflow-y-auto rounded-lg border border-border bg-popover shadow-lg">
492
+ {displayList.map((m, i) => (
426
493
  <button
427
494
  key={m}
428
495
  type="button"
429
- className={`w-full text-left px-3 py-1.5 text-sm hover:bg-accent transition-colors ${m === value ? 'bg-accent/60 font-medium' : ''}`}
430
- onClick={() => { onChange(m); setOpen(false); }}
496
+ data-model-item
497
+ className={`w-full text-left px-3 py-1.5 text-sm transition-colors ${
498
+ m === value ? 'bg-accent/60 font-medium'
499
+ : i === highlightIdx ? 'bg-accent'
500
+ : 'hover:bg-accent'
501
+ }`}
502
+ onClick={() => { onChange(m); setOpen(false); setFocused(false); }}
431
503
  >
432
504
  {m}
433
505
  </button>
434
506
  ))}
435
507
  </div>
436
508
  )}
437
- {open && models && models.length === 0 && (
509
+ {open && displayList.length === 0 && (
438
510
  <div className="absolute z-50 mt-1 w-full rounded-lg border border-border bg-popover shadow-lg px-3 py-2 text-xs text-muted-foreground">
439
511
  {t.settings.ai.noModelsFound}
440
512
  </div>
@@ -460,7 +532,6 @@ function AskDisplayMode() {
460
532
  const next = value as 'panel' | 'popup';
461
533
  setMode(next);
462
534
  try { localStorage.setItem('ask-mode', next); } catch (err) { console.warn("[AiTab] localStorage setItem ask-mode failed:", err); }
463
- // Notify SidebarLayout to pick up the change
464
535
  window.dispatchEvent(new StorageEvent('storage', { key: 'ask-mode', newValue: next }));
465
536
  };
466
537
 
@@ -59,10 +59,55 @@ export function AppearanceTab({ font, setFont, fontSize, setFontSize, contentWid
59
59
  return (
60
60
  <div className="space-y-4">
61
61
 
62
- {/* ── Card 1: Readingfont, size, width ── */}
63
- <SettingCard icon={<BookOpen size={15} />} title={a.readingTitle ?? 'Reading'} description={a.readingDesc ?? 'Customize how your notes look'}>
62
+ {/* ── Card 1: Preferencestheme, language ── */}
63
+ <SettingCard icon={<Palette size={15} />} title={a.preferencesTitle ?? 'Preferences'}>
64
+
65
+ {/* ── Theme — amber pills ── */}
66
+ <SettingGroup icon={<Sun size={14} />} label={a.colorTheme}>
67
+ <PillSelector
68
+ options={[
69
+ { value: 'system', label: a.system, icon: <Monitor size={14} /> },
70
+ { value: 'dark', label: a.dark, icon: <Moon size={14} /> },
71
+ { value: 'light', label: a.light, icon: <Sun size={14} /> },
72
+ ]}
73
+ value={themePref}
74
+ onChange={v => {
75
+ setThemePref(v);
76
+ localStorage.setItem('theme', v);
77
+ const isDark = v === 'system'
78
+ ? window.matchMedia('(prefers-color-scheme: dark)').matches
79
+ : v === 'dark';
80
+ setDark(isDark);
81
+ document.documentElement.classList.toggle('dark', isDark);
82
+ }}
83
+ />
84
+ </SettingGroup>
64
85
 
65
- {/* ── Fonteach font previews itself ── */}
86
+ {/* ── Languageamber pills ── */}
87
+ <SettingGroup icon={<Globe size={14} />} label={a.language}>
88
+ <PillSelector
89
+ options={[
90
+ { value: 'system', label: a.system, icon: <Monitor size={14} /> },
91
+ { value: 'en', label: 'EN' },
92
+ { value: 'zh', label: '中文' },
93
+ ]}
94
+ value={localePref}
95
+ onChange={v => {
96
+ setLocalePref(v);
97
+ localStorage.setItem('locale', v);
98
+ const resolved: Locale = v === 'system'
99
+ ? (navigator.language.startsWith('zh') ? 'zh' : 'en')
100
+ : v as Locale;
101
+ setLocale(resolved);
102
+ document.cookie = `locale=${resolved};path=/;max-age=31536000;SameSite=Lax`;
103
+ }}
104
+ />
105
+ </SettingGroup>
106
+
107
+ </SettingCard>
108
+
109
+ {/* ── Card 2: Reading — font, size, width ── */}
110
+ <SettingCard icon={<BookOpen size={15} />} title={a.readingTitle ?? 'Reading'} description={a.readingDesc ?? 'Customize how your notes look'}>
66
111
  <SettingGroup icon={<Type size={14} />} label={a.readingFont}>
67
112
  <div className="space-y-0.5">
68
113
  {FONTS.map(f => {
@@ -191,53 +236,6 @@ export function AppearanceTab({ font, setFont, fontSize, setFontSize, contentWid
191
236
 
192
237
  </SettingCard>
193
238
 
194
- {/* ── Card 2: Preferences — theme, language ── */}
195
- <SettingCard icon={<Palette size={15} />} title={a.preferencesTitle ?? 'Preferences'}>
196
-
197
- {/* ── Theme — amber pills ── */}
198
- <SettingGroup icon={<Sun size={14} />} label={a.colorTheme}>
199
- <PillSelector
200
- options={[
201
- { value: 'system', label: a.system, icon: <Monitor size={14} /> },
202
- { value: 'dark', label: a.dark, icon: <Moon size={14} /> },
203
- { value: 'light', label: a.light, icon: <Sun size={14} /> },
204
- ]}
205
- value={themePref}
206
- onChange={v => {
207
- setThemePref(v);
208
- localStorage.setItem('theme', v);
209
- const isDark = v === 'system'
210
- ? window.matchMedia('(prefers-color-scheme: dark)').matches
211
- : v === 'dark';
212
- setDark(isDark);
213
- document.documentElement.classList.toggle('dark', isDark);
214
- }}
215
- />
216
- </SettingGroup>
217
-
218
- {/* ── Language — amber pills ── */}
219
- <SettingGroup icon={<Globe size={14} />} label={a.language}>
220
- <PillSelector
221
- options={[
222
- { value: 'system', label: a.system, icon: <Monitor size={14} /> },
223
- { value: 'en', label: 'EN' },
224
- { value: 'zh', label: '中文' },
225
- ]}
226
- value={localePref}
227
- onChange={v => {
228
- setLocalePref(v);
229
- localStorage.setItem('locale', v);
230
- const resolved: Locale = v === 'system'
231
- ? (navigator.language.startsWith('zh') ? 'zh' : 'en')
232
- : v as Locale;
233
- setLocale(resolved);
234
- document.cookie = `locale=${resolved};path=/;max-age=31536000;SameSite=Lax`;
235
- }}
236
- />
237
- </SettingGroup>
238
-
239
- </SettingCard>
240
-
241
239
  <p className="text-xs text-muted-foreground/40 px-0.5">{a.browserNote}</p>
242
240
 
243
241
  {/* ── Keyboard Shortcuts ── */}