@geminilight/mindos 0.6.52 → 0.6.54

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 (529) hide show
  1. package/README.md +27 -5
  2. package/README_zh.md +27 -5
  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 +17 -14
  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 +18 -2
  12. package/_standalone/.next/routes-manifest.json +18 -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.js +1 -1
  15. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  16. package/_standalone/.next/server/app/_global-error.html +2 -2
  17. package/_standalone/.next/server/app/_global-error.rsc +2 -2
  18. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  19. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  22. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  23. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  24. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  25. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  28. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/agents/page.js +3 -3
  31. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  32. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  41. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/ask/route.js +44 -16
  44. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  45. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  51. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  53. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/export/route.js +2 -2
  55. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  56. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  59. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  60. package/_standalone/.next/server/app/api/file/raw/route.js +1 -0
  61. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -0
  62. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -0
  63. package/_standalone/.next/server/app/api/file/route.js +1 -1
  64. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  65. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  67. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  69. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  71. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/inbox/route.js +1 -1
  74. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  75. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  77. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
  84. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  89. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/restart/route.js +1 -1
  91. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  93. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  97. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  98. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  100. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/setup/route.js +1 -1
  106. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/sync/route.js +1 -1
  109. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  111. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/update/route.js +1 -1
  114. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  118. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/changes/page.js +2 -2
  120. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  121. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  122. package/_standalone/.next/server/app/echo/[segment]/page.js +3 -3
  123. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  124. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/echo/page.js +1 -1
  126. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  127. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/explore/page.js +2 -2
  129. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  130. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/help/page.js +2 -2
  132. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  133. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  134. package/_standalone/.next/server/app/inbox/history/page.js +2 -0
  135. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -0
  136. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -0
  137. package/_standalone/.next/server/app/login/page.js +2 -2
  138. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  139. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  140. package/_standalone/.next/server/app/page.js +3 -3
  141. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  142. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  143. package/_standalone/.next/server/app/setup/page.js +2 -2
  144. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  145. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  146. package/_standalone/.next/server/app/trash/page.js +3 -3
  147. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  148. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  149. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  150. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  151. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  152. package/_standalone/.next/server/app/wiki/page.js +2 -0
  153. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -0
  154. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -0
  155. package/_standalone/.next/server/app-paths-manifest.json +17 -14
  156. package/_standalone/.next/server/chunks/2190.js +2 -2
  157. package/_standalone/.next/server/chunks/2364.js +2 -0
  158. package/_standalone/.next/server/chunks/357.js +1 -0
  159. package/_standalone/.next/server/chunks/530.js +219 -0
  160. package/_standalone/.next/server/chunks/6054.js +52 -0
  161. package/_standalone/.next/server/chunks/6539.js +1 -1
  162. package/_standalone/.next/server/chunks/8388.js +2 -2
  163. package/_standalone/.next/server/chunks/953.js +4 -4
  164. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  165. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  166. package/_standalone/.next/server/next-font-manifest.js +1 -1
  167. package/_standalone/.next/server/next-font-manifest.json +1 -1
  168. package/_standalone/.next/server/pages/500.html +2 -2
  169. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  170. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  171. package/_standalone/.next/static/2hrwFOLEOZhHQHfrIt-Dw/_buildManifest.js +1 -0
  172. package/_standalone/.next/static/chunks/1053-2874859f7caefa0f.js +29 -0
  173. package/_standalone/.next/static/chunks/178-105779afb62d36d9.js +1 -0
  174. package/_standalone/.next/static/chunks/1814.b08e9fb85dd3b13c.js +1 -0
  175. package/_standalone/.next/static/chunks/{1880-3ec02adc80531825.js → 1880-7abf971bcfd2389b.js} +2 -2
  176. package/_standalone/.next/static/chunks/{3160-83a7e0b94414b3ac.js → 2218-d54538000574ffef.js} +1 -1
  177. package/_standalone/.next/static/chunks/254-32719a9bea2e74f0.js +1 -0
  178. package/_standalone/.next/static/chunks/362.a77be2f206db7b19.js +1 -0
  179. package/_standalone/.next/static/chunks/4237-ffc6e7c15d4007b6.js +1 -0
  180. package/_standalone/.next/static/chunks/7035-2af69391c7b1ad95.js +1 -0
  181. package/_standalone/.next/static/chunks/7322-d67d05067544864c.js +1 -0
  182. package/_standalone/.next/static/chunks/{6926-4af497b83952fa87.js → 8409-de5726a4a278d28f.js} +1 -1
  183. package/_standalone/.next/static/chunks/8753-ea9db680b0f70f25.js +1 -0
  184. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-b07a5983e85bc5e3.js → route-e240db6d5049d336.js} +1 -1
  185. package/_standalone/.next/static/chunks/app/_global-error/{page-b07a5983e85bc5e3.js → page-e240db6d5049d336.js} +1 -1
  186. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-f006a70f6889eb56.js +1 -0
  187. package/_standalone/.next/static/chunks/app/agents/page-bd522e428e3acb78.js +5 -0
  188. package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-b07a5983e85bc5e3.js → route-e240db6d5049d336.js} +1 -1
  189. package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-b07a5983e85bc5e3.js → route-e240db6d5049d336.js} +1 -1
  190. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e240db6d5049d336.js +1 -0
  191. package/_standalone/.next/static/chunks/app/api/a2a/route-e240db6d5049d336.js +1 -0
  192. package/_standalone/.next/static/chunks/app/api/acp/config/route-e240db6d5049d336.js +1 -0
  193. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e240db6d5049d336.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/acp/install/route-e240db6d5049d336.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e240db6d5049d336.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/acp/session/route-e240db6d5049d336.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e240db6d5049d336.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/ask/route-e240db6d5049d336.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e240db6d5049d336.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/auth/route-e240db6d5049d336.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/backlinks/route-e240db6d5049d336.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e240db6d5049d336.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/changes/route-e240db6d5049d336.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/export/route-e240db6d5049d336.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e240db6d5049d336.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/file/import/route-e240db6d5049d336.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/file/raw/route-e240db6d5049d336.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/file/route-e240db6d5049d336.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/files/route-e240db6d5049d336.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/git/route-e240db6d5049d336.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/graph/route-e240db6d5049d336.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/health/route-e240db6d5049d336.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/inbox/route-e240db6d5049d336.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/init/route-e240db6d5049d336.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e240db6d5049d336.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e240db6d5049d336.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e240db6d5049d336.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e240db6d5049d336.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e240db6d5049d336.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e240db6d5049d336.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/monitoring/route-e240db6d5049d336.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/recent-files/route-e240db6d5049d336.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/restart/route-e240db6d5049d336.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/search/route-e240db6d5049d336.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e240db6d5049d336.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e240db6d5049d336.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/settings/route-e240db6d5049d336.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e240db6d5049d336.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e240db6d5049d336.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e240db6d5049d336.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e240db6d5049d336.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e240db6d5049d336.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/setup/route-e240db6d5049d336.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/skills/route-e240db6d5049d336.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/sync/route-e240db6d5049d336.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/tree-version/route-e240db6d5049d336.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/uninstall/route-e240db6d5049d336.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/update/route-e240db6d5049d336.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/update-check/route-e240db6d5049d336.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/update-status/route-e240db6d5049d336.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/workflows/route-e240db6d5049d336.js +1 -0
  242. package/_standalone/.next/static/chunks/app/changes/page-5a72144d1080a699.js +1 -0
  243. package/_standalone/.next/static/chunks/app/echo/[segment]/{page-88df174dd64b2c76.js → page-6710da1f581b2854.js} +2 -2
  244. package/_standalone/.next/static/chunks/app/echo/page-e240db6d5049d336.js +1 -0
  245. package/_standalone/.next/static/chunks/app/explore/{page-5eb2835e9e3ab4bb.js → page-d3d99308146c2240.js} +1 -1
  246. package/_standalone/.next/static/chunks/app/global-error-c37d50db6128ec01.js +1 -0
  247. package/_standalone/.next/static/chunks/app/help/page-222df603080b5fab.js +1 -0
  248. package/_standalone/.next/static/chunks/app/inbox/history/page-07819cf95cb0805f.js +1 -0
  249. package/_standalone/.next/static/chunks/app/layout-8eacff5813458190.js +186 -0
  250. package/_standalone/.next/static/chunks/app/loading-e240db6d5049d336.js +1 -0
  251. package/_standalone/.next/static/chunks/app/login/{page-24236460fa7c11d0.js → page-0eeef685052869a6.js} +1 -1
  252. package/_standalone/.next/static/chunks/app/page-5a6c9455efe8a0df.js +7 -0
  253. package/_standalone/.next/static/chunks/app/setup/{page-99f40e9337388cda.js → page-9a81fa4d82c6351b.js} +1 -1
  254. package/_standalone/.next/static/chunks/app/trash/page-72d0ae3649ac4b6c.js +1 -0
  255. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e240db6d5049d336.js +1 -0
  256. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-fc04c2bd4f35bc6f.js +1 -0
  257. package/_standalone/.next/static/chunks/app/view/[...path]/page-e8699f96589c0979.js +12 -0
  258. package/_standalone/.next/static/chunks/app/wiki/page-d492256a93f0b8bc.js +1 -0
  259. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e240db6d5049d336.js +1 -0
  260. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e240db6d5049d336.js +1 -0
  261. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e240db6d5049d336.js +1 -0
  262. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e240db6d5049d336.js +1 -0
  263. package/_standalone/.next/static/chunks/{webpack-bbd44cbc83dc0aa4.js → webpack-73c9da80c6c1ebfe.js} +1 -1
  264. package/_standalone/.next/static/css/66f8a81e4eda06d4.css +1 -0
  265. package/_standalone/.next/static/css/a4a2b71142b311af.css +31 -0
  266. package/_standalone/.next/trace +64 -64
  267. package/_standalone/.next/types/routes.d.ts +5 -2
  268. package/_standalone/.next/types/validator.ts +27 -0
  269. package/_standalone/__tests__/agents/agents-content-dashboard.test.tsx +1 -0
  270. package/_standalone/__tests__/agents/agents-content-model.test.ts +13 -0
  271. package/_standalone/__tests__/core/inbox.test.ts +168 -0
  272. package/_standalone/__tests__/core/sync.test.ts +37 -0
  273. package/_standalone/__tests__/panels/agents-panel-hub.test.tsx +1 -0
  274. package/_standalone/app/globals.css +29 -3
  275. package/_standalone/components/ActivityBar.tsx +9 -9
  276. package/_standalone/components/AskFab.tsx +1 -1
  277. package/_standalone/components/Backlinks.tsx +1 -1
  278. package/_standalone/components/Breadcrumb.tsx +1 -1
  279. package/_standalone/components/CreateSpaceModal.tsx +1 -1
  280. package/_standalone/components/EchoSpotlight.tsx +14 -10
  281. package/_standalone/components/Editor.tsx +1 -1
  282. package/_standalone/components/ExportModal.tsx +3 -3
  283. package/_standalone/components/FileTree.tsx +6 -11
  284. package/_standalone/components/GuideCard.tsx +1 -1
  285. package/_standalone/components/ImportModal.tsx +1 -2
  286. package/_standalone/components/KeyboardShortcuts.tsx +1 -1
  287. package/_standalone/components/MarkdownEditor.tsx +1 -1
  288. package/_standalone/components/OnboardingView.tsx +2 -2
  289. package/_standalone/components/OrganizeToast.tsx +3 -1
  290. package/_standalone/components/Panel.tsx +27 -6
  291. package/_standalone/components/Sidebar.tsx +1 -1
  292. package/_standalone/components/SidebarLayout.tsx +30 -7
  293. package/_standalone/components/SystemPulse.tsx +16 -16
  294. package/_standalone/components/agents/AgentsOverviewSection.tsx +18 -92
  295. package/_standalone/components/agents/AgentsPanelA2aTab.tsx +67 -66
  296. package/_standalone/components/agents/AgentsPrimitives.tsx +1 -1
  297. package/_standalone/components/agents/RecentActivityFeed.tsx +6 -6
  298. package/_standalone/components/agents/SkillDetailPopover.tsx +1 -1
  299. package/_standalone/components/ask/AskHeader.tsx +1 -1
  300. package/_standalone/components/echo/EchoHero.tsx +1 -1
  301. package/_standalone/components/echo/EchoPageSections.tsx +1 -1
  302. package/_standalone/components/explore/UseCaseCard.tsx +1 -1
  303. package/_standalone/components/home/InboxSection.tsx +262 -54
  304. package/_standalone/components/panels/AgentsPanel.tsx +4 -3
  305. package/_standalone/components/panels/AgentsPanelAgentDetail.tsx +1 -1
  306. package/_standalone/components/panels/AgentsPanelHubNav.tsx +10 -6
  307. package/_standalone/components/panels/PanelHeader.tsx +1 -1
  308. package/_standalone/components/renderers/audio/AudioRenderer.tsx +79 -0
  309. package/_standalone/components/renderers/image/ImageRenderer.tsx +203 -0
  310. package/_standalone/components/renderers/pdf/PdfRenderer.tsx +57 -0
  311. package/_standalone/components/renderers/video/VideoRenderer.tsx +91 -0
  312. package/_standalone/components/settings/McpTab.tsx +154 -28
  313. package/_standalone/components/settings/PluginsTab.tsx +1 -1
  314. package/_standalone/components/settings/SettingsContent.tsx +41 -7
  315. package/_standalone/components/settings/types.ts +7 -1
  316. package/_standalone/components/walkthrough/WalkthroughOverlay.tsx +40 -11
  317. package/_standalone/components/walkthrough/WalkthroughTooltip.tsx +1 -1
  318. package/_standalone/hooks/useAiOrganize.ts +14 -1
  319. package/_standalone/lib/organize-history.ts +6 -0
  320. package/_standalone/lib/stores/walkthrough-store.ts +33 -1
  321. package/_standalone/tsconfig.tsbuildinfo +1 -1
  322. package/app/app/api/ask/route.ts +193 -3
  323. package/app/app/api/file/raw/route.ts +121 -0
  324. package/app/app/api/file/route.ts +21 -0
  325. package/app/app/api/inbox/route.ts +38 -2
  326. package/app/app/api/mcp/status/route.ts +1 -0
  327. package/app/app/api/restart/route.ts +26 -21
  328. package/app/app/api/settings/route.ts +13 -0
  329. package/app/app/api/setup/route.ts +11 -1
  330. package/app/app/api/sync/route.ts +36 -13
  331. package/app/app/api/update/route.ts +24 -10
  332. package/app/app/global-error.tsx +3 -3
  333. package/app/app/globals.css +29 -3
  334. package/app/app/inbox/history/page.tsx +250 -0
  335. package/app/app/layout.tsx +5 -11
  336. package/app/app/login/page.tsx +1 -1
  337. package/app/app/view/[...path]/ViewPageClient.tsx +15 -10
  338. package/app/app/view/[...path]/not-found.tsx +1 -1
  339. package/app/app/view/[...path]/page.tsx +32 -1
  340. package/app/app/wiki/page.tsx +58 -0
  341. package/app/components/ActivityBar.tsx +9 -9
  342. package/app/components/AskFab.tsx +1 -1
  343. package/app/components/Backlinks.tsx +1 -1
  344. package/app/components/Breadcrumb.tsx +1 -1
  345. package/app/components/CreateSpaceModal.tsx +1 -1
  346. package/app/components/DirView.tsx +2 -2
  347. package/app/components/EchoSpotlight.tsx +14 -10
  348. package/app/components/Editor.tsx +1 -1
  349. package/app/components/ExportModal.tsx +3 -3
  350. package/app/components/FileTree.tsx +6 -11
  351. package/app/components/GuideCard.tsx +1 -1
  352. package/app/components/HomeContent.tsx +50 -39
  353. package/app/components/ImportModal.tsx +1 -2
  354. package/app/components/KeyboardShortcuts.tsx +1 -1
  355. package/app/components/MarkdownEditor.tsx +1 -1
  356. package/app/components/OnboardingView.tsx +2 -2
  357. package/app/components/OrganizeToast.tsx +3 -1
  358. package/app/components/Panel.tsx +27 -6
  359. package/app/components/Sidebar.tsx +1 -1
  360. package/app/components/SidebarLayout.tsx +30 -7
  361. package/app/components/SystemPulse.tsx +16 -16
  362. package/app/components/TrashPageClient.tsx +8 -6
  363. package/app/components/UpdateOverlay.tsx +1 -1
  364. package/app/components/WikiHomeContent.tsx +273 -0
  365. package/app/components/agents/AgentDetailContent.tsx +5 -5
  366. package/app/components/agents/AgentsContentPage.tsx +14 -3
  367. package/app/components/agents/AgentsOverviewSection.tsx +18 -92
  368. package/app/components/agents/AgentsPanelA2aTab.tsx +67 -66
  369. package/app/components/agents/AgentsPrimitives.tsx +1 -1
  370. package/app/components/agents/RecentActivityFeed.tsx +6 -6
  371. package/app/components/agents/SkillDetailPopover.tsx +1 -1
  372. package/app/components/agents/agents-content-model.ts +4 -1
  373. package/app/components/ask/AskHeader.tsx +1 -1
  374. package/app/components/changes/ChangesContentPage.tsx +10 -6
  375. package/app/components/echo/EchoHero.tsx +1 -1
  376. package/app/components/echo/EchoPageSections.tsx +1 -1
  377. package/app/components/explore/ExploreContent.tsx +1 -1
  378. package/app/components/explore/UseCaseCard.tsx +1 -1
  379. package/app/components/help/HelpContent.tsx +3 -3
  380. package/app/components/home/InboxSection.tsx +262 -54
  381. package/app/components/panels/AgentsPanel.tsx +4 -3
  382. package/app/components/panels/AgentsPanelAgentDetail.tsx +1 -1
  383. package/app/components/panels/AgentsPanelHubNav.tsx +10 -6
  384. package/app/components/panels/PanelHeader.tsx +1 -1
  385. package/app/components/renderers/audio/AudioRenderer.tsx +79 -0
  386. package/app/components/renderers/audio/manifest.ts +17 -0
  387. package/app/components/renderers/image/ImageRenderer.tsx +203 -0
  388. package/app/components/renderers/image/manifest.ts +17 -0
  389. package/app/components/renderers/pdf/PdfRenderer.tsx +57 -0
  390. package/app/components/renderers/pdf/manifest.ts +15 -0
  391. package/app/components/renderers/video/VideoRenderer.tsx +91 -0
  392. package/app/components/renderers/video/manifest.ts +17 -0
  393. package/app/components/settings/McpTab.tsx +154 -28
  394. package/app/components/settings/PluginsTab.tsx +1 -1
  395. package/app/components/settings/SettingsContent.tsx +41 -7
  396. package/app/components/settings/types.ts +7 -1
  397. package/app/components/setup/index.tsx +4 -3
  398. package/app/components/walkthrough/WalkthroughOverlay.tsx +40 -11
  399. package/app/components/walkthrough/WalkthroughTooltip.tsx +1 -1
  400. package/app/hooks/useAiOrganize.ts +14 -1
  401. package/app/lib/agent/model.ts +2 -1
  402. package/app/lib/core/inbox.ts +131 -2
  403. package/app/lib/core/pdf-text.ts +28 -0
  404. package/app/lib/core/search-index.ts +29 -5
  405. package/app/lib/core/tree.ts +6 -1
  406. package/app/lib/fs.ts +31 -3
  407. package/app/lib/i18n/modules/ai-chat.ts +42 -0
  408. package/app/lib/i18n/modules/knowledge.ts +30 -0
  409. package/app/lib/i18n/modules/navigation.ts +4 -2
  410. package/app/lib/i18n/modules/panels.ts +22 -4
  411. package/app/lib/i18n/modules/settings.ts +26 -0
  412. package/app/lib/organize-history.ts +6 -0
  413. package/app/lib/renderers/index.ts +5 -1
  414. package/app/lib/settings.ts +60 -0
  415. package/app/lib/stores/walkthrough-store.ts +33 -1
  416. package/bin/commands/doctor.js +12 -6
  417. package/bin/commands/file.js +7 -4
  418. package/bin/commands/logs.js +39 -4
  419. package/bin/commands/onboard.js +1 -1
  420. package/bin/commands/open.js +6 -1
  421. package/bin/commands/space.js +7 -4
  422. package/bin/commands/update.js +31 -29
  423. package/bin/lib/build.js +19 -8
  424. package/bin/lib/clean-env.js +38 -0
  425. package/bin/lib/cli-shim.js +67 -2
  426. package/bin/lib/config.js +4 -5
  427. package/bin/lib/gateway.js +51 -27
  428. package/bin/lib/jsonc.js +7 -2
  429. package/bin/lib/mcp-agents.js +26 -5
  430. package/bin/lib/path-expand.js +6 -3
  431. package/bin/lib/port.js +5 -1
  432. package/bin/lib/stop.js +98 -41
  433. package/bin/lib/sync.js +1 -1
  434. package/package.json +1 -1
  435. package/scripts/setup.js +7 -5
  436. package/_standalone/.next/server/chunks/2673.js +0 -52
  437. package/_standalone/.next/server/chunks/5648.js +0 -2
  438. package/_standalone/.next/server/chunks/8408.js +0 -219
  439. package/_standalone/.next/static/IiTZbEzZo8l5MSUxlDwKp/_buildManifest.js +0 -1
  440. package/_standalone/.next/static/chunks/1053-c519cb347faa75e2.js +0 -29
  441. package/_standalone/.next/static/chunks/1814.72f7fe7c61e2b647.js +0 -1
  442. package/_standalone/.next/static/chunks/362.4c226d7887d5f696.js +0 -1
  443. package/_standalone/.next/static/chunks/6357-c645842834c0d4cd.js +0 -1
  444. package/_standalone/.next/static/chunks/6981-3d7dcac2d12a5670.js +0 -1
  445. package/_standalone/.next/static/chunks/7035-032641fb6f4e07b2.js +0 -1
  446. package/_standalone/.next/static/chunks/7144-5febf62f1a79fe64.js +0 -1
  447. package/_standalone/.next/static/chunks/9602-423291fdb36396d1.js +0 -1
  448. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-074d6aafc2606561.js +0 -1
  449. package/_standalone/.next/static/chunks/app/agents/page-710d8c80fa86e93e.js +0 -5
  450. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-b07a5983e85bc5e3.js +0 -1
  451. package/_standalone/.next/static/chunks/app/api/a2a/route-b07a5983e85bc5e3.js +0 -1
  452. package/_standalone/.next/static/chunks/app/api/acp/config/route-b07a5983e85bc5e3.js +0 -1
  453. package/_standalone/.next/static/chunks/app/api/acp/detect/route-b07a5983e85bc5e3.js +0 -1
  454. package/_standalone/.next/static/chunks/app/api/acp/install/route-b07a5983e85bc5e3.js +0 -1
  455. package/_standalone/.next/static/chunks/app/api/acp/registry/route-b07a5983e85bc5e3.js +0 -1
  456. package/_standalone/.next/static/chunks/app/api/acp/session/route-b07a5983e85bc5e3.js +0 -1
  457. package/_standalone/.next/static/chunks/app/api/agent-activity/route-b07a5983e85bc5e3.js +0 -1
  458. package/_standalone/.next/static/chunks/app/api/ask/route-b07a5983e85bc5e3.js +0 -1
  459. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-b07a5983e85bc5e3.js +0 -1
  460. package/_standalone/.next/static/chunks/app/api/auth/route-b07a5983e85bc5e3.js +0 -1
  461. package/_standalone/.next/static/chunks/app/api/backlinks/route-b07a5983e85bc5e3.js +0 -1
  462. package/_standalone/.next/static/chunks/app/api/bootstrap/route-b07a5983e85bc5e3.js +0 -1
  463. package/_standalone/.next/static/chunks/app/api/changes/route-b07a5983e85bc5e3.js +0 -1
  464. package/_standalone/.next/static/chunks/app/api/export/route-b07a5983e85bc5e3.js +0 -1
  465. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-b07a5983e85bc5e3.js +0 -1
  466. package/_standalone/.next/static/chunks/app/api/file/import/route-b07a5983e85bc5e3.js +0 -1
  467. package/_standalone/.next/static/chunks/app/api/file/route-b07a5983e85bc5e3.js +0 -1
  468. package/_standalone/.next/static/chunks/app/api/files/route-b07a5983e85bc5e3.js +0 -1
  469. package/_standalone/.next/static/chunks/app/api/git/route-b07a5983e85bc5e3.js +0 -1
  470. package/_standalone/.next/static/chunks/app/api/graph/route-b07a5983e85bc5e3.js +0 -1
  471. package/_standalone/.next/static/chunks/app/api/health/route-b07a5983e85bc5e3.js +0 -1
  472. package/_standalone/.next/static/chunks/app/api/inbox/route-b07a5983e85bc5e3.js +0 -1
  473. package/_standalone/.next/static/chunks/app/api/init/route-b07a5983e85bc5e3.js +0 -1
  474. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-b07a5983e85bc5e3.js +0 -1
  475. package/_standalone/.next/static/chunks/app/api/mcp/install/route-b07a5983e85bc5e3.js +0 -1
  476. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-b07a5983e85bc5e3.js +0 -1
  477. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-b07a5983e85bc5e3.js +0 -1
  478. package/_standalone/.next/static/chunks/app/api/mcp/status/route-b07a5983e85bc5e3.js +0 -1
  479. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-b07a5983e85bc5e3.js +0 -1
  480. package/_standalone/.next/static/chunks/app/api/monitoring/route-b07a5983e85bc5e3.js +0 -1
  481. package/_standalone/.next/static/chunks/app/api/recent-files/route-b07a5983e85bc5e3.js +0 -1
  482. package/_standalone/.next/static/chunks/app/api/restart/route-b07a5983e85bc5e3.js +0 -1
  483. package/_standalone/.next/static/chunks/app/api/search/route-b07a5983e85bc5e3.js +0 -1
  484. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-b07a5983e85bc5e3.js +0 -1
  485. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-b07a5983e85bc5e3.js +0 -1
  486. package/_standalone/.next/static/chunks/app/api/settings/route-b07a5983e85bc5e3.js +0 -1
  487. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-b07a5983e85bc5e3.js +0 -1
  488. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-b07a5983e85bc5e3.js +0 -1
  489. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-b07a5983e85bc5e3.js +0 -1
  490. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-b07a5983e85bc5e3.js +0 -1
  491. package/_standalone/.next/static/chunks/app/api/setup/ls/route-b07a5983e85bc5e3.js +0 -1
  492. package/_standalone/.next/static/chunks/app/api/setup/route-b07a5983e85bc5e3.js +0 -1
  493. package/_standalone/.next/static/chunks/app/api/skills/route-b07a5983e85bc5e3.js +0 -1
  494. package/_standalone/.next/static/chunks/app/api/sync/route-b07a5983e85bc5e3.js +0 -1
  495. package/_standalone/.next/static/chunks/app/api/tree-version/route-b07a5983e85bc5e3.js +0 -1
  496. package/_standalone/.next/static/chunks/app/api/uninstall/route-b07a5983e85bc5e3.js +0 -1
  497. package/_standalone/.next/static/chunks/app/api/update/route-b07a5983e85bc5e3.js +0 -1
  498. package/_standalone/.next/static/chunks/app/api/update-check/route-b07a5983e85bc5e3.js +0 -1
  499. package/_standalone/.next/static/chunks/app/api/update-status/route-b07a5983e85bc5e3.js +0 -1
  500. package/_standalone/.next/static/chunks/app/api/workflows/route-b07a5983e85bc5e3.js +0 -1
  501. package/_standalone/.next/static/chunks/app/changes/page-350992cf5091bc5b.js +0 -1
  502. package/_standalone/.next/static/chunks/app/echo/page-b07a5983e85bc5e3.js +0 -1
  503. package/_standalone/.next/static/chunks/app/global-error-e1ad0e18236ba26c.js +0 -1
  504. package/_standalone/.next/static/chunks/app/help/page-2325d25b6846ca07.js +0 -1
  505. package/_standalone/.next/static/chunks/app/layout-e706f9a963b177ba.js +0 -186
  506. package/_standalone/.next/static/chunks/app/loading-b07a5983e85bc5e3.js +0 -1
  507. package/_standalone/.next/static/chunks/app/page-2595175820acfd65.js +0 -7
  508. package/_standalone/.next/static/chunks/app/trash/page-61c6210fac1e9710.js +0 -1
  509. package/_standalone/.next/static/chunks/app/view/[...path]/loading-b07a5983e85bc5e3.js +0 -1
  510. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-61474670d6bb6116.js +0 -1
  511. package/_standalone/.next/static/chunks/app/view/[...path]/page-798359c36f10ef8d.js +0 -12
  512. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-b07a5983e85bc5e3.js +0 -1
  513. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-b07a5983e85bc5e3.js +0 -1
  514. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-b07a5983e85bc5e3.js +0 -1
  515. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b07a5983e85bc5e3.js +0 -1
  516. package/_standalone/.next/static/css/bbf51803eade6c50.css +0 -31
  517. package/_standalone/.next/static/css/ef1151f74f00d91a.css +0 -1
  518. package/_standalone/lib/i18n/generated/explore-i18n.generated.ts +0 -138
  519. package/_standalone/lib/i18n/index.ts +0 -38
  520. package/_standalone/lib/i18n/modules/ai-chat.ts +0 -237
  521. package/_standalone/lib/i18n/modules/common.ts +0 -71
  522. package/_standalone/lib/i18n/modules/features.ts +0 -153
  523. package/_standalone/lib/i18n/modules/knowledge.ts +0 -727
  524. package/_standalone/lib/i18n/modules/navigation.ts +0 -157
  525. package/_standalone/lib/i18n/modules/onboarding.ts +0 -445
  526. package/_standalone/lib/i18n/modules/panels.ts +0 -1255
  527. package/_standalone/lib/i18n/modules/settings.ts +0 -889
  528. package/_standalone/lib/i18n.ts +0 -3
  529. /package/_standalone/.next/static/{IiTZbEzZo8l5MSUxlDwKp → 2hrwFOLEOZhHQHfrIt-Dw}/_ssgManifest.js +0 -0
@@ -26,7 +26,8 @@ import { AGENT_SYSTEM_PROMPT, ORGANIZE_SYSTEM_PROMPT, CHAT_SYSTEM_PROMPT } from
26
26
  import type { AskModeApi } from '@/lib/types';
27
27
  import { toAgentMessages } from '@/lib/agent/to-agent-messages';
28
28
  import { logAgentOp } from '@/lib/agent/log';
29
- import { readSettings } from '@/lib/settings';
29
+ import { readSettings, readBaseUrlCompat, writeBaseUrlCompat } from '@/lib/settings';
30
+ import { en as i18nEn, zh as i18nZh } from '@/lib/i18n';
30
31
  import { MindOSError, apiError, ErrorCodes } from '@/lib/errors';
31
32
  import { metrics } from '@/lib/metrics';
32
33
  import { assertNotProtected } from '@/lib/core';
@@ -400,6 +401,134 @@ function toPiCustomToolDefinitions(tools: AgentTool<any>[]): ToolDefinition<any,
400
401
  }));
401
402
  }
402
403
 
404
+ // ---------------------------------------------------------------------------
405
+ // Non-streaming fallback for proxies that don't support stream + tools
406
+ // ---------------------------------------------------------------------------
407
+
408
+ /**
409
+ * Mini agent loop using non-streaming OpenAI-compatible API.
410
+ * Used when a proxy silently breaks stream+tools by returning plain text.
411
+ * Emits SSE events identical to the streaming path so the frontend is unaffected.
412
+ */
413
+ async function runNonStreamingFallback(opts: {
414
+ baseUrl: string;
415
+ apiKey: string;
416
+ model: string;
417
+ systemPrompt: string;
418
+ historyMessages: { role: string; content: unknown }[];
419
+ userContent: string;
420
+ tools: AgentTool<any>[];
421
+ send: (event: MindOSSSEvent) => void;
422
+ signal: AbortSignal;
423
+ maxSteps: number;
424
+ }): Promise<void> {
425
+ const { baseUrl, apiKey, model, systemPrompt, historyMessages, userContent, tools, send, signal, maxSteps } = opts;
426
+
427
+ const openaiTools = tools.map(t => ({
428
+ type: 'function' as const,
429
+ function: {
430
+ name: t.name,
431
+ description: t.description ?? '',
432
+ parameters: (t as any).parameters ?? { type: 'object', properties: {} },
433
+ },
434
+ }));
435
+
436
+ const messages: { role: string; content: unknown; tool_calls?: unknown; tool_call_id?: string }[] = [
437
+ { role: 'system', content: systemPrompt },
438
+ ...historyMessages,
439
+ { role: 'user', content: userContent },
440
+ ];
441
+
442
+ const toolMap = new Map(tools.map(t => [t.name, t]));
443
+ const endpoint = `${baseUrl.replace(/\/$/, '')}/chat/completions`;
444
+ let step = 0;
445
+
446
+ while (step < maxSteps) {
447
+ if (signal.aborted) throw new Error('Request aborted');
448
+ step++;
449
+
450
+ const resp = await fetch(endpoint, {
451
+ method: 'POST',
452
+ headers: {
453
+ 'Content-Type': 'application/json',
454
+ 'Authorization': `Bearer ${apiKey}`,
455
+ },
456
+ body: JSON.stringify({
457
+ model,
458
+ messages,
459
+ tools: openaiTools.length > 0 ? openaiTools : undefined,
460
+ tool_choice: openaiTools.length > 0 ? 'auto' : undefined,
461
+ stream: false,
462
+ }),
463
+ signal,
464
+ });
465
+
466
+ if (!resp.ok) {
467
+ const errText = await resp.text().catch(() => '');
468
+ throw new Error(`Non-streaming API error ${resp.status}: ${errText.slice(0, 200)}`);
469
+ }
470
+
471
+ const data = await resp.json() as any;
472
+ const choice = data?.choices?.[0];
473
+ if (!choice) throw new Error('Empty response from API');
474
+
475
+ const msg = choice.message;
476
+ const finishReason: string = choice.finish_reason ?? 'stop';
477
+
478
+ // Emit text content in chunks to simulate streaming appearance
479
+ if (msg.content) {
480
+ const text: string = typeof msg.content === 'string' ? msg.content : '';
481
+ if (text) {
482
+ const chunkSize = 40;
483
+ for (let i = 0; i < text.length; i += chunkSize) {
484
+ send({ type: 'text_delta', delta: text.slice(i, i + chunkSize) });
485
+ await new Promise(r => setTimeout(r, 8));
486
+ }
487
+ }
488
+ }
489
+
490
+ // No tool calls or naturally stopped → done
491
+ if (finishReason === 'stop' || !msg.tool_calls?.length) break;
492
+
493
+ // Execute each tool call
494
+ const toolResultMessages: { role: string; tool_call_id: string; content: string }[] = [];
495
+ for (const tc of msg.tool_calls) {
496
+ const toolName = tc.function?.name ?? '';
497
+ const toolCallId = tc.id ?? `call_${Date.now()}`;
498
+ let parsedArgs: Record<string, unknown> = {};
499
+ try { parsedArgs = JSON.parse(tc.function?.arguments ?? '{}'); } catch { /* ignore */ }
500
+
501
+ const tool = toolMap.get(toolName);
502
+ send({ type: 'tool_start', toolCallId, toolName, args: parsedArgs });
503
+
504
+ let resultText = '';
505
+ let isError = false;
506
+ if (tool) {
507
+ try {
508
+ const result = await tool.execute(toolCallId, parsedArgs, signal);
509
+ resultText = result.content
510
+ .filter((c: any) => c.type === 'text')
511
+ .map((c: any) => c.text)
512
+ .join('\n');
513
+ } catch (err) {
514
+ resultText = err instanceof Error ? err.message : String(err);
515
+ isError = true;
516
+ }
517
+ } else {
518
+ resultText = `Tool "${toolName}" not found`;
519
+ isError = true;
520
+ }
521
+
522
+ send({ type: 'tool_end', toolCallId, output: resultText, isError });
523
+ toolResultMessages.push({ role: 'tool', tool_call_id: toolCallId, content: resultText });
524
+ }
525
+
526
+ // Append assistant turn + tool results for next iteration
527
+ messages.push({ role: 'assistant', content: msg.content ?? null, tool_calls: msg.tool_calls });
528
+ messages.push(...toolResultMessages);
529
+ }
530
+ }
531
+
403
532
  // ---------------------------------------------------------------------------
404
533
  // POST /api/ask
405
534
  // ---------------------------------------------------------------------------
@@ -433,6 +562,10 @@ export async function POST(req: NextRequest) {
433
562
  // Read agent config from settings
434
563
  const serverSettings = readSettings();
435
564
  const agentConfig = serverSettings.agent ?? {};
565
+
566
+ // Detect locale from Accept-Language header for i18n status messages
567
+ const acceptLang = req.headers.get('accept-language') ?? '';
568
+ const t = acceptLang.startsWith('zh') ? i18nZh.ask : i18nEn.ask;
436
569
  const defaultMaxSteps = askMode === 'chat' ? 8 : (agentConfig.maxSteps ?? 20);
437
570
  const stepLimit = Number.isFinite(body.maxSteps)
438
571
  ? Math.min(30, Math.max(1, Number(body.maxSteps)))
@@ -689,7 +822,7 @@ export async function POST(req: NextRequest) {
689
822
  const provOverride = body.providerOverride && isProviderId(body.providerOverride)
690
823
  ? body.providerOverride as ProviderId
691
824
  : undefined;
692
- const { model, modelName, apiKey, provider } = getModelConfig({
825
+ const { model, modelName, apiKey, provider, baseUrl } = getModelConfig({
693
826
  provider: provOverride,
694
827
  hasImages: hasImages(messages),
695
828
  });
@@ -788,6 +921,7 @@ export async function POST(req: NextRequest) {
788
921
 
789
922
  let hasContent = false;
790
923
  let lastModelError = '';
924
+ const effectiveBaseUrlKey = baseUrl || 'default';
791
925
 
792
926
  session.subscribe((event: AgentEvent) => {
793
927
  if (isTextDeltaEvent(event)) {
@@ -993,6 +1127,36 @@ export async function POST(req: NextRequest) {
993
1127
  safeClose();
994
1128
  } else {
995
1129
  // Route to MindOS agent (existing logic)
1130
+
1131
+ // ── Proxy compatibility check ──
1132
+ // If this baseUrl is known to reject stream+tools, skip session.prompt() entirely
1133
+ // and go straight to the non-streaming fallback path.
1134
+ const compatCache = readBaseUrlCompat();
1135
+ if (compatCache[effectiveBaseUrlKey] === 'non-streaming' && baseUrl && provider === 'openai') {
1136
+ send({ type: 'status', message: t.proxyCompatMode });
1137
+ try {
1138
+ await runNonStreamingFallback({
1139
+ baseUrl,
1140
+ apiKey,
1141
+ model: modelName,
1142
+ systemPrompt,
1143
+ historyMessages: llmHistoryMessages,
1144
+ userContent: typeof lastUserContent === 'string' ? lastUserContent : JSON.stringify(lastUserContent),
1145
+ tools: requestTools,
1146
+ send,
1147
+ signal: req.signal,
1148
+ maxSteps: stepLimit,
1149
+ });
1150
+ metrics.recordRequest(Date.now() - requestStartTime);
1151
+ send({ type: 'done' });
1152
+ } catch (fallbackErr) {
1153
+ metrics.recordRequest(Date.now() - requestStartTime);
1154
+ send({ type: 'error', message: t.proxyCompatFailed(fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)) });
1155
+ }
1156
+ safeClose();
1157
+ return;
1158
+ }
1159
+
996
1160
  // Retry with exponential backoff for transient failures (timeout, rate limit, 5xx).
997
1161
  // Only retry if no content has been streamed yet — once the user sees partial
998
1162
  // output, retrying would produce duplicate/garbled content.
@@ -1022,7 +1186,33 @@ export async function POST(req: NextRequest) {
1022
1186
 
1023
1187
  metrics.recordRequest(Date.now() - requestStartTime);
1024
1188
  if (!hasContent && lastModelError) {
1025
- send({ type: 'error', message: lastModelError });
1189
+ // No content received check if this looks like a proxy stream+tools incompatibility.
1190
+ // Only attempt fallback for OpenAI-compatible endpoints with a custom baseUrl.
1191
+ if (baseUrl && provider === 'openai') {
1192
+ send({ type: 'status', message: t.proxyCompatDetecting });
1193
+ try {
1194
+ await runNonStreamingFallback({
1195
+ baseUrl,
1196
+ apiKey,
1197
+ model: modelName,
1198
+ systemPrompt,
1199
+ historyMessages: llmHistoryMessages,
1200
+ userContent: typeof lastUserContent === 'string' ? lastUserContent : JSON.stringify(lastUserContent),
1201
+ tools: requestTools,
1202
+ send,
1203
+ signal: req.signal,
1204
+ maxSteps: stepLimit,
1205
+ });
1206
+ // Success → cache this endpoint as non-streaming so future requests skip the probe
1207
+ writeBaseUrlCompat(effectiveBaseUrlKey, 'non-streaming');
1208
+ console.log(`[ask] Proxy compat detected: ${effectiveBaseUrlKey} → non-streaming (cached)`);
1209
+ send({ type: 'done' });
1210
+ } catch (fallbackErr) {
1211
+ send({ type: 'error', message: t.proxyCompatAlsoFailed(fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)) });
1212
+ }
1213
+ } else {
1214
+ send({ type: 'error', message: lastModelError });
1215
+ }
1026
1216
  } else {
1027
1217
  send({ type: 'done' });
1028
1218
  }
@@ -0,0 +1,121 @@
1
+ export const dynamic = 'force-dynamic';
2
+ import fs from 'fs';
3
+ import { NextRequest, NextResponse } from 'next/server';
4
+ import { resolveSafe } from '@/lib/core/security';
5
+ import { getMindRoot } from '@/lib/fs';
6
+
7
+ /** MIME types for binary files served from the knowledge base */
8
+ const BINARY_MIME: Record<string, string> = {
9
+ // Documents
10
+ '.pdf': 'application/pdf',
11
+ // Images
12
+ '.png': 'image/png',
13
+ '.jpg': 'image/jpeg',
14
+ '.jpeg': 'image/jpeg',
15
+ '.gif': 'image/gif',
16
+ '.webp': 'image/webp',
17
+ '.svg': 'image/svg+xml',
18
+ '.bmp': 'image/bmp',
19
+ '.ico': 'image/x-icon',
20
+ // Audio
21
+ '.mp3': 'audio/mpeg',
22
+ '.wav': 'audio/wav',
23
+ '.m4a': 'audio/mp4',
24
+ '.ogg': 'audio/ogg',
25
+ '.flac': 'audio/flac',
26
+ '.aac': 'audio/aac',
27
+ // Video
28
+ '.mp4': 'video/mp4',
29
+ '.webm': 'video/webm',
30
+ '.mov': 'video/quicktime',
31
+ '.mkv': 'video/x-matroska',
32
+ };
33
+
34
+ /** Max file size: 200MB for media, protects against truly absurd files */
35
+ const MAX_RAW_SIZE = 200 * 1024 * 1024;
36
+
37
+ /**
38
+ * GET /api/file/raw?path=<relative-path>
39
+ *
40
+ * Serve a binary file from the knowledge base with the correct Content-Type.
41
+ * Supports HTTP Range requests for audio/video seeking (required by <audio>/<video>).
42
+ *
43
+ * Security: path is resolved via resolveSafe() which prevents traversal attacks.
44
+ */
45
+ export async function GET(req: NextRequest) {
46
+ const filePath = req.nextUrl.searchParams.get('path');
47
+ if (!filePath) {
48
+ return NextResponse.json({ error: 'Missing path parameter' }, { status: 400 });
49
+ }
50
+
51
+ const lower = filePath.toLowerCase();
52
+ const ext = lower.slice(lower.lastIndexOf('.'));
53
+ const mime = BINARY_MIME[ext];
54
+ if (!mime) {
55
+ return NextResponse.json({ error: `Unsupported binary file type: ${ext}` }, { status: 400 });
56
+ }
57
+
58
+ let resolved: string;
59
+ try {
60
+ resolved = resolveSafe(getMindRoot(), filePath);
61
+ } catch {
62
+ return NextResponse.json({ error: 'Access denied' }, { status: 403 });
63
+ }
64
+
65
+ if (!fs.existsSync(resolved)) {
66
+ return NextResponse.json({ error: 'File not found' }, { status: 404 });
67
+ }
68
+
69
+ const stat = fs.statSync(resolved);
70
+ if (stat.size > MAX_RAW_SIZE) {
71
+ return NextResponse.json(
72
+ { error: `File too large (${Math.round(stat.size / 1024 / 1024)}MB). Max: ${MAX_RAW_SIZE / 1024 / 1024}MB` },
73
+ { status: 413 },
74
+ );
75
+ }
76
+
77
+ const totalSize = stat.size;
78
+ const rangeHeader = req.headers.get('range');
79
+
80
+ // HTTP Range request — required for audio/video seeking
81
+ if (rangeHeader) {
82
+ const match = rangeHeader.match(/bytes=(\d+)-(\d*)/);
83
+ if (match) {
84
+ const start = Math.min(parseInt(match[1], 10), totalSize - 1);
85
+ const end = Math.min(match[2] ? parseInt(match[2], 10) : totalSize - 1, totalSize - 1);
86
+ const chunkSize = end - start + 1;
87
+
88
+ const buf = Buffer.alloc(chunkSize);
89
+ const fd = fs.openSync(resolved, 'r');
90
+ try {
91
+ fs.readSync(fd, buf, 0, chunkSize, start);
92
+ } finally {
93
+ fs.closeSync(fd);
94
+ }
95
+
96
+ return new NextResponse(buf, {
97
+ status: 206,
98
+ headers: {
99
+ 'Content-Type': mime,
100
+ 'Content-Length': String(chunkSize),
101
+ 'Content-Range': `bytes ${start}-${end}/${totalSize}`,
102
+ 'Accept-Ranges': 'bytes',
103
+ 'Cache-Control': 'private, max-age=60',
104
+ },
105
+ });
106
+ }
107
+ }
108
+
109
+ // Full file response
110
+ const buf = fs.readFileSync(resolved);
111
+ return new NextResponse(buf, {
112
+ status: 200,
113
+ headers: {
114
+ 'Content-Type': mime,
115
+ 'Content-Length': String(totalSize),
116
+ 'Accept-Ranges': 'bytes',
117
+ 'Cache-Control': 'private, max-age=60',
118
+ 'Content-Disposition': 'inline',
119
+ },
120
+ });
121
+ }
@@ -24,6 +24,7 @@ import {
24
24
  appendCsvRow,
25
25
  getMindRoot,
26
26
  invalidateCache,
27
+ getFileTree,
27
28
  listMindSpaces,
28
29
  appendContentChange,
29
30
  } from '@/lib/fs';
@@ -34,6 +35,18 @@ function err(msg: string, status = 400) {
34
35
  return NextResponse.json({ error: msg }, { status });
35
36
  }
36
37
 
38
+ /** Recursively collect all directory paths from the file tree. */
39
+ function collectDirectories(nodes: import('@/lib/types').FileNode[]): string[] {
40
+ const dirs: string[] = [];
41
+ for (const n of nodes) {
42
+ if (n.type === 'directory') {
43
+ dirs.push(n.path);
44
+ if (n.children) dirs.push(...collectDirectories(n.children));
45
+ }
46
+ }
47
+ return dirs;
48
+ }
49
+
37
50
  /** Returns true if the path targets a root-level system file (INSTRUCTION.md, CONFIG.json, etc.). */
38
51
  function isSystemFile(filePath: string): boolean {
39
52
  const basename = path.posix.basename(filePath);
@@ -83,6 +96,14 @@ export async function GET(req: NextRequest) {
83
96
  }
84
97
  }
85
98
 
99
+ if (op === 'list_dirs') {
100
+ try {
101
+ return NextResponse.json({ dirs: collectDirectories(getFileTree()) });
102
+ } catch (e) {
103
+ return err((e as Error).message, 500);
104
+ }
105
+ }
106
+
86
107
  if (op === 'check_conflicts') {
87
108
  const names = req.nextUrl.searchParams.get('names');
88
109
  const space = req.nextUrl.searchParams.get('space') ?? '';
@@ -41,10 +41,10 @@ export async function POST(req: NextRequest) {
41
41
  return NextResponse.json({ error: 'Request body must contain a files array' }, { status: 400 });
42
42
  }
43
43
 
44
- const { files } = body as { files: Array<{ name: string; content: string; encoding?: 'text' | 'base64' }> };
44
+ const { files, source } = body as { files: Array<{ name: string; content: string; encoding?: 'text' | 'base64' }>, source?: string };
45
45
 
46
46
  try {
47
- const result = saveToInbox(mindRoot, files);
47
+ const result = saveToInbox(mindRoot, files, source);
48
48
 
49
49
  if (result.saved.length > 0) {
50
50
  invalidateCache();
@@ -59,3 +59,39 @@ export async function POST(req: NextRequest) {
59
59
  );
60
60
  }
61
61
  }
62
+
63
+ export async function DELETE(req: NextRequest) {
64
+ const mindRoot = effectiveSopRoot().trim();
65
+ if (!mindRoot) {
66
+ return NextResponse.json({ error: 'MIND_ROOT is not configured' }, { status: 400 });
67
+ }
68
+
69
+ let body: unknown;
70
+ try {
71
+ body = await req.json();
72
+ } catch {
73
+ return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 });
74
+ }
75
+
76
+ const { names } = (body ?? {}) as { names?: string[] };
77
+ if (!Array.isArray(names) || names.length === 0) {
78
+ return NextResponse.json({ error: 'Request body must contain a non-empty names array' }, { status: 400 });
79
+ }
80
+
81
+ try {
82
+ const { archiveFromInbox } = await import('@/lib/core/inbox');
83
+ const result = archiveFromInbox(mindRoot, names);
84
+
85
+ if (result.archived.length > 0) {
86
+ invalidateCache();
87
+ try { revalidatePath('/', 'layout'); } catch { /* test env */ }
88
+ }
89
+
90
+ return NextResponse.json(result);
91
+ } catch (err) {
92
+ return NextResponse.json(
93
+ { error: (err as Error).message },
94
+ { status: 500 },
95
+ );
96
+ }
97
+ }
@@ -66,6 +66,7 @@ export async function GET(req: NextRequest) {
66
66
  maskedToken: authConfigured ? maskToken(token) : undefined,
67
67
  authToken: authConfigured ? token : undefined,
68
68
  localIP: getLocalIP(),
69
+ connectionMode: settings.connectionMode ?? { cli: true, mcp: false },
69
70
  });
70
71
  } catch (err) {
71
72
  return NextResponse.json({ error: String(err) }, { status: 500 });
@@ -3,31 +3,36 @@ import { NextResponse } from 'next/server';
3
3
  import { spawn } from 'node:child_process';
4
4
  import { resolve } from 'node:path';
5
5
 
6
+ /**
7
+ * Strip ALL MINDOS_ and MIND_ prefixed env vars so the restart child
8
+ * process re-derives paths from its own installation root.
9
+ * Preserves old port values via MINDOS_OLD_ for cleanup.
10
+ */
11
+ function cleanEnvForRestart(): { env: NodeJS.ProcessEnv; oldWebPort?: string; oldMcpPort?: string } {
12
+ const cleaned = { ...process.env };
13
+ const oldWebPort = cleaned.MINDOS_WEB_PORT;
14
+ const oldMcpPort = cleaned.MINDOS_MCP_PORT;
15
+ for (const key of Object.keys(cleaned)) {
16
+ if (key.startsWith('MINDOS_') || key.startsWith('MIND_')) {
17
+ delete cleaned[key];
18
+ }
19
+ }
20
+ delete cleaned.AUTH_TOKEN;
21
+ delete cleaned.WEB_PASSWORD;
22
+ delete cleaned.NODE_OPTIONS;
23
+ // Pass old ports so restart command can clean up stale listeners
24
+ if (oldWebPort) cleaned.MINDOS_OLD_WEB_PORT = oldWebPort;
25
+ if (oldMcpPort) cleaned.MINDOS_OLD_MCP_PORT = oldMcpPort;
26
+ return { env: cleaned, oldWebPort, oldMcpPort };
27
+ }
28
+
6
29
  export async function POST() {
7
30
  try {
31
+ // Resolve CLI path BEFORE cleaning env (we still need current vars)
8
32
  const cliPath = process.env.MINDOS_CLI_PATH || resolve(process.env.MINDOS_PROJECT_ROOT || process.cwd(), '..', 'bin', 'cli.js');
9
33
  const nodeBin = process.env.MINDOS_NODE_BIN || process.execPath;
10
- // Use 'restart' (stop all → wait for ports free → start) instead of bare
11
- // 'start' which would fail assertPortFree because the current process and
12
- // its MCP child are still holding the ports.
13
- //
14
- // IMPORTANT: Strip MINDOS_* env vars so the child's loadConfig() reads
15
- // the *updated* config file instead of inheriting stale values from this
16
- // process. Without this, changing ports in the GUI has no effect on the
17
- // restarted server — it would start on the old ports.
18
- //
19
- // Pass the current (old) ports via MINDOS_OLD_* so the restart command
20
- // can clean up processes still listening on the previous ports.
21
- const childEnv = { ...process.env };
22
- const oldWebPort = childEnv.MINDOS_WEB_PORT;
23
- const oldMcpPort = childEnv.MINDOS_MCP_PORT;
24
- delete childEnv.MINDOS_WEB_PORT;
25
- delete childEnv.MINDOS_MCP_PORT;
26
- delete childEnv.MIND_ROOT;
27
- delete childEnv.AUTH_TOKEN;
28
- delete childEnv.WEB_PASSWORD;
29
- if (oldWebPort) childEnv.MINDOS_OLD_WEB_PORT = oldWebPort;
30
- if (oldMcpPort) childEnv.MINDOS_OLD_MCP_PORT = oldMcpPort;
34
+
35
+ const { env: childEnv } = cleanEnvForRestart();
31
36
  const child = spawn(nodeBin, [cliPath, 'restart'], {
32
37
  detached: true,
33
38
  stdio: 'ignore',
@@ -96,6 +96,18 @@ export async function POST(req: NextRequest) {
96
96
  ? (incomingAuthToken === '' ? '' : current.authToken)
97
97
  : current.authToken;
98
98
 
99
+ // Handle connectionMode: validate if provided, otherwise keep existing
100
+ let resolvedConnectionMode = current.connectionMode ?? { cli: true, mcp: false };
101
+ if (body.connectionMode && typeof body.connectionMode === 'object') {
102
+ const incomingMode = body.connectionMode as Record<string, unknown>;
103
+ if (typeof incomingMode.cli === 'boolean' && typeof incomingMode.mcp === 'boolean') {
104
+ resolvedConnectionMode = {
105
+ cli: incomingMode.cli,
106
+ mcp: incomingMode.mcp,
107
+ };
108
+ }
109
+ }
110
+
99
111
  const next: ServerSettings = {
100
112
  ai: {
101
113
  provider: body.ai?.provider ?? current.ai.provider,
@@ -108,6 +120,7 @@ export async function POST(req: NextRequest) {
108
120
  port: typeof body.port === 'number' ? body.port : current.port,
109
121
  mcpPort: typeof body.mcpPort === 'number' ? body.mcpPort : current.mcpPort,
110
122
  startMode: body.startMode ?? current.startMode,
123
+ connectionMode: resolvedConnectionMode,
111
124
  };
112
125
 
113
126
  writeSettings(next);
@@ -53,7 +53,7 @@ export async function GET() {
53
53
  export async function POST(req: NextRequest) {
54
54
  try {
55
55
  const body = await req.json();
56
- const { mindRoot, template, port, mcpPort, authToken, webPassword, ai } = body;
56
+ const { mindRoot, template, port, mcpPort, authToken, webPassword, ai, connectionMode } = body;
57
57
 
58
58
  // Validate required fields
59
59
  if (!mindRoot || typeof mindRoot !== 'string') {
@@ -126,6 +126,15 @@ export async function POST(req: NextRequest) {
126
126
  const disabledSkills = body.template === 'zh' ? ['mindos'] : ['mindos-zh'];
127
127
  // Determine guide template from setup template
128
128
  const guideTemplate = body.template === 'zh' ? 'zh' : body.template === 'empty' ? 'empty' : 'en';
129
+
130
+ // Validate and build connectionMode
131
+ let resolvedConnectionMode = current.connectionMode ?? { cli: true, mcp: false };
132
+ if (connectionMode && typeof connectionMode === 'object') {
133
+ if (typeof connectionMode.cli === 'boolean' && typeof connectionMode.mcp === 'boolean') {
134
+ resolvedConnectionMode = connectionMode;
135
+ }
136
+ }
137
+
129
138
  const config: ServerSettings = {
130
139
  ai: mergedAi,
131
140
  mindRoot: resolvedRoot,
@@ -145,6 +154,7 @@ export async function POST(req: NextRequest) {
145
154
  askedAI: false,
146
155
  nextStepIndex: 0,
147
156
  },
157
+ connectionMode: resolvedConnectionMode,
148
158
  };
149
159
 
150
160
  writeSettings(config);