@geminilight/mindos 0.6.51 → 0.6.53

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 (383) hide show
  1. package/_standalone/.mindos-build-version +1 -1
  2. package/_standalone/.next/BUILD_ID +1 -1
  3. package/_standalone/.next/app-path-routes-manifest.json +16 -16
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +1 -1
  10. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  11. package/_standalone/.next/server/app/_global-error/page.js +2 -2
  12. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error.html +2 -2
  14. package/_standalone/.next/server/app/_global-error.rsc +11 -6
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +11 -6
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +6 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js +2 -2
  22. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js +2 -2
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js +3 -3
  28. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/ask/route.js +45 -17
  41. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  42. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/backlinks/route.js +1 -1
  46. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  47. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/bootstrap/route.js +1 -1
  49. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  50. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/changes/route.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 +1 -1
  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 +1 -1
  59. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  60. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/file/route.js +1 -1
  62. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  63. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/files/route.js +1 -1
  65. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  66. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/git/route.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 +1 -1
  71. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  72. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/inbox/route.js +1 -1
  75. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  76. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/init/route.js +1 -1
  78. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
  81. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  82. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/monitoring/route.js +1 -1
  89. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  90. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/recent-files/route.js +1 -1
  92. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  93. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/restart/route.js +1 -1
  95. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/search/route.js +1 -1
  97. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  98. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  102. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  105. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/tree-version/route.js +1 -1
  114. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  115. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/update/route.js +1 -1
  118. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/api/workflows/route.js +1 -1
  122. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/changes/page.js +2 -2
  125. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/echo/[segment]/page.js +2 -2
  128. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  129. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/echo/page.js +2 -2
  131. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/explore/page.js +2 -2
  134. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/help/page.js +2 -2
  137. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  138. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/login/page.js +2 -2
  140. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  141. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/page.js +2 -2
  143. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  144. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  145. package/_standalone/.next/server/app/setup/page.js +2 -2
  146. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  147. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/trash/page.js +3 -3
  149. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app/view/[...path]/page.js +2 -2
  152. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  153. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  154. package/_standalone/.next/server/app-paths-manifest.json +16 -16
  155. package/_standalone/.next/server/chunks/2190.js +1 -1
  156. package/_standalone/.next/server/chunks/{1975.js → 3436.js} +3 -3
  157. package/_standalone/.next/server/chunks/4241.js +1 -219
  158. package/_standalone/.next/server/chunks/6539.js +1 -1
  159. package/_standalone/.next/server/chunks/8388.js +1 -1
  160. package/_standalone/.next/server/chunks/8408.js +219 -0
  161. package/_standalone/.next/server/instrumentation.js +1 -1
  162. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  163. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  164. package/_standalone/.next/server/pages/500.html +2 -2
  165. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  166. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  167. package/_standalone/.next/static/chunks/1053-17786066ecd6f216.js +29 -0
  168. package/_standalone/.next/static/chunks/{1814.2ee1d03297c0bccd.js → 1814.72f7fe7c61e2b647.js} +1 -1
  169. package/_standalone/.next/static/chunks/{1880-c2a9e76201841c86.js → 1880-3ec02adc80531825.js} +1 -1
  170. package/_standalone/.next/static/chunks/6636-9bbc90fb3b8731fe.js +6 -0
  171. package/_standalone/.next/static/chunks/7035-032641fb6f4e07b2.js +1 -0
  172. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-b07a5983e85bc5e3.js +1 -0
  173. package/_standalone/.next/static/chunks/app/_global-error/page-b07a5983e85bc5e3.js +1 -0
  174. package/_standalone/.next/static/chunks/app/agents/[agentKey]/{page-773071a99c4daac2.js → page-074d6aafc2606561.js} +1 -1
  175. package/_standalone/.next/static/chunks/app/agents/{page-0d9920b591ce999f.js → page-710d8c80fa86e93e.js} +2 -2
  176. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-b07a5983e85bc5e3.js +1 -0
  177. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-b07a5983e85bc5e3.js +1 -0
  178. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-b07a5983e85bc5e3.js +1 -0
  179. package/_standalone/.next/static/chunks/app/api/a2a/route-b07a5983e85bc5e3.js +1 -0
  180. package/_standalone/.next/static/chunks/app/api/acp/config/route-b07a5983e85bc5e3.js +1 -0
  181. package/_standalone/.next/static/chunks/app/api/acp/detect/route-b07a5983e85bc5e3.js +1 -0
  182. package/_standalone/.next/static/chunks/app/api/acp/install/route-b07a5983e85bc5e3.js +1 -0
  183. package/_standalone/.next/static/chunks/app/api/acp/registry/route-b07a5983e85bc5e3.js +1 -0
  184. package/_standalone/.next/static/chunks/app/api/acp/session/route-b07a5983e85bc5e3.js +1 -0
  185. package/_standalone/.next/static/chunks/app/api/agent-activity/route-b07a5983e85bc5e3.js +1 -0
  186. package/_standalone/.next/static/chunks/app/api/ask/route-b07a5983e85bc5e3.js +1 -0
  187. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-b07a5983e85bc5e3.js +1 -0
  188. package/_standalone/.next/static/chunks/app/api/auth/route-b07a5983e85bc5e3.js +1 -0
  189. package/_standalone/.next/static/chunks/app/api/backlinks/route-b07a5983e85bc5e3.js +1 -0
  190. package/_standalone/.next/static/chunks/app/api/bootstrap/route-b07a5983e85bc5e3.js +1 -0
  191. package/_standalone/.next/static/chunks/app/api/changes/route-b07a5983e85bc5e3.js +1 -0
  192. package/_standalone/.next/static/chunks/app/api/export/route-b07a5983e85bc5e3.js +1 -0
  193. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-b07a5983e85bc5e3.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/file/import/route-b07a5983e85bc5e3.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/file/route-b07a5983e85bc5e3.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/files/route-b07a5983e85bc5e3.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/git/route-b07a5983e85bc5e3.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/graph/route-b07a5983e85bc5e3.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/health/route-b07a5983e85bc5e3.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/inbox/route-b07a5983e85bc5e3.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/init/route-b07a5983e85bc5e3.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-b07a5983e85bc5e3.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/mcp/install/route-b07a5983e85bc5e3.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-b07a5983e85bc5e3.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-b07a5983e85bc5e3.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/mcp/status/route-b07a5983e85bc5e3.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-b07a5983e85bc5e3.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/monitoring/route-b07a5983e85bc5e3.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/recent-files/route-b07a5983e85bc5e3.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/restart/route-b07a5983e85bc5e3.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/search/route-b07a5983e85bc5e3.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-b07a5983e85bc5e3.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-b07a5983e85bc5e3.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/settings/route-b07a5983e85bc5e3.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-b07a5983e85bc5e3.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-b07a5983e85bc5e3.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-b07a5983e85bc5e3.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-b07a5983e85bc5e3.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/setup/ls/route-b07a5983e85bc5e3.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/setup/route-b07a5983e85bc5e3.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/skills/route-b07a5983e85bc5e3.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/sync/route-b07a5983e85bc5e3.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/tree-version/route-b07a5983e85bc5e3.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/uninstall/route-b07a5983e85bc5e3.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/update/route-b07a5983e85bc5e3.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/update-check/route-b07a5983e85bc5e3.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/update-status/route-b07a5983e85bc5e3.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/workflows/route-b07a5983e85bc5e3.js +1 -0
  229. package/_standalone/.next/static/chunks/app/echo/page-b07a5983e85bc5e3.js +1 -0
  230. package/_standalone/.next/static/chunks/app/{layout-4264ca690ad73be1.js → layout-e5d2fb384207d821.js} +21 -21
  231. package/_standalone/.next/static/chunks/app/loading-b07a5983e85bc5e3.js +1 -0
  232. package/_standalone/.next/static/chunks/app/page-54edd045d3448df5.js +7 -0
  233. package/_standalone/.next/static/chunks/app/setup/page-99f40e9337388cda.js +1 -0
  234. package/_standalone/.next/static/chunks/app/trash/page-6372bb3f5463affa.js +1 -0
  235. package/_standalone/.next/static/chunks/app/view/[...path]/loading-b07a5983e85bc5e3.js +1 -0
  236. package/_standalone/.next/static/chunks/app/view/[...path]/page-f3d1d87190dcfe28.js +12 -0
  237. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-b07a5983e85bc5e3.js +1 -0
  238. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-b07a5983e85bc5e3.js +1 -0
  239. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-b07a5983e85bc5e3.js +1 -0
  240. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b07a5983e85bc5e3.js +1 -0
  241. package/_standalone/.next/static/chunks/{webpack-7b276daaa930d480.js → webpack-bbd44cbc83dc0aa4.js} +1 -1
  242. package/_standalone/.next/static/css/ef1151f74f00d91a.css +1 -0
  243. package/_standalone/.next/trace +64 -63
  244. package/_standalone/app/globals.css +1 -1
  245. package/_standalone/components/ActivityBar.tsx +1 -1
  246. package/_standalone/components/AskFab.tsx +4 -4
  247. package/_standalone/components/ExportModal.tsx +4 -1
  248. package/_standalone/components/FileTree.tsx +13 -5
  249. package/_standalone/components/Panel.tsx +5 -12
  250. package/_standalone/components/RightAgentDetailPanel.tsx +5 -4
  251. package/_standalone/components/RightAskPanel.tsx +5 -4
  252. package/_standalone/components/agents/AgentsPrimitives.tsx +7 -3
  253. package/_standalone/components/ask/ProviderModelCapsule.tsx +16 -3
  254. package/_standalone/components/settings/AiTab.tsx +1 -0
  255. package/_standalone/components/settings/Primitives.tsx +84 -3
  256. package/_standalone/components/walkthrough/WalkthroughOverlay.tsx +39 -10
  257. package/_standalone/instrumentation.ts +3 -1
  258. package/_standalone/lib/config/animation.ts +76 -0
  259. package/_standalone/lib/config/icon-scale.ts +35 -0
  260. package/_standalone/lib/config/panel-sizes.ts +58 -0
  261. package/_standalone/lib/hooks/useFocusTrap.ts +65 -0
  262. package/_standalone/lib/stores/walkthrough-store.ts +33 -1
  263. package/_standalone/tsconfig.tsbuildinfo +1 -1
  264. package/app/app/api/ask/route.ts +193 -3
  265. package/app/app/api/restart/route.ts +26 -21
  266. package/app/app/api/update/route.ts +24 -10
  267. package/app/app/globals.css +1 -1
  268. package/app/app/loading.tsx +80 -0
  269. package/app/app/view/[...path]/loading.tsx +32 -9
  270. package/app/components/ActivityBar.tsx +1 -1
  271. package/app/components/AskFab.tsx +4 -4
  272. package/app/components/ExportModal.tsx +4 -1
  273. package/app/components/FileTree.tsx +13 -5
  274. package/app/components/HomeContent.tsx +29 -12
  275. package/app/components/Panel.tsx +5 -12
  276. package/app/components/RightAgentDetailPanel.tsx +5 -4
  277. package/app/components/RightAskPanel.tsx +5 -4
  278. package/app/components/TrashPageClient.tsx +4 -4
  279. package/app/components/agents/AgentsPrimitives.tsx +7 -3
  280. package/app/components/ask/ProviderModelCapsule.tsx +16 -3
  281. package/app/components/settings/AiTab.tsx +1 -0
  282. package/app/components/settings/Primitives.tsx +84 -3
  283. package/app/components/ui/Toaster.tsx +1 -1
  284. package/app/components/walkthrough/WalkthroughOverlay.tsx +39 -10
  285. package/app/instrumentation.ts +3 -1
  286. package/app/lib/agent/model.ts +2 -1
  287. package/app/lib/config/animation.ts +76 -0
  288. package/app/lib/config/icon-scale.ts +35 -0
  289. package/app/lib/config/panel-sizes.ts +58 -0
  290. package/app/lib/hooks/useFocusTrap.ts +65 -0
  291. package/app/lib/i18n/modules/ai-chat.ts +8 -0
  292. package/app/lib/i18n/modules/knowledge.ts +16 -8
  293. package/app/lib/i18n/modules/onboarding.ts +2 -2
  294. package/app/lib/i18n/modules/settings.ts +4 -0
  295. package/app/lib/settings.ts +32 -0
  296. package/app/lib/stores/walkthrough-store.ts +33 -1
  297. package/bin/commands/update.js +23 -11
  298. package/bin/lib/clean-env.js +38 -0
  299. package/bin/lib/gateway.js +41 -4
  300. package/bin/lib/stop.js +40 -4
  301. package/package.json +1 -1
  302. package/_standalone/.next/server/chunks/6622.js +0 -1
  303. package/_standalone/.next/static/chunks/1053-8cb7fd1bfbbbedd3.js +0 -29
  304. package/_standalone/.next/static/chunks/4563-b2a2ce80aff845af.js +0 -6
  305. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-84943536516b00b2.js +0 -1
  306. package/_standalone/.next/static/chunks/app/_global-error/page-84943536516b00b2.js +0 -1
  307. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-84943536516b00b2.js +0 -1
  308. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-84943536516b00b2.js +0 -1
  309. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-84943536516b00b2.js +0 -1
  310. package/_standalone/.next/static/chunks/app/api/a2a/route-84943536516b00b2.js +0 -1
  311. package/_standalone/.next/static/chunks/app/api/acp/config/route-84943536516b00b2.js +0 -1
  312. package/_standalone/.next/static/chunks/app/api/acp/detect/route-84943536516b00b2.js +0 -1
  313. package/_standalone/.next/static/chunks/app/api/acp/install/route-84943536516b00b2.js +0 -1
  314. package/_standalone/.next/static/chunks/app/api/acp/registry/route-84943536516b00b2.js +0 -1
  315. package/_standalone/.next/static/chunks/app/api/acp/session/route-84943536516b00b2.js +0 -1
  316. package/_standalone/.next/static/chunks/app/api/agent-activity/route-84943536516b00b2.js +0 -1
  317. package/_standalone/.next/static/chunks/app/api/ask/route-84943536516b00b2.js +0 -1
  318. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-84943536516b00b2.js +0 -1
  319. package/_standalone/.next/static/chunks/app/api/auth/route-84943536516b00b2.js +0 -1
  320. package/_standalone/.next/static/chunks/app/api/backlinks/route-84943536516b00b2.js +0 -1
  321. package/_standalone/.next/static/chunks/app/api/bootstrap/route-84943536516b00b2.js +0 -1
  322. package/_standalone/.next/static/chunks/app/api/changes/route-84943536516b00b2.js +0 -1
  323. package/_standalone/.next/static/chunks/app/api/export/route-84943536516b00b2.js +0 -1
  324. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-84943536516b00b2.js +0 -1
  325. package/_standalone/.next/static/chunks/app/api/file/import/route-84943536516b00b2.js +0 -1
  326. package/_standalone/.next/static/chunks/app/api/file/route-84943536516b00b2.js +0 -1
  327. package/_standalone/.next/static/chunks/app/api/files/route-84943536516b00b2.js +0 -1
  328. package/_standalone/.next/static/chunks/app/api/git/route-84943536516b00b2.js +0 -1
  329. package/_standalone/.next/static/chunks/app/api/graph/route-84943536516b00b2.js +0 -1
  330. package/_standalone/.next/static/chunks/app/api/health/route-84943536516b00b2.js +0 -1
  331. package/_standalone/.next/static/chunks/app/api/inbox/route-84943536516b00b2.js +0 -1
  332. package/_standalone/.next/static/chunks/app/api/init/route-84943536516b00b2.js +0 -1
  333. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-84943536516b00b2.js +0 -1
  334. package/_standalone/.next/static/chunks/app/api/mcp/install/route-84943536516b00b2.js +0 -1
  335. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-84943536516b00b2.js +0 -1
  336. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-84943536516b00b2.js +0 -1
  337. package/_standalone/.next/static/chunks/app/api/mcp/status/route-84943536516b00b2.js +0 -1
  338. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-84943536516b00b2.js +0 -1
  339. package/_standalone/.next/static/chunks/app/api/monitoring/route-84943536516b00b2.js +0 -1
  340. package/_standalone/.next/static/chunks/app/api/recent-files/route-84943536516b00b2.js +0 -1
  341. package/_standalone/.next/static/chunks/app/api/restart/route-84943536516b00b2.js +0 -1
  342. package/_standalone/.next/static/chunks/app/api/search/route-84943536516b00b2.js +0 -1
  343. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-84943536516b00b2.js +0 -1
  344. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-84943536516b00b2.js +0 -1
  345. package/_standalone/.next/static/chunks/app/api/settings/route-84943536516b00b2.js +0 -1
  346. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-84943536516b00b2.js +0 -1
  347. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-84943536516b00b2.js +0 -1
  348. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-84943536516b00b2.js +0 -1
  349. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-84943536516b00b2.js +0 -1
  350. package/_standalone/.next/static/chunks/app/api/setup/ls/route-84943536516b00b2.js +0 -1
  351. package/_standalone/.next/static/chunks/app/api/setup/route-84943536516b00b2.js +0 -1
  352. package/_standalone/.next/static/chunks/app/api/skills/route-84943536516b00b2.js +0 -1
  353. package/_standalone/.next/static/chunks/app/api/sync/route-84943536516b00b2.js +0 -1
  354. package/_standalone/.next/static/chunks/app/api/tree-version/route-84943536516b00b2.js +0 -1
  355. package/_standalone/.next/static/chunks/app/api/uninstall/route-84943536516b00b2.js +0 -1
  356. package/_standalone/.next/static/chunks/app/api/update/route-84943536516b00b2.js +0 -1
  357. package/_standalone/.next/static/chunks/app/api/update-check/route-84943536516b00b2.js +0 -1
  358. package/_standalone/.next/static/chunks/app/api/update-status/route-84943536516b00b2.js +0 -1
  359. package/_standalone/.next/static/chunks/app/api/workflows/route-84943536516b00b2.js +0 -1
  360. package/_standalone/.next/static/chunks/app/echo/page-84943536516b00b2.js +0 -1
  361. package/_standalone/.next/static/chunks/app/page-00202b22c6db2144.js +0 -7
  362. package/_standalone/.next/static/chunks/app/setup/page-81c37de31c9a5beb.js +0 -1
  363. package/_standalone/.next/static/chunks/app/trash/page-e0398f37b2a47da5.js +0 -1
  364. package/_standalone/.next/static/chunks/app/view/[...path]/loading-84943536516b00b2.js +0 -1
  365. package/_standalone/.next/static/chunks/app/view/[...path]/page-02d632d03f3ec6c6.js +0 -12
  366. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-84943536516b00b2.js +0 -1
  367. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-84943536516b00b2.js +0 -1
  368. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-84943536516b00b2.js +0 -1
  369. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-84943536516b00b2.js +0 -1
  370. package/_standalone/.next/static/css/bc9179074eaf65ae.css +0 -1
  371. package/_standalone/lib/i18n/generated/explore-i18n.generated.ts +0 -138
  372. package/_standalone/lib/i18n/index.ts +0 -38
  373. package/_standalone/lib/i18n/modules/ai-chat.ts +0 -237
  374. package/_standalone/lib/i18n/modules/common.ts +0 -71
  375. package/_standalone/lib/i18n/modules/features.ts +0 -153
  376. package/_standalone/lib/i18n/modules/knowledge.ts +0 -719
  377. package/_standalone/lib/i18n/modules/navigation.ts +0 -157
  378. package/_standalone/lib/i18n/modules/onboarding.ts +0 -445
  379. package/_standalone/lib/i18n/modules/panels.ts +0 -1255
  380. package/_standalone/lib/i18n/modules/settings.ts +0 -885
  381. package/_standalone/lib/i18n.ts +0 -3
  382. /package/_standalone/.next/static/{Oo3NOv4X7Res4OjfuRdIF → W-wLgvhPtPJ5Psq9V4i3M}/_buildManifest.js +0 -0
  383. /package/_standalone/.next/static/{Oo3NOv4X7Res4OjfuRdIF → W-wLgvhPtPJ5Psq9V4i3M}/_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
  }
@@ -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',
@@ -3,25 +3,39 @@ 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 update child
8
+ * process re-derives paths from its own installation root after npm install.
9
+ * This prevents the "fake update" bug where the new process inherits
10
+ * stale MINDOS_PROJECT_ROOT / MINDOS_CLI_PATH pointing to old code.
11
+ */
12
+ function cleanEnvForUpdate(): NodeJS.ProcessEnv {
13
+ const cleaned = { ...process.env };
14
+ for (const key of Object.keys(cleaned)) {
15
+ if (key.startsWith('MINDOS_') || key.startsWith('MIND_')) {
16
+ delete cleaned[key];
17
+ }
18
+ }
19
+ delete cleaned.AUTH_TOKEN;
20
+ delete cleaned.WEB_PASSWORD;
21
+ delete cleaned.NODE_OPTIONS;
22
+ return cleaned;
23
+ }
24
+
6
25
  /**
7
26
  * POST /api/update — trigger `mindos update` as a detached child process.
8
27
  *
9
- * Similar to /api/restart: spawns the CLI command and returns immediately.
10
- * The update process will npm install, remove build stamp, and restart
11
- * the server. The current process will be killed during restart.
28
+ * Spawns the CLI command and returns immediately. The update process will
29
+ * npm install, remove build stamp, and restart the server.
30
+ * The current process will be killed during restart.
12
31
  */
13
32
  export async function POST() {
14
33
  try {
34
+ // Resolve CLI path BEFORE cleaning env (we still need current vars)
15
35
  const cliPath = process.env.MINDOS_CLI_PATH || resolve(process.env.MINDOS_PROJECT_ROOT || process.cwd(), '..', 'bin', 'cli.js');
16
36
  const nodeBin = process.env.MINDOS_NODE_BIN || process.execPath;
17
37
 
18
- // Strip MINDOS_* env vars so the child reads fresh config
19
- const childEnv = { ...process.env };
20
- delete childEnv.MINDOS_WEB_PORT;
21
- delete childEnv.MINDOS_MCP_PORT;
22
- delete childEnv.MIND_ROOT;
23
- delete childEnv.AUTH_TOKEN;
24
- delete childEnv.WEB_PASSWORD;
38
+ const childEnv = cleanEnvForUpdate();
25
39
 
26
40
  const child = spawn(nodeBin, [cliPath, 'update'], {
27
41
  detached: true,
@@ -81,7 +81,7 @@ body {
81
81
  --amber-dim: rgba(200, 135, 58, 0.18);
82
82
  --amber-subtle: rgba(200, 135, 30, 0.08);
83
83
  --amber-foreground: #ffffff;
84
- --success: #7aad80;
84
+ --success: #5a8d60;
85
85
  --error: #c85050;
86
86
  --sidebar: #ede9e1;
87
87
  --sidebar-foreground: #1c1a17;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Home page skeleton — shown while server components load.
3
+ * Matches the HomeContent layout: hero → spaces grid → recent files.
4
+ */
5
+ export default function Loading() {
6
+ return (
7
+ <div className="content-width px-4 md:px-6 py-10 md:py-14 animate-pulse" aria-busy="true" aria-label="Loading">
8
+ {/* Hero skeleton */}
9
+ <div className="mb-10">
10
+ <div className="flex items-center gap-3 mb-2">
11
+ <div className="w-1 h-7 rounded-full bg-muted" />
12
+ <div className="h-6 w-28 bg-muted rounded" />
13
+ </div>
14
+ <div className="h-4 w-64 bg-muted rounded ml-4 mb-6" />
15
+
16
+ {/* Command bar skeleton */}
17
+ <div className="w-full max-w-xl flex flex-col sm:flex-row items-stretch sm:items-center gap-2 ml-4">
18
+ <div className="flex-1 h-12 rounded-xl bg-muted" />
19
+ <div className="h-12 w-16 rounded-xl bg-muted shrink-0" />
20
+ </div>
21
+
22
+ {/* Quick actions skeleton */}
23
+ <div className="flex items-center gap-3 mt-4 ml-4">
24
+ <div className="h-9 w-28 rounded-lg bg-muted" />
25
+ <div className="h-9 w-40 rounded-lg bg-muted" />
26
+ </div>
27
+ </div>
28
+
29
+ {/* Spaces grid skeleton */}
30
+ <div className="mb-10">
31
+ <div className="flex items-center gap-2 mb-4">
32
+ <div className="w-4 h-4 rounded bg-muted" />
33
+ <div className="h-4 w-16 bg-muted rounded" />
34
+ </div>
35
+ <div className="grid grid-cols-2 sm:grid-cols-3 gap-2">
36
+ {Array.from({ length: 6 }).map((_, i) => (
37
+ <div key={i} className="flex items-start gap-3 px-3.5 py-3 rounded-xl border border-border">
38
+ <div className="w-5 h-5 rounded bg-muted shrink-0 mt-0.5" />
39
+ <div className="flex-1 space-y-1.5">
40
+ <div className="h-4 w-20 bg-muted rounded" />
41
+ <div className="h-3 w-full bg-muted rounded" />
42
+ <div className="h-3 w-12 bg-muted rounded" />
43
+ </div>
44
+ </div>
45
+ ))}
46
+ </div>
47
+ </div>
48
+
49
+ {/* Recent files skeleton */}
50
+ <div className="mb-10">
51
+ <div className="flex items-center gap-2 mb-4">
52
+ <div className="w-4 h-4 rounded bg-muted" />
53
+ <div className="h-4 w-24 bg-muted rounded" />
54
+ </div>
55
+ <div className="flex flex-col gap-3">
56
+ {Array.from({ length: 3 }).map((_, i) => (
57
+ <div key={i}>
58
+ <div className="flex items-center gap-2 px-1 py-1.5">
59
+ <div className="w-4 h-4 rounded bg-muted" />
60
+ <div className="h-3 w-24 bg-muted rounded" />
61
+ </div>
62
+ <div className="flex flex-col gap-0.5 ml-2 border-l border-border/40 pl-3">
63
+ {Array.from({ length: 2 }).map((_, j) => (
64
+ <div key={j} className="flex items-center gap-3 px-3 py-2">
65
+ <div className="w-3 h-3 rounded bg-muted shrink-0" />
66
+ <div className="flex-1 space-y-1">
67
+ <div className="h-4 w-40 bg-muted rounded" />
68
+ <div className="h-3 w-24 bg-muted rounded" />
69
+ </div>
70
+ <div className="h-3 w-12 bg-muted rounded shrink-0" />
71
+ </div>
72
+ ))}
73
+ </div>
74
+ </div>
75
+ ))}
76
+ </div>
77
+ </div>
78
+ </div>
79
+ );
80
+ }
@@ -1,14 +1,37 @@
1
+ /**
2
+ * File viewer skeleton — shown while file content loads.
3
+ * Matches the prose layout with heading + paragraph blocks.
4
+ */
1
5
  export default function Loading() {
2
6
  return (
3
- <div className="flex items-center justify-center min-h-[50vh]">
4
- <div className="flex flex-col items-center gap-3">
5
- <div
6
- className="w-6 h-6 border-2 rounded-full animate-spin"
7
- style={{ borderColor: 'var(--border)', borderTopColor: 'var(--amber)' }}
8
- />
9
- <span className="text-xs text-muted-foreground font-display">
10
- Loading...
11
- </span>
7
+ <div className="content-width px-4 md:px-6 py-10 md:py-14 animate-pulse" aria-busy="true" aria-label="Loading">
8
+ {/* Title skeleton */}
9
+ <div className="h-8 w-64 bg-muted rounded mb-3" />
10
+ <div className="h-px w-full bg-border mb-8" />
11
+
12
+ {/* Paragraph skeletons */}
13
+ <div className="space-y-6">
14
+ {Array.from({ length: 4 }).map((_, i) => (
15
+ <div key={i} className="space-y-2">
16
+ {i % 2 === 0 && <div className="h-5 w-40 bg-muted rounded mb-3" />}
17
+ <div className="h-3.5 w-full bg-muted rounded" />
18
+ <div className="h-3.5 w-full bg-muted rounded" />
19
+ <div className="h-3.5 w-3/4 bg-muted rounded" />
20
+ </div>
21
+ ))}
22
+
23
+ {/* Code block skeleton */}
24
+ <div className="rounded-lg border border-border p-4 space-y-2">
25
+ <div className="h-3 w-48 bg-muted rounded" />
26
+ <div className="h-3 w-64 bg-muted rounded" />
27
+ <div className="h-3 w-36 bg-muted rounded" />
28
+ </div>
29
+
30
+ {/* More paragraphs */}
31
+ <div className="space-y-2">
32
+ <div className="h-3.5 w-full bg-muted rounded" />
33
+ <div className="h-3.5 w-5/6 bg-muted rounded" />
34
+ </div>
12
35
  </div>
13
36
  </div>
14
37
  );
@@ -48,7 +48,7 @@ function RailButton({ icon, label, shortcut, active = false, expanded, onClick,
48
48
  onClick={onClick}
49
49
  aria-pressed={active}
50
50
  aria-label={label}
51
- title={expanded ? undefined : (shortcut ? `${label} (${shortcut})` : label)}
51
+ title={shortcut ? `${label} (${shortcut})` : label}
52
52
  data-walkthrough={walkthroughId}
53
53
  className={`
54
54
  relative flex items-center ${expanded ? 'justify-start px-3 w-full' : 'justify-center w-10'} h-10 rounded-md transition-colors
@@ -22,16 +22,16 @@ export default function AskFab({ onToggle, askPanelOpen }: AskFabProps) {
22
22
  fixed z-40 bottom-5 right-5
23
23
  items-center justify-center
24
24
  gap-0 hover:gap-2
25
- p-[11px] rounded-xl
25
+ p-3 rounded-xl
26
26
  text-white font-medium text-[13px]
27
- shadow-md shadow-amber-900/15
27
+ shadow-sm shadow-amber-900/10
28
28
  transition-all duration-200 ease-out
29
- hover:shadow-lg hover:shadow-amber-800/25
29
+ hover:shadow-md hover:shadow-amber-900/15
30
30
  active:scale-95 cursor-pointer overflow-hidden font-display
31
31
  ${askPanelOpen ? 'opacity-0 pointer-events-none translate-y-2' : 'opacity-100 translate-y-0'}
32
32
  `}
33
33
  style={{
34
- background: 'linear-gradient(135deg, var(--amber), color-mix(in srgb, var(--amber) 80%, white))',
34
+ background: 'var(--amber)',
35
35
  }}
36
36
  title={label}
37
37
  aria-label={label}
@@ -104,13 +104,16 @@ export default function ExportModal({ open, onClose, filePath, isDirectory, file
104
104
  <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 backdrop-blur-sm" onClick={state === 'exporting' ? undefined : handleClose}>
105
105
  <div
106
106
  className="bg-card border border-border rounded-xl shadow-xl max-w-md w-full mx-4 animate-in fade-in-0 zoom-in-95 duration-200"
107
+ role="dialog"
108
+ aria-modal="true"
109
+ aria-labelledby="export-modal-title"
107
110
  onClick={e => e.stopPropagation()}
108
111
  >
109
112
  {/* Header */}
110
113
  <div className="flex items-center justify-between px-5 py-4 border-b border-border">
111
114
  <div className="flex items-center gap-2">
112
115
  <Download size={15} className="text-[var(--amber)]" />
113
- <h3 className="text-sm font-semibold font-display">
116
+ <h3 id="export-modal-title" className="text-sm font-semibold font-display">
114
117
  {isDirectory ? (t.export?.exportSpace ?? 'Export Space') : (t.export?.exportFile ?? 'Export File')}
115
118
  </h3>
116
119
  </div>
@@ -4,6 +4,7 @@ import { useState, useCallback, useRef, useTransition, useEffect, useSyncExterna
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
5
  import { FileNode, SYSTEM_FILES, UNDELETABLE_FILES } from '@/lib/types';
6
6
  import { encodePath } from '@/lib/utils';
7
+ import { ICON_SIZES } from '@/lib/config/icon-scale';
7
8
  import {
8
9
  ChevronDown, FileText, Table, Folder, FolderOpen, Plus, Loader2,
9
10
  Trash2, Pencil, Layers, ScrollText, FolderInput, Copy, MoreHorizontal, Star, Inbox,
@@ -61,8 +62,8 @@ interface FileTreeProps {
61
62
 
62
63
  function getIcon(node: FileNode) {
63
64
  if (node.type === 'directory') return null;
64
- if (node.extension === '.csv') return <Table size={14} className="text-success shrink-0" />;
65
- return <FileText size={14} className="text-muted-foreground shrink-0" />;
65
+ if (node.extension === '.csv') return <Table size={ICON_SIZES.md} className="text-success shrink-0" />;
66
+ return <FileText size={ICON_SIZES.md} className="text-muted-foreground shrink-0" />;
66
67
  }
67
68
 
68
69
  function getCurrentFilePath(pathname: string): string {
@@ -428,9 +429,10 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
428
429
  className="shrink-0 p-1 rounded hover:bg-muted text-muted-foreground transition-colors"
429
430
  style={{ marginLeft: `${depth * 12 + 4}px` }}
430
431
  aria-label={open ? `Collapse ${node.name}` : `Expand ${node.name}`}
432
+ aria-expanded={open}
431
433
  >
432
434
  <span className="block transition-transform duration-150" style={{ transform: open ? 'rotate(0deg)' : 'rotate(-90deg)' }}>
433
- <ChevronDown size={13} />
435
+ <ChevronDown size={ICON_SIZES.xs} />
434
436
  </span>
435
437
  </button>
436
438
  <button
@@ -446,7 +448,7 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
446
448
  className={`
447
449
  flex-1 flex items-center gap-1.5 px-1 py-1 rounded text-left min-w-0 pr-16
448
450
  text-sm transition-colors duration-100
449
- hover:bg-muted
451
+ hover:bg-muted cursor-text
450
452
  ${isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'}
451
453
  `}
452
454
  >
@@ -459,6 +461,9 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
459
461
  : <Folder size={14} className="text-yellow-400 shrink-0" />
460
462
  }
461
463
  <span className="truncate leading-5" suppressHydrationWarning>{node.name}</span>
464
+ <span className="ml-auto text-xs text-muted-foreground/30 group-hover/dir:text-muted-foreground/60 transition-colors shrink-0 hidden group-hover/dir:inline-flex items-center gap-1">
465
+ <Pencil size={10} />
466
+ </span>
462
467
  {isSpace && !open && (
463
468
  <span className="ml-auto text-xs text-muted-foreground shrink-0 tabular-nums pr-1">{contentCount}</span>
464
469
  )}
@@ -659,7 +664,7 @@ function FileNodeItem({ node, depth, currentPath, onNavigate }: {
659
664
  data-filepath={node.path}
660
665
  className={`
661
666
  w-full flex items-center gap-1.5 px-2 py-1 rounded text-left
662
- text-sm transition-colors duration-100 cursor-pointer pr-16
667
+ text-sm transition-colors duration-100 cursor-text pr-16
663
668
  ${isActive
664
669
  ? 'bg-accent text-foreground'
665
670
  : 'hover:bg-muted text-muted-foreground hover:text-foreground'
@@ -669,6 +674,9 @@ function FileNodeItem({ node, depth, currentPath, onNavigate }: {
669
674
  >
670
675
  {getIcon(node)}
671
676
  <span className="truncate leading-5" suppressHydrationWarning>{node.name}</span>
677
+ <span className="ml-auto text-xs text-muted-foreground/30 group-hover/file:text-muted-foreground/60 transition-colors shrink-0 hidden group-hover/file:inline-flex items-center gap-1">
678
+ <Pencil size={10} />
679
+ </span>
672
680
  {pinned && <Star size={10} className="shrink-0 fill-[var(--amber)] text-[var(--amber)] opacity-60" />}
673
681
  </button>
674
682
  <div className="absolute right-1 top-1/2 -translate-y-1/2 hidden group-hover/file:flex items-center gap-0.5">