@geminilight/mindos 0.6.50 → 0.6.52

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 (364) 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 +15 -15
  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 +31 -31
  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_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/search/route.js +1 -1
  96. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  97. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  101. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  102. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/tree-version/route.js +1 -1
  112. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  113. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/api/workflows/route.js +1 -1
  119. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  120. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/changes/page.js +2 -2
  122. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/echo/[segment]/page.js +2 -2
  125. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/echo/page.js +2 -2
  128. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  129. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/explore/page.js +2 -2
  131. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/help/page.js +2 -2
  134. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/login/page.js +2 -2
  137. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  138. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/page.js +2 -2
  140. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  141. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/setup/page.js +2 -2
  143. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  144. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  145. package/_standalone/.next/server/app/trash/page.js +3 -3
  146. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  147. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/view/[...path]/page.js +2 -2
  149. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app-paths-manifest.json +15 -15
  152. package/_standalone/.next/server/chunks/2190.js +1 -1
  153. package/_standalone/.next/server/chunks/2673.js +52 -0
  154. package/_standalone/.next/server/chunks/4241.js +1 -219
  155. package/_standalone/.next/server/chunks/8408.js +219 -0
  156. package/_standalone/.next/server/instrumentation.js +1 -1
  157. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  158. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  159. package/_standalone/.next/server/next-font-manifest.js +1 -1
  160. package/_standalone/.next/server/next-font-manifest.json +1 -1
  161. package/_standalone/.next/server/pages/500.html +2 -2
  162. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  163. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  164. package/_standalone/.next/static/chunks/1053-c519cb347faa75e2.js +29 -0
  165. package/_standalone/.next/static/chunks/{1814.2ee1d03297c0bccd.js → 1814.72f7fe7c61e2b647.js} +1 -1
  166. package/_standalone/.next/static/chunks/{1880-c2a9e76201841c86.js → 1880-3ec02adc80531825.js} +1 -1
  167. package/_standalone/.next/static/chunks/6636-9bbc90fb3b8731fe.js +6 -0
  168. package/_standalone/.next/static/chunks/7035-032641fb6f4e07b2.js +1 -0
  169. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-b07a5983e85bc5e3.js +1 -0
  170. package/_standalone/.next/static/chunks/app/_global-error/page-b07a5983e85bc5e3.js +1 -0
  171. package/_standalone/.next/static/chunks/app/agents/[agentKey]/{page-773071a99c4daac2.js → page-074d6aafc2606561.js} +1 -1
  172. package/_standalone/.next/static/chunks/app/agents/{page-0d9920b591ce999f.js → page-710d8c80fa86e93e.js} +2 -2
  173. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-b07a5983e85bc5e3.js +1 -0
  174. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-b07a5983e85bc5e3.js +1 -0
  175. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-b07a5983e85bc5e3.js +1 -0
  176. package/_standalone/.next/static/chunks/app/api/a2a/route-b07a5983e85bc5e3.js +1 -0
  177. package/_standalone/.next/static/chunks/app/api/acp/config/route-b07a5983e85bc5e3.js +1 -0
  178. package/_standalone/.next/static/chunks/app/api/acp/detect/route-b07a5983e85bc5e3.js +1 -0
  179. package/_standalone/.next/static/chunks/app/api/acp/install/route-b07a5983e85bc5e3.js +1 -0
  180. package/_standalone/.next/static/chunks/app/api/acp/registry/route-b07a5983e85bc5e3.js +1 -0
  181. package/_standalone/.next/static/chunks/app/api/acp/session/route-b07a5983e85bc5e3.js +1 -0
  182. package/_standalone/.next/static/chunks/app/api/agent-activity/route-b07a5983e85bc5e3.js +1 -0
  183. package/_standalone/.next/static/chunks/app/api/ask/route-b07a5983e85bc5e3.js +1 -0
  184. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-b07a5983e85bc5e3.js +1 -0
  185. package/_standalone/.next/static/chunks/app/api/auth/route-b07a5983e85bc5e3.js +1 -0
  186. package/_standalone/.next/static/chunks/app/api/backlinks/route-b07a5983e85bc5e3.js +1 -0
  187. package/_standalone/.next/static/chunks/app/api/bootstrap/route-b07a5983e85bc5e3.js +1 -0
  188. package/_standalone/.next/static/chunks/app/api/changes/route-b07a5983e85bc5e3.js +1 -0
  189. package/_standalone/.next/static/chunks/app/api/export/route-b07a5983e85bc5e3.js +1 -0
  190. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-b07a5983e85bc5e3.js +1 -0
  191. package/_standalone/.next/static/chunks/app/api/file/import/route-b07a5983e85bc5e3.js +1 -0
  192. package/_standalone/.next/static/chunks/app/api/file/route-b07a5983e85bc5e3.js +1 -0
  193. package/_standalone/.next/static/chunks/app/api/files/route-b07a5983e85bc5e3.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/git/route-b07a5983e85bc5e3.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/graph/route-b07a5983e85bc5e3.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/health/route-b07a5983e85bc5e3.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/inbox/route-b07a5983e85bc5e3.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/init/route-b07a5983e85bc5e3.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-b07a5983e85bc5e3.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/mcp/install/route-b07a5983e85bc5e3.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-b07a5983e85bc5e3.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-b07a5983e85bc5e3.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/mcp/status/route-b07a5983e85bc5e3.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-b07a5983e85bc5e3.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/monitoring/route-b07a5983e85bc5e3.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/recent-files/route-b07a5983e85bc5e3.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/restart/route-b07a5983e85bc5e3.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/search/route-b07a5983e85bc5e3.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-b07a5983e85bc5e3.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-b07a5983e85bc5e3.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/settings/route-b07a5983e85bc5e3.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-b07a5983e85bc5e3.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-b07a5983e85bc5e3.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-b07a5983e85bc5e3.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-b07a5983e85bc5e3.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/setup/ls/route-b07a5983e85bc5e3.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/setup/route-b07a5983e85bc5e3.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/skills/route-b07a5983e85bc5e3.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/sync/route-b07a5983e85bc5e3.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/tree-version/route-b07a5983e85bc5e3.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/uninstall/route-b07a5983e85bc5e3.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/update/route-b07a5983e85bc5e3.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/update-check/route-b07a5983e85bc5e3.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/update-status/route-b07a5983e85bc5e3.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/workflows/route-b07a5983e85bc5e3.js +1 -0
  226. package/_standalone/.next/static/chunks/app/echo/page-b07a5983e85bc5e3.js +1 -0
  227. package/_standalone/.next/static/chunks/app/{layout-5b51589d4eedab68.js → layout-e706f9a963b177ba.js} +20 -20
  228. package/_standalone/.next/static/chunks/app/loading-b07a5983e85bc5e3.js +1 -0
  229. package/_standalone/.next/static/chunks/app/page-2595175820acfd65.js +7 -0
  230. package/_standalone/.next/static/chunks/app/setup/page-99f40e9337388cda.js +1 -0
  231. package/_standalone/.next/static/chunks/app/trash/page-61c6210fac1e9710.js +1 -0
  232. package/_standalone/.next/static/chunks/app/view/[...path]/loading-b07a5983e85bc5e3.js +1 -0
  233. package/_standalone/.next/static/chunks/app/view/[...path]/page-798359c36f10ef8d.js +12 -0
  234. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-b07a5983e85bc5e3.js +1 -0
  235. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-b07a5983e85bc5e3.js +1 -0
  236. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-b07a5983e85bc5e3.js +1 -0
  237. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b07a5983e85bc5e3.js +1 -0
  238. package/_standalone/.next/static/chunks/{webpack-7b276daaa930d480.js → webpack-bbd44cbc83dc0aa4.js} +1 -1
  239. package/_standalone/.next/static/css/ef1151f74f00d91a.css +1 -0
  240. package/_standalone/.next/trace +64 -63
  241. package/_standalone/app/globals.css +1 -1
  242. package/_standalone/components/ActivityBar.tsx +1 -1
  243. package/_standalone/components/AskFab.tsx +4 -4
  244. package/_standalone/components/ExportModal.tsx +4 -1
  245. package/_standalone/components/FileTree.tsx +13 -5
  246. package/_standalone/components/Panel.tsx +5 -12
  247. package/_standalone/components/RightAgentDetailPanel.tsx +5 -4
  248. package/_standalone/components/RightAskPanel.tsx +5 -4
  249. package/_standalone/components/agents/AgentsPrimitives.tsx +7 -3
  250. package/_standalone/components/ask/ProviderModelCapsule.tsx +16 -3
  251. package/_standalone/components/settings/AiTab.tsx +1 -0
  252. package/_standalone/components/settings/Primitives.tsx +84 -3
  253. package/_standalone/instrumentation.ts +3 -1
  254. package/_standalone/lib/config/animation.ts +76 -0
  255. package/_standalone/lib/config/icon-scale.ts +35 -0
  256. package/_standalone/lib/config/panel-sizes.ts +58 -0
  257. package/_standalone/lib/hooks/useFocusTrap.ts +65 -0
  258. package/_standalone/lib/i18n/modules/knowledge.ts +16 -8
  259. package/_standalone/lib/i18n/modules/onboarding.ts +2 -2
  260. package/_standalone/lib/i18n/modules/settings.ts +4 -0
  261. package/_standalone/tsconfig.tsbuildinfo +1 -1
  262. package/app/app/api/ask/route.ts +47 -15
  263. package/app/app/globals.css +1 -1
  264. package/app/app/loading.tsx +80 -0
  265. package/app/app/view/[...path]/loading.tsx +32 -9
  266. package/app/components/ActivityBar.tsx +1 -1
  267. package/app/components/AskFab.tsx +4 -4
  268. package/app/components/ExportModal.tsx +4 -1
  269. package/app/components/FileTree.tsx +13 -5
  270. package/app/components/HomeContent.tsx +29 -12
  271. package/app/components/Panel.tsx +5 -12
  272. package/app/components/RightAgentDetailPanel.tsx +5 -4
  273. package/app/components/RightAskPanel.tsx +5 -4
  274. package/app/components/TrashPageClient.tsx +4 -4
  275. package/app/components/agents/AgentsPrimitives.tsx +7 -3
  276. package/app/components/ask/ProviderModelCapsule.tsx +16 -3
  277. package/app/components/settings/AiTab.tsx +1 -0
  278. package/app/components/settings/Primitives.tsx +84 -3
  279. package/app/components/ui/Toaster.tsx +1 -1
  280. package/app/instrumentation.ts +3 -1
  281. package/app/lib/config/animation.ts +76 -0
  282. package/app/lib/config/icon-scale.ts +35 -0
  283. package/app/lib/config/panel-sizes.ts +58 -0
  284. package/app/lib/hooks/useFocusTrap.ts +65 -0
  285. package/app/lib/i18n/modules/knowledge.ts +16 -8
  286. package/app/lib/i18n/modules/onboarding.ts +2 -2
  287. package/app/lib/i18n/modules/settings.ts +4 -0
  288. package/bin/commands/dev.js +10 -0
  289. package/bin/commands/doctor.js +18 -6
  290. package/bin/commands/start.js +17 -8
  291. package/bin/lib/cli-shim.js +166 -0
  292. package/package.json +1 -1
  293. package/_standalone/.next/server/chunks/273.js +0 -52
  294. package/_standalone/.next/server/chunks/6622.js +0 -1
  295. package/_standalone/.next/static/chunks/1053-8cb7fd1bfbbbedd3.js +0 -29
  296. package/_standalone/.next/static/chunks/4563-b2a2ce80aff845af.js +0 -6
  297. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-84943536516b00b2.js +0 -1
  298. package/_standalone/.next/static/chunks/app/_global-error/page-84943536516b00b2.js +0 -1
  299. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-84943536516b00b2.js +0 -1
  300. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-84943536516b00b2.js +0 -1
  301. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-84943536516b00b2.js +0 -1
  302. package/_standalone/.next/static/chunks/app/api/a2a/route-84943536516b00b2.js +0 -1
  303. package/_standalone/.next/static/chunks/app/api/acp/config/route-84943536516b00b2.js +0 -1
  304. package/_standalone/.next/static/chunks/app/api/acp/detect/route-84943536516b00b2.js +0 -1
  305. package/_standalone/.next/static/chunks/app/api/acp/install/route-84943536516b00b2.js +0 -1
  306. package/_standalone/.next/static/chunks/app/api/acp/registry/route-84943536516b00b2.js +0 -1
  307. package/_standalone/.next/static/chunks/app/api/acp/session/route-84943536516b00b2.js +0 -1
  308. package/_standalone/.next/static/chunks/app/api/agent-activity/route-84943536516b00b2.js +0 -1
  309. package/_standalone/.next/static/chunks/app/api/ask/route-84943536516b00b2.js +0 -1
  310. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-84943536516b00b2.js +0 -1
  311. package/_standalone/.next/static/chunks/app/api/auth/route-84943536516b00b2.js +0 -1
  312. package/_standalone/.next/static/chunks/app/api/backlinks/route-84943536516b00b2.js +0 -1
  313. package/_standalone/.next/static/chunks/app/api/bootstrap/route-84943536516b00b2.js +0 -1
  314. package/_standalone/.next/static/chunks/app/api/changes/route-84943536516b00b2.js +0 -1
  315. package/_standalone/.next/static/chunks/app/api/export/route-84943536516b00b2.js +0 -1
  316. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-84943536516b00b2.js +0 -1
  317. package/_standalone/.next/static/chunks/app/api/file/import/route-84943536516b00b2.js +0 -1
  318. package/_standalone/.next/static/chunks/app/api/file/route-84943536516b00b2.js +0 -1
  319. package/_standalone/.next/static/chunks/app/api/files/route-84943536516b00b2.js +0 -1
  320. package/_standalone/.next/static/chunks/app/api/git/route-84943536516b00b2.js +0 -1
  321. package/_standalone/.next/static/chunks/app/api/graph/route-84943536516b00b2.js +0 -1
  322. package/_standalone/.next/static/chunks/app/api/health/route-84943536516b00b2.js +0 -1
  323. package/_standalone/.next/static/chunks/app/api/inbox/route-84943536516b00b2.js +0 -1
  324. package/_standalone/.next/static/chunks/app/api/init/route-84943536516b00b2.js +0 -1
  325. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-84943536516b00b2.js +0 -1
  326. package/_standalone/.next/static/chunks/app/api/mcp/install/route-84943536516b00b2.js +0 -1
  327. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-84943536516b00b2.js +0 -1
  328. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-84943536516b00b2.js +0 -1
  329. package/_standalone/.next/static/chunks/app/api/mcp/status/route-84943536516b00b2.js +0 -1
  330. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-84943536516b00b2.js +0 -1
  331. package/_standalone/.next/static/chunks/app/api/monitoring/route-84943536516b00b2.js +0 -1
  332. package/_standalone/.next/static/chunks/app/api/recent-files/route-84943536516b00b2.js +0 -1
  333. package/_standalone/.next/static/chunks/app/api/restart/route-84943536516b00b2.js +0 -1
  334. package/_standalone/.next/static/chunks/app/api/search/route-84943536516b00b2.js +0 -1
  335. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-84943536516b00b2.js +0 -1
  336. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-84943536516b00b2.js +0 -1
  337. package/_standalone/.next/static/chunks/app/api/settings/route-84943536516b00b2.js +0 -1
  338. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-84943536516b00b2.js +0 -1
  339. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-84943536516b00b2.js +0 -1
  340. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-84943536516b00b2.js +0 -1
  341. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-84943536516b00b2.js +0 -1
  342. package/_standalone/.next/static/chunks/app/api/setup/ls/route-84943536516b00b2.js +0 -1
  343. package/_standalone/.next/static/chunks/app/api/setup/route-84943536516b00b2.js +0 -1
  344. package/_standalone/.next/static/chunks/app/api/skills/route-84943536516b00b2.js +0 -1
  345. package/_standalone/.next/static/chunks/app/api/sync/route-84943536516b00b2.js +0 -1
  346. package/_standalone/.next/static/chunks/app/api/tree-version/route-84943536516b00b2.js +0 -1
  347. package/_standalone/.next/static/chunks/app/api/uninstall/route-84943536516b00b2.js +0 -1
  348. package/_standalone/.next/static/chunks/app/api/update/route-84943536516b00b2.js +0 -1
  349. package/_standalone/.next/static/chunks/app/api/update-check/route-84943536516b00b2.js +0 -1
  350. package/_standalone/.next/static/chunks/app/api/update-status/route-84943536516b00b2.js +0 -1
  351. package/_standalone/.next/static/chunks/app/api/workflows/route-84943536516b00b2.js +0 -1
  352. package/_standalone/.next/static/chunks/app/echo/page-84943536516b00b2.js +0 -1
  353. package/_standalone/.next/static/chunks/app/page-9ba25963d955f3d4.js +0 -7
  354. package/_standalone/.next/static/chunks/app/setup/page-81c37de31c9a5beb.js +0 -1
  355. package/_standalone/.next/static/chunks/app/trash/page-20ee39622ea5047a.js +0 -1
  356. package/_standalone/.next/static/chunks/app/view/[...path]/loading-84943536516b00b2.js +0 -1
  357. package/_standalone/.next/static/chunks/app/view/[...path]/page-67c4bf985a579c77.js +0 -12
  358. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-84943536516b00b2.js +0 -1
  359. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-84943536516b00b2.js +0 -1
  360. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-84943536516b00b2.js +0 -1
  361. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-84943536516b00b2.js +0 -1
  362. package/_standalone/.next/static/css/bc9179074eaf65ae.css +0 -1
  363. /package/_standalone/.next/static/{2qUKZF7S693ZZWFgkTSUY → IiTZbEzZo8l5MSUxlDwKp}/_buildManifest.js +0 -0
  364. /package/_standalone/.next/static/{2qUKZF7S693ZZWFgkTSUY → IiTZbEzZo8l5MSUxlDwKp}/_ssgManifest.js +0 -0
@@ -179,6 +179,7 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
179
179
  <ApiKeyInput
180
180
  value={currentConfig.apiKey}
181
181
  onChange={v => patchProvider(provider, { apiKey: v })}
182
+ labels={{ change: t.settings.ai.keyChange, cancel: t.settings.ai.keyCancel }}
182
183
  />
183
184
  {preset.signupUrl && !currentConfig.apiKey && !activeEnvKey && (
184
185
  <a
@@ -195,22 +195,103 @@ export function Toggle({ checked, onChange, size = 'md', disabled, title, onClic
195
195
  );
196
196
  }
197
197
 
198
- export function ApiKeyInput({ value, onChange, placeholder, disabled }: {
198
+ export function ApiKeyInput({ value, onChange, placeholder, disabled, labels }: {
199
199
  value: string;
200
200
  onChange: (v: string) => void;
201
201
  placeholder?: string;
202
202
  disabled?: boolean;
203
+ labels?: { change?: string; cancel?: string };
203
204
  }) {
204
205
  const isMasked = value === '***set***';
206
+ const [editing, setEditing] = useState(false);
207
+ const [draft, setDraft] = useState('');
208
+ const inputRef = useRef<HTMLInputElement>(null);
209
+ const prevValueRef = useRef(value);
210
+
211
+ // Reset editing when the masked value identity changes (e.g. provider switch)
212
+ useEffect(() => {
213
+ if (prevValueRef.current !== value) {
214
+ prevValueRef.current = value;
215
+ setEditing(false);
216
+ setDraft('');
217
+ }
218
+ }, [value]);
219
+
220
+ const commitDraft = useCallback(() => {
221
+ if (draft.trim()) {
222
+ onChange(draft);
223
+ }
224
+ setEditing(false);
225
+ setDraft('');
226
+ }, [draft, onChange]);
227
+
228
+ const cancelEdit = useCallback(() => {
229
+ setEditing(false);
230
+ setDraft('');
231
+ }, []);
232
+
233
+ const changeLabel = labels?.change ?? 'Change';
234
+ const cancelLabel = labels?.cancel ?? 'Cancel';
235
+
236
+ // Masked state: show dots + "Change" button. No clearing on click.
237
+ if (isMasked && !editing) {
238
+ return (
239
+ <div className="flex items-center gap-2">
240
+ <div className="flex-1 px-3 py-2 text-sm bg-muted/50 border border-border rounded-lg text-muted-foreground select-none tracking-widest">
241
+ ••••••••••••
242
+ </div>
243
+ <button
244
+ type="button"
245
+ onClick={() => {
246
+ setDraft('');
247
+ setEditing(true);
248
+ requestAnimationFrame(() => inputRef.current?.focus());
249
+ }}
250
+ disabled={disabled}
251
+ className="shrink-0 px-3 py-2 text-xs font-medium rounded-lg border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors disabled:opacity-50"
252
+ >
253
+ {changeLabel}
254
+ </button>
255
+ </div>
256
+ );
257
+ }
258
+
259
+ // Edit mode (replacing masked key) — uses local draft, commits on Enter/blur
260
+ if (editing) {
261
+ return (
262
+ <div className="flex items-center gap-2">
263
+ <input
264
+ ref={inputRef}
265
+ type="password"
266
+ value={draft}
267
+ onChange={e => setDraft(e.target.value)}
268
+ onKeyDown={e => { if (e.key === 'Enter') commitDraft(); }}
269
+ onBlur={commitDraft}
270
+ placeholder={placeholder ?? 'sk-...'}
271
+ disabled={disabled}
272
+ className="flex-1 px-3 py-2 text-sm bg-background border border-border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50"
273
+ />
274
+ <button
275
+ type="button"
276
+ onMouseDown={e => e.preventDefault()}
277
+ onClick={cancelEdit}
278
+ className="shrink-0 px-3 py-2 text-xs font-medium rounded-lg border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors"
279
+ >
280
+ {cancelLabel}
281
+ </button>
282
+ </div>
283
+ );
284
+ }
285
+
286
+ // Normal (no masked key) — direct editing
205
287
  return (
206
288
  <input
207
289
  type="password"
208
- value={isMasked ? '••••••••••••••••' : value}
290
+ value={value}
209
291
  onChange={e => onChange(e.target.value)}
210
292
  placeholder={placeholder ?? 'sk-...'}
211
293
  disabled={disabled}
212
294
  className="w-full px-3 py-2 text-sm bg-background border border-border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50"
213
- onFocus={() => { if (isMasked) onChange(''); }}
214
295
  />
215
296
  );
216
297
  }
@@ -16,7 +16,7 @@ export default function Toaster() {
16
16
  if (toasts.length === 0) return null;
17
17
 
18
18
  return (
19
- <div className="fixed bottom-4 right-4 z-50 flex flex-col-reverse gap-2 pointer-events-none" aria-live="polite">
19
+ <div className="fixed bottom-4 right-4 z-50 flex flex-col-reverse gap-2 pointer-events-none" role="status" aria-live="polite" aria-atomic="false">
20
20
  {toasts.map((t) => (
21
21
  <div
22
22
  key={t.id}
@@ -40,7 +40,9 @@ export async function register() {
40
40
  try {
41
41
  const projRoot = process.env.MINDOS_PROJECT_ROOT || resolve(process.cwd(), '..');
42
42
  const skillCheckModule = resolve(projRoot, 'bin', 'lib', 'skill-check.js');
43
- const { checkSkillVersions, updateSkill } = await import(skillCheckModule);
43
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
44
+ const dynamicRequireSkill = new Function('id', 'return require(id)') as (id: string) => any;
45
+ const { checkSkillVersions, updateSkill } = dynamicRequireSkill(skillCheckModule);
44
46
  const mismatches = checkSkillVersions(projRoot);
45
47
  for (const m of mismatches) {
46
48
  try {
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Centralized animation configuration.
3
+ * Three-tier system for consistent animation timings across the app.
4
+ * All durations in milliseconds, <= 300ms per WCAG/a11y standards.
5
+ */
6
+
7
+ /** Animation duration tiers */
8
+ export const ANIMATION = {
9
+ // Micro: Quick feedback, hover/focus states
10
+ MICRO: 100, // Button hover, icon transitions, quick visual feedback
11
+
12
+ // Short: Interactive transitions, small content changes
13
+ SHORT: 200, // Slide/fade modals, popovers, panel opens, dropdowns, quick state changes
14
+
15
+ // Medium: Larger content transitions, drawing attention
16
+ MEDIUM: 300, // Long panel slides, collapse/expand grids, significant layout changes
17
+
18
+ // Fast-exit: When closing/dismissing (slightly faster)
19
+ FAST_EXIT: 150,
20
+ } as const;
21
+
22
+ /** Easing functions (using Tailwind defaults) */
23
+ export const EASING = {
24
+ // Use for enter/appear animations (slow start, fast end)
25
+ EASE_OUT: 'cubic-bezier(0, 0, 0.2, 1)',
26
+
27
+ // Use for exit/disappear animations (fast start, slow end)
28
+ EASE_IN: 'cubic-bezier(0.4, 0, 1, 1)',
29
+
30
+ // Use for continuous/reversible animations (uniform acceleration/deceleration)
31
+ EASE_IN_OUT: 'cubic-bezier(0.4, 0, 0.2, 1)',
32
+ } as const;
33
+
34
+ /**
35
+ * Helper to build transition string
36
+ * @example
37
+ * buildTransition('all') // 'all 200ms cubic-bezier(...)'
38
+ * buildTransition('opacity', { duration: ANIMATION.MICRO, easing: EASING.EASE_IN_OUT })
39
+ */
40
+ export function buildTransition(
41
+ property: string = 'all',
42
+ options?: {
43
+ duration?: number;
44
+ easing?: string;
45
+ delay?: number;
46
+ }
47
+ ) {
48
+ const duration = options?.duration ?? ANIMATION.SHORT;
49
+ const easing = options?.easing ?? EASING.EASE_IN_OUT;
50
+ const delay = options?.delay ?? 0;
51
+
52
+ const delayStr = delay > 0 ? ` ${delay}ms` : '';
53
+ return `${property} ${duration}ms ${easing}${delayStr}`;
54
+ }
55
+
56
+ /**
57
+ * Usage guide:
58
+ *
59
+ * ### Hover/Focus (MICRO)
60
+ * className="transition duration-100 ease-out hover:bg-muted"
61
+ *
62
+ * ### Modal/Panel Open (SHORT with EASE_OUT)
63
+ * className="animate-in fade-in-0 zoom-in-95 duration-200 ease-out"
64
+ *
65
+ * ### Collapse/Expand Grid (MEDIUM with EASE_IN_OUT)
66
+ * style={{
67
+ * transition: buildTransition('grid-template-rows', {
68
+ * duration: ANIMATION.MEDIUM,
69
+ * easing: EASING.EASE_IN_OUT
70
+ * })
71
+ * }}
72
+ *
73
+ * ### Sidebar Slide (SHORT with EASE_OUT for enter, EASE_IN for exit)
74
+ * // Sidebar appears: transition duration-200 ease-out
75
+ * // Sidebar closes: transition duration-150 ease-in
76
+ */
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Centralized icon size scale.
3
+ * Replaces arbitrary sizes (10/12/13/14/15/16/18/20px) with a named scale.
4
+ * Usage: import { ICON_SIZES } from '@/lib/config/icon-scale'
5
+ */
6
+
7
+ export const ICON_SIZES = {
8
+ xs: 10, // Tiny: breadcrumb items, status dots, inline badges
9
+ sm: 12, // Small: form field icons, list item decorators
10
+ md: 14, // Medium: button icons, sidebar items, file tree (DEFAULT)
11
+ lg: 16, // Large: main action buttons, panel headers
12
+ xl: 18, // XL: hero icons, large buttons, empty states
13
+ xxl: 20, // XXL: large empty state icons, prominent UI
14
+ xxxl: 24, // XXXL: section headers, splash screens
15
+ } as const;
16
+
17
+ export type IconSize = keyof typeof ICON_SIZES;
18
+
19
+ /**
20
+ * Helper: Get pixel value by size name
21
+ * @param size - Size key, e.g., 'md', 'lg'
22
+ * @returns Pixel value, e.g., 14
23
+ */
24
+ export function getIconSize(size: IconSize): number {
25
+ return ICON_SIZES[size];
26
+ }
27
+
28
+ /**
29
+ * Most common sizes in the codebase:
30
+ * - md (14px): 60% of icons → FileTree, buttons, lists, sidebars
31
+ * - lg (16px): 20% of icons → Headers, main actions
32
+ * - sm (12px): 10% of icons → Inline, compact
33
+ * - xs (10px): 8% of icons → Badges, tiny status
34
+ * - xl+ (18-24px): 2% of icons → Empty states, highlights
35
+ */
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Centralized panel width configuration.
3
+ * All panel sizing constants in one place for easy maintenance.
4
+ */
5
+
6
+ import type { PanelId } from '@/components/ActivityBar';
7
+
8
+ // ── Left Panel (Files/Search/Agents/Echo/Discover) ──
9
+
10
+ export const DEFAULT_LEFT_PANEL_WIDTH: Record<PanelId, number> = {
11
+ files: 280,
12
+ search: 320,
13
+ echo: 340,
14
+ agents: 300,
15
+ discover: 300,
16
+ workflows: 320,
17
+ };
18
+
19
+ export const LEFT_PANEL: { DEFAULT: number; MIN: number; MAX_RATIO: number; MAX_ABS: number } = {
20
+ DEFAULT: 280,
21
+ MIN: 240,
22
+ MAX_RATIO: 0.45, // 45% of screen width
23
+ MAX_ABS: 600, // Absolute pixel max
24
+ };
25
+
26
+ // ── Right Ask Panel ──
27
+
28
+ export const RIGHT_ASK_PANEL: { DEFAULT: number; MIN: number; MAX_ABS: number; MIN_CONTENT: number } = {
29
+ DEFAULT: 420,
30
+ MIN: 400,
31
+ MAX_ABS: 4000, // Unlikely but safe upper bound
32
+ MIN_CONTENT: 360, // Minimum content width when panel is resized
33
+ };
34
+
35
+ // ── Right Agent Detail Panel ──
36
+
37
+ export const RIGHT_AGENT_DETAIL_PANEL: { DEFAULT: number; MIN: number; MAX_ABS: number; MAX_RATIO: number } = {
38
+ DEFAULT: 400,
39
+ MIN: 300,
40
+ MAX_ABS: 640,
41
+ MAX_RATIO: 0.42, // 42% of screen width
42
+ };
43
+
44
+ // ── Mobile/Responsive Breakpoints ──
45
+
46
+ export const RESPONSIVE_BREAKPOINTS = {
47
+ mobile: 375,
48
+ tablet: 768,
49
+ desktop: 1024,
50
+ wide: 1440,
51
+ };
52
+
53
+ // ── Activity Bar ──
54
+
55
+ export const ACTIVITY_BAR = {
56
+ WIDTH_COLLAPSED: 48,
57
+ WIDTH_EXPANDED: 180,
58
+ };
@@ -0,0 +1,65 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useRef } from 'react';
4
+
5
+ /**
6
+ * Focus trap hook: keeps Tab navigation within a dialog/modal.
7
+ * Wraps focus from last focusable element back to first, and vice versa.
8
+ */
9
+ export function useFocusTrap(ref: React.RefObject<HTMLElement | null>, enabled = true) {
10
+ useEffect(() => {
11
+ if (!enabled || !ref.current) return;
12
+
13
+ const handleKeyDown = (e: KeyboardEvent) => {
14
+ if (e.key !== 'Tab') return;
15
+
16
+ const focusableElements = ref.current?.querySelectorAll(
17
+ 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
18
+ ) as NodeListOf<HTMLElement>;
19
+
20
+ if (!focusableElements || focusableElements.length === 0) return;
21
+
22
+ const firstElement = focusableElements[0];
23
+ const lastElement = focusableElements[focusableElements.length - 1];
24
+ const activeElement = document.activeElement;
25
+
26
+ if (e.shiftKey) {
27
+ // Shift+Tab on first element -> focus last
28
+ if (activeElement === firstElement) {
29
+ e.preventDefault();
30
+ lastElement.focus();
31
+ }
32
+ } else {
33
+ // Tab on last element -> focus first
34
+ if (activeElement === lastElement) {
35
+ e.preventDefault();
36
+ firstElement.focus();
37
+ }
38
+ }
39
+ };
40
+
41
+ const container = ref.current;
42
+ container.addEventListener('keydown', handleKeyDown);
43
+ return () => container.removeEventListener('keydown', handleKeyDown);
44
+ }, [ref, enabled]);
45
+ }
46
+
47
+ /**
48
+ * Return focus hook: saves reference to trigger element and restores focus on unmount
49
+ */
50
+ export function useReturnFocus() {
51
+ const triggerRef = useRef<HTMLElement | null>(null);
52
+
53
+ const saveTrigger = (el: HTMLElement | null) => {
54
+ triggerRef.current = el;
55
+ };
56
+
57
+ useEffect(() => {
58
+ return () => {
59
+ // Return focus on unmount
60
+ triggerRef.current?.focus();
61
+ };
62
+ }, []);
63
+
64
+ return saveTrigger;
65
+ }
@@ -110,8 +110,8 @@ export const knowledgeEn = {
110
110
  dropOverlay: 'Drop to save to Capture',
111
111
  dropOverlayFormats: 'md · txt · pdf · csv · json',
112
112
  noMindRoot: 'Please configure your knowledge base first',
113
- saveFailed: 'Failed to save files',
114
- organizeFailed: 'Could not read files for organizing',
113
+ saveFailed: 'Failed to save files. Check disk space and permissions.',
114
+ organizeFailed: 'Could not read files for organizing. Check file permissions.',
115
115
  },
116
116
  pulse: {
117
117
  title: 'Your Agents',
@@ -162,7 +162,8 @@ export const knowledgeEn = {
162
162
  title: 'Pinned Files',
163
163
  addedToast: 'Added to Favorites',
164
164
  removedToast: 'Removed from Favorites',
165
- empty: 'Pin files for quick access',
165
+ empty: 'No pinned files',
166
+ emptyHint: 'Click the star icon on any file to pin it here',
166
167
  },
167
168
  trash: {
168
169
  title: 'Trash',
@@ -182,6 +183,9 @@ export const knowledgeEn = {
182
183
  movedToTrash: 'Deleted',
183
184
  undo: 'Undo',
184
185
  undoFailed: 'Undo failed',
186
+ restoreFailed: 'Could not restore file. Check disk space and try again.',
187
+ deleteFailed: 'Could not permanently delete. Please try again.',
188
+ emptyFailed: 'Could not empty trash. Please try again.',
185
189
  emptied: (count: number) => `Emptied ${count} item${count !== 1 ? 's' : ''} from Trash`,
186
190
  restoreConflict: 'A file with this name already exists at the original location.',
187
191
  overwrite: 'Overwrite',
@@ -218,7 +222,7 @@ export const knowledgeEn = {
218
222
  downloadAgain: 'Download Again',
219
223
  fileCount: (n: number) => `${n} file${n !== 1 ? 's' : ''}`,
220
224
  downloaded: 'Downloaded',
221
- error: 'Export failed',
225
+ error: 'Export failed. Please check disk space and try again.',
222
226
  retry: 'Retry',
223
227
  },
224
228
  fileImport: {
@@ -469,8 +473,8 @@ export const knowledgeZh = {
469
473
  dropOverlay: '拖放到暂存台快速保存',
470
474
  dropOverlayFormats: 'md · txt · pdf · csv · json',
471
475
  noMindRoot: '请先配置知识库路径',
472
- saveFailed: '保存文件失败',
473
- organizeFailed: '无法读取文件进行整理',
476
+ saveFailed: '保存文件失败,请检查磁盘空间和权限。',
477
+ organizeFailed: '无法读取文件进行整理,请检查文件权限。',
474
478
  },
475
479
  pulse: {
476
480
  title: '你的 Agent',
@@ -521,7 +525,8 @@ export const knowledgeZh = {
521
525
  title: '收藏文件',
522
526
  addedToast: '已添加到收藏',
523
527
  removedToast: '已取消收藏',
524
- empty: '固定文件以快速访问',
528
+ empty: '还没有收藏文件',
529
+ emptyHint: '点击任何文件上的星标图标即可收藏',
525
530
  },
526
531
  trash: {
527
532
  title: '回收站',
@@ -541,6 +546,9 @@ export const knowledgeZh = {
541
546
  movedToTrash: '已删除',
542
547
  undo: '撤销',
543
548
  undoFailed: '撤销失败',
549
+ restoreFailed: '无法恢复文件,请检查磁盘空间后重试。',
550
+ deleteFailed: '无法彻底删除,请重试。',
551
+ emptyFailed: '无法清空回收站,请重试。',
544
552
  emptied: (count: number) => `已清空 ${count} 个项目`,
545
553
  restoreConflict: '原位置已有同名文件。',
546
554
  overwrite: '覆盖',
@@ -577,7 +585,7 @@ export const knowledgeZh = {
577
585
  downloadAgain: '再次下载',
578
586
  fileCount: (n: number) => `${n} 个文件`,
579
587
  downloaded: '已下载',
580
- error: '导出失败',
588
+ error: '导出失败,请检查磁盘空间后重试。',
581
589
  retry: '重试',
582
590
  },
583
591
  fileImport: {
@@ -11,7 +11,7 @@ export const onboardingEn = {
11
11
  importHint: 'Already have notes? Set MIND_ROOT to your existing directory in Settings.',
12
12
  syncHint: 'Want cross-device sync? Run',
13
13
  syncHintSuffix: 'in the terminal after setup.',
14
- initError: 'Initialization failed. Please try again.',
14
+ initError: 'Initialization failed. Please refresh the page or try a different template.',
15
15
  dismiss: 'Dismiss',
16
16
  },
17
17
  setup: {
@@ -233,7 +233,7 @@ export const onboardingZh = {
233
233
  importHint: '已有笔记?在设置中将 MIND_ROOT 指向已有目录即可。',
234
234
  syncHint: '需要跨设备同步?完成初始化后在终端运行',
235
235
  syncHintSuffix: '即可。',
236
- initError: '初始化失败,请重试。',
236
+ initError: '初始化失败。请刷新页面或尝试其他模板。',
237
237
  dismiss: '关闭',
238
238
  },
239
239
  setup: {
@@ -12,6 +12,8 @@ export const settingsEn = {
12
12
  baseUrlHint: 'Optional. Use for proxies or custom API endpoints.',
13
13
  keyHint: 'Stored locally in ~/.mindos/config.json',
14
14
  keyOptionalHint: 'Optional for local providers. Stored in ~/.mindos/config.json',
15
+ keyChange: 'Change',
16
+ keyCancel: 'Cancel',
15
17
  envHint: 'Fields marked env have a value from environment variables. You can override them here, or restore all to env defaults.',
16
18
  envFieldNote: (key: string) => `Env var ${key} is set. Clear this field to fall back to it.`,
17
19
  resetToEnv: 'Reset to env value',
@@ -458,6 +460,8 @@ export const settingsZh = {
458
460
  envFieldNote: (key: string) => `环境变量 ${key} 已设置。清空此字段将回退到环境变量值。`,
459
461
  resetToEnv: '恢复为环境变量',
460
462
  restoreFromEnv: '从环境变量恢复',
463
+ keyChange: '更改',
464
+ keyCancel: '取消',
461
465
  noApiKey: 'API 密钥未设置,AI 功能暂不可用,请在此填写。',
462
466
  testKey: '测试',
463
467
  testKeyTesting: '测试中...',
@@ -36,6 +36,16 @@ export const run = async (args, flags) => {
36
36
  if (!process.env.MINDOS_MCP_PORT) process.env.MINDOS_MCP_PORT = '8781';
37
37
  process.env.MINDOS_CLI_PATH = resolve(ROOT, 'bin', 'cli.js');
38
38
  process.env.MINDOS_NODE_BIN = process.execPath;
39
+
40
+ // Inject ~/.mindos/bin into PATH so dev server child processes can find `mindos` CLI
41
+ const { homedir } = await import('node:os');
42
+ const mindosBinDir = resolve(homedir(), '.mindos', 'bin');
43
+ const pathSep = process.platform === 'win32' ? ';' : ':';
44
+ const pathDirs = (process.env.PATH || '').split(pathSep);
45
+ if (!pathDirs.includes(mindosBinDir)) {
46
+ process.env.PATH = `${mindosBinDir}${pathSep}${process.env.PATH || ''}`;
47
+ }
48
+
39
49
  const webPort = process.env.MINDOS_WEB_PORT;
40
50
  const mcpPort = process.env.MINDOS_MCP_PORT;
41
51
  await assertPortFree(Number(webPort), 'web');
@@ -105,16 +105,28 @@ export const run = async (_args, flags) => {
105
105
  hasError = true;
106
106
  }
107
107
 
108
- // 4c. ~/.mindos/bin in PATH (Desktop CLI shim)
108
+ // 4c. ~/.mindos/bin in PATH (CLI shim)
109
109
  const mindosBin = resolve(homedir(), '.mindos', 'bin');
110
110
  const pathDirs = (process.env.PATH || '').split(':');
111
111
  if (pathDirs.some(d => d === mindosBin || d === '$HOME/.mindos/bin' || d === '~/.mindos/bin')) {
112
112
  ok(`~/.mindos/bin is in PATH`);
113
- } else if (existsSync(resolve(mindosBin, 'mindos'))) {
114
- warn(`~/.mindos/bin/mindos exists but is NOT in PATH — AI Agents cannot find the mindos command`);
115
- if (!jsonMode) {
116
- console.log(dim(' Fix: Relaunch MindOS Desktop, or add to your shell config:'));
117
- console.log(dim(' export PATH="$HOME/.mindos/bin:$PATH"'));
113
+ } else {
114
+ try {
115
+ const { ensureCliShim, isShimInPath } = await import('../lib/cli-shim.js');
116
+ ensureCliShim();
117
+ if (isShimInPath()) {
118
+ ok(`~/.mindos/bin is in PATH`);
119
+ } else {
120
+ warn(`~/.mindos/bin PATH injected into shell rc files — open a new terminal to activate`);
121
+ }
122
+ } catch {
123
+ if (existsSync(resolve(mindosBin, 'mindos'))) {
124
+ warn(`~/.mindos/bin/mindos exists but is NOT in PATH — AI Agents cannot find the mindos command`);
125
+ if (!jsonMode) {
126
+ console.log(dim(' Fix: add to your shell config:'));
127
+ console.log(dim(' export PATH="$HOME/.mindos/bin:$PATH"'));
128
+ }
129
+ }
118
130
  }
119
131
  }
120
132
 
@@ -63,14 +63,23 @@ export const run = async (args, flags) => {
63
63
  const isVerbose = Boolean(flags.verbose);
64
64
  const extra = args.join(' ');
65
65
 
66
- // Ensure `mindos` CLI is in PATH (silent, best-effort, dev installs only)
67
- try {
68
- execSync('command -v mindos', { stdio: 'ignore' });
69
- } catch {
70
- const isDesktop = !!(process.env.ELECTRON_RUN_AS_NODE || process.env.MINDOS_DESKTOP);
71
- if (!isDesktop && existsSync(resolve(ROOT, '.git'))) {
72
- try { execSync('npm link', { cwd: ROOT, stdio: 'ignore' }); } catch { /* best effort */ }
73
- }
66
+ // Ensure `mindos` CLI shim + PATH injection (silent, best-effort)
67
+ const isDesktop = !!(process.env.ELECTRON_RUN_AS_NODE || process.env.MINDOS_DESKTOP);
68
+ if (!isDesktop) {
69
+ try {
70
+ const { ensureCliShim } = await import('../lib/cli-shim.js');
71
+ ensureCliShim();
72
+ } catch { /* best effort */ }
73
+ }
74
+
75
+ // Inject ~/.mindos/bin into current process PATH so child processes
76
+ // (Next.js server, MCP) can find the `mindos` command.
77
+ const { homedir } = await import('node:os');
78
+ const mindosBinDir = resolve(homedir(), '.mindos', 'bin');
79
+ const pathSep = process.platform === 'win32' ? ';' : ':';
80
+ const pathDirs = (process.env.PATH || '').split(pathSep);
81
+ if (!pathDirs.includes(mindosBinDir)) {
82
+ process.env.PATH = `${mindosBinDir}${pathSep}${process.env.PATH || ''}`;
74
83
  }
75
84
 
76
85
  // Check for incomplete setup