@geminilight/mindos 0.6.69 → 0.6.70

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 (496) 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 +22 -21
  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 +7 -7
  10. package/_standalone/.next/routes-manifest.json +6 -0
  11. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  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 +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  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 +1 -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 +1 -1
  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 +1 -1
  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 +1 -1
  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.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/session/route.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +1 -1
  41. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
  44. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/ask/route.js +13 -13
  48. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  53. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  55. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  57. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/channels/verify/route.js +1 -0
  59. package/_standalone/.next/server/app/api/channels/verify/route.js.nft.json +1 -0
  60. package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -0
  61. package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  63. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
  65. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  67. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  72. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  74. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  76. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  78. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
  84. package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  86. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  88. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
  90. package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  92. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  101. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  106. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  108. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  111. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  112. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  114. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/api/space-overview/route.js +2 -2
  122. package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  129. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/changelog/page.js +1 -1
  134. package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/changes/page.js +1 -1
  137. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  138. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  140. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  141. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/echo/page.js +1 -1
  143. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  144. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  145. package/_standalone/.next/server/app/explore/page.js +1 -1
  146. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  147. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/help/page.js +1 -1
  149. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  152. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  153. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  154. package/_standalone/.next/server/app/login/page.js +1 -1
  155. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  156. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  157. package/_standalone/.next/server/app/page.js +1 -1
  158. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  159. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  160. package/_standalone/.next/server/app/setup/page.js +1 -1
  161. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  162. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  163. package/_standalone/.next/server/app/trash/page.js +3 -3
  164. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  165. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  166. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  167. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  168. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  169. package/_standalone/.next/server/app/wiki/page.js +1 -1
  170. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  171. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  172. package/_standalone/.next/server/app-paths-manifest.json +22 -21
  173. package/_standalone/.next/server/chunks/3437.js +2 -2
  174. package/_standalone/.next/server/chunks/5299.js +1 -0
  175. package/_standalone/.next/server/chunks/6022.js +42 -42
  176. package/_standalone/.next/server/chunks/6133.js +54 -0
  177. package/_standalone/.next/server/chunks/6539.js +1 -1
  178. package/_standalone/.next/server/chunks/8326.js +1 -0
  179. package/_standalone/.next/server/chunks/8388.js +5 -3
  180. package/_standalone/.next/server/chunks/953.js +6 -4
  181. package/_standalone/.next/server/chunks/9938.js +24 -0
  182. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  183. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  184. package/_standalone/.next/server/pages/500.html +2 -2
  185. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  186. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  187. package/_standalone/.next/static/chunks/1814.8a1fef15856dce84.js +1 -0
  188. package/_standalone/.next/static/chunks/2654-e07c692d6c99f25b.js +1 -0
  189. package/_standalone/.next/static/chunks/{2935.7d75923daaf448d3.js → 2935.9b08eeade3644806.js} +1 -1
  190. package/_standalone/.next/static/chunks/3269.a7343771e3f0ff58.js +48 -0
  191. package/_standalone/.next/static/chunks/3637.2b2697198968d83f.js +1 -0
  192. package/_standalone/.next/static/chunks/{5550-b7c97fc13628db15.js → 4327-d70a8d457e2d03fe.js} +1 -1
  193. package/_standalone/.next/static/chunks/48-c88ea6a2a45f15b4.js +28 -0
  194. package/_standalone/.next/static/chunks/5581-6d403608b5dfb20b.js +29 -0
  195. package/_standalone/.next/static/chunks/6902-edc5c487c696bd0b.js +3 -0
  196. package/_standalone/.next/static/chunks/808.72eb7bdd399e9a24.js +1 -0
  197. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  198. package/_standalone/.next/static/chunks/app/_global-error/{page-e0c1e2c67572781c.js → page-930dfa67e2789df5.js} +1 -1
  199. package/_standalone/.next/static/chunks/app/agents/page-3dc2bf2f6bc7334c.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  201. package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  202. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-930dfa67e2789df5.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/a2a/route-930dfa67e2789df5.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/acp/config/route-930dfa67e2789df5.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/acp/detect/route-930dfa67e2789df5.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/acp/install/route-930dfa67e2789df5.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/acp/registry/route-930dfa67e2789df5.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/acp/session/route-930dfa67e2789df5.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/agent-activity/route-930dfa67e2789df5.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-930dfa67e2789df5.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-930dfa67e2789df5.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/agents/custom/route-930dfa67e2789df5.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/ask/route-930dfa67e2789df5.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-930dfa67e2789df5.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/auth/route-930dfa67e2789df5.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/backlinks/route-930dfa67e2789df5.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/bootstrap/route-930dfa67e2789df5.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/changes/route-930dfa67e2789df5.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/channels/verify/route-930dfa67e2789df5.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/connect/route-930dfa67e2789df5.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/export/route-930dfa67e2789df5.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-930dfa67e2789df5.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/file/import/route-930dfa67e2789df5.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/file/raw/route-930dfa67e2789df5.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/file/route-930dfa67e2789df5.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/files/route-930dfa67e2789df5.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/git/route-930dfa67e2789df5.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/graph/route-930dfa67e2789df5.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/health/route-930dfa67e2789df5.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/im/config/route-930dfa67e2789df5.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/im/status/route-930dfa67e2789df5.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/im/test/route-930dfa67e2789df5.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-930dfa67e2789df5.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/inbox/route-930dfa67e2789df5.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/init/route-930dfa67e2789df5.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/lint/route-930dfa67e2789df5.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-930dfa67e2789df5.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-930dfa67e2789df5.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/mcp/install/route-930dfa67e2789df5.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-930dfa67e2789df5.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-930dfa67e2789df5.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/mcp/status/route-930dfa67e2789df5.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-930dfa67e2789df5.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-930dfa67e2789df5.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/monitoring/route-930dfa67e2789df5.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/recent-files/route-930dfa67e2789df5.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/restart/route-930dfa67e2789df5.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/search/route-930dfa67e2789df5.js +1 -0
  249. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-930dfa67e2789df5.js +1 -0
  250. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-930dfa67e2789df5.js +1 -0
  251. package/_standalone/.next/static/chunks/app/api/settings/route-930dfa67e2789df5.js +1 -0
  252. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-930dfa67e2789df5.js +1 -0
  253. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-930dfa67e2789df5.js +1 -0
  254. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-930dfa67e2789df5.js +1 -0
  255. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-930dfa67e2789df5.js +1 -0
  256. package/_standalone/.next/static/chunks/app/api/setup/ls/route-930dfa67e2789df5.js +1 -0
  257. package/_standalone/.next/static/chunks/app/api/setup/route-930dfa67e2789df5.js +1 -0
  258. package/_standalone/.next/static/chunks/app/api/skills/route-930dfa67e2789df5.js +1 -0
  259. package/_standalone/.next/static/chunks/app/api/space-overview/route-930dfa67e2789df5.js +1 -0
  260. package/_standalone/.next/static/chunks/app/api/sync/route-930dfa67e2789df5.js +1 -0
  261. package/_standalone/.next/static/chunks/app/api/tree-version/route-930dfa67e2789df5.js +1 -0
  262. package/_standalone/.next/static/chunks/app/api/uninstall/route-930dfa67e2789df5.js +1 -0
  263. package/_standalone/.next/static/chunks/app/api/update/route-930dfa67e2789df5.js +1 -0
  264. package/_standalone/.next/static/chunks/app/api/update-check/route-930dfa67e2789df5.js +1 -0
  265. package/_standalone/.next/static/chunks/app/api/update-status/route-930dfa67e2789df5.js +1 -0
  266. package/_standalone/.next/static/chunks/app/api/workflows/route-930dfa67e2789df5.js +1 -0
  267. package/_standalone/.next/static/chunks/app/changes/page-930dfa67e2789df5.js +1 -0
  268. package/_standalone/.next/static/chunks/app/echo/[segment]/page-75a6330292613587.js +157 -0
  269. package/_standalone/.next/static/chunks/app/echo/page-930dfa67e2789df5.js +1 -0
  270. package/_standalone/.next/static/chunks/app/layout-8aa53b34ef34a246.js +133 -0
  271. package/_standalone/.next/static/chunks/app/loading-930dfa67e2789df5.js +1 -0
  272. package/_standalone/.next/static/chunks/app/{page-c3be6477dbcf182d.js → page-318332501426ef5b.js} +1 -1
  273. package/_standalone/.next/static/chunks/app/trash/page-17bd5aedcfea9b65.js +1 -0
  274. package/_standalone/.next/static/chunks/app/view/[...path]/loading-930dfa67e2789df5.js +1 -0
  275. package/_standalone/.next/static/chunks/app/view/[...path]/page-d5c37c41c556013d.js +12 -0
  276. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-930dfa67e2789df5.js +1 -0
  277. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-930dfa67e2789df5.js +1 -0
  278. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-930dfa67e2789df5.js +1 -0
  279. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-930dfa67e2789df5.js +1 -0
  280. package/_standalone/.next/static/chunks/webpack-1c2d44f6d86f3986.js +1 -0
  281. package/_standalone/.next/static/css/a8cadde78aea8585.css +1 -0
  282. package/_standalone/.next/static/ixCTELNH6V05Z00pC6ZMO/_buildManifest.js +1 -0
  283. package/_standalone/.next/trace +72 -71
  284. package/_standalone/.next/types/routes.d.ts +2 -1
  285. package/_standalone/.next/types/validator.ts +9 -0
  286. package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  287. package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  288. package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  289. package/_standalone/__tests__/acp/agent-descriptors.test.ts +36 -0
  290. package/_standalone/__tests__/acp/session.test.ts +346 -167
  291. package/_standalone/__tests__/agent/provider-endpoints.test.ts +70 -0
  292. package/_standalone/__tests__/api/channels-verify.test.ts +75 -0
  293. package/_standalone/__tests__/api/extract-pdf.test.ts +265 -0
  294. package/_standalone/__tests__/api/test-key.test.ts +15 -3
  295. package/_standalone/__tests__/channel-mgmt.test.js +11 -0
  296. package/_standalone/__tests__/components/breadcrumb-header-ux.test.ts +14 -0
  297. package/_standalone/__tests__/components/header-toc-vertical-alignment.test.ts +23 -0
  298. package/_standalone/__tests__/components/table-of-contents-header-layout.test.ts +15 -0
  299. package/_standalone/__tests__/components/view-page-header-layout.test.ts +13 -0
  300. package/_standalone/__tests__/components/view-page-header-scroll-stability.test.ts +34 -0
  301. package/_standalone/__tests__/core/hybrid-search.test.ts +109 -0
  302. package/_standalone/components/Breadcrumb.tsx +11 -11
  303. package/_standalone/components/FindInPage.tsx +1 -1
  304. package/_standalone/components/MarkdownView.tsx +4 -0
  305. package/_standalone/components/Panel.tsx +17 -10
  306. package/_standalone/components/TableOfContents.tsx +9 -9
  307. package/_standalone/components/agents/AgentsContentChannelDetail.tsx +168 -54
  308. package/_standalone/components/agents/AgentsContentChannels.tsx +22 -22
  309. package/_standalone/components/ask/AskContent.tsx +68 -28
  310. package/_standalone/components/ask/AskHeader.tsx +6 -2
  311. package/_standalone/components/ask/ProviderModelCapsule.tsx +11 -9
  312. package/_standalone/components/ask/SessionHistoryPanel.tsx +398 -0
  313. package/_standalone/components/settings/AiTab.tsx +5 -1
  314. package/_standalone/components/settings/KnowledgeTab.tsx +92 -1
  315. package/_standalone/components/settings/McpConnectGuides.tsx +4 -0
  316. package/_standalone/components/settings/McpPortSection.tsx +207 -0
  317. package/_standalone/components/settings/McpTab.tsx +1 -5
  318. package/_standalone/components/settings/TestButton.tsx +1 -0
  319. package/_standalone/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  320. package/_standalone/components/settings/types.ts +12 -0
  321. package/_standalone/components/settings/useCustomProviderForm.ts +2 -2
  322. package/_standalone/data/skills/mindos/SKILL.md +45 -1
  323. package/_standalone/hooks/useAcpDetection.ts +1 -1
  324. package/_standalone/hooks/useAcpRegistry.ts +1 -1
  325. package/_standalone/hooks/useFileImport.ts +7 -2
  326. package/_standalone/hooks/useFileUpload.ts +17 -10
  327. package/_standalone/lib/acp/index.ts +3 -7
  328. package/_standalone/lib/acp/types.ts +0 -29
  329. package/_standalone/lib/im/platforms.ts +6 -2
  330. package/_standalone/lib/pdf-extract.ts +6 -2
  331. package/_standalone/package-lock.json +12 -2
  332. package/_standalone/package.json +2 -1
  333. package/_standalone/tsconfig.tsbuildinfo +1 -1
  334. package/app/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  335. package/app/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  336. package/app/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  337. package/app/app/api/channels/verify/route.ts +54 -0
  338. package/app/app/api/extract-pdf/route.ts +17 -3
  339. package/app/app/api/settings/list-models/route.ts +40 -44
  340. package/app/app/api/settings/route.ts +16 -0
  341. package/app/app/api/settings/test-key/route.ts +5 -2
  342. package/app/app/view/[...path]/ViewPageClient.tsx +1 -1
  343. package/app/components/Breadcrumb.tsx +11 -11
  344. package/app/components/DirView.tsx +1 -1
  345. package/app/components/FindInPage.tsx +1 -1
  346. package/app/components/InboxView.tsx +2 -2
  347. package/app/components/MarkdownView.tsx +4 -0
  348. package/app/components/Panel.tsx +17 -10
  349. package/app/components/TableOfContents.tsx +9 -9
  350. package/app/components/agents/AgentsContentChannelDetail.tsx +168 -54
  351. package/app/components/agents/AgentsContentChannels.tsx +22 -22
  352. package/app/components/ask/AskContent.tsx +68 -28
  353. package/app/components/ask/AskHeader.tsx +6 -2
  354. package/app/components/ask/ProviderModelCapsule.tsx +11 -9
  355. package/app/components/ask/SessionHistoryPanel.tsx +398 -0
  356. package/app/components/settings/AiTab.tsx +5 -1
  357. package/app/components/settings/KnowledgeTab.tsx +92 -1
  358. package/app/components/settings/McpConnectGuides.tsx +4 -0
  359. package/app/components/settings/McpPortSection.tsx +207 -0
  360. package/app/components/settings/McpTab.tsx +1 -5
  361. package/app/components/settings/TestButton.tsx +1 -0
  362. package/app/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  363. package/app/components/settings/types.ts +12 -0
  364. package/app/components/settings/useCustomProviderForm.ts +2 -2
  365. package/app/data/skills/mindos/SKILL.md +45 -1
  366. package/app/hooks/useAcpDetection.ts +1 -1
  367. package/app/hooks/useAcpRegistry.ts +1 -1
  368. package/app/hooks/useFileImport.ts +7 -2
  369. package/app/hooks/useFileUpload.ts +17 -10
  370. package/app/lib/acp/agent-descriptors.ts +18 -0
  371. package/app/lib/acp/index.ts +3 -7
  372. package/app/lib/acp/registry.ts +1 -1
  373. package/app/lib/acp/session.ts +237 -530
  374. package/app/lib/acp/subprocess.ts +224 -427
  375. package/app/lib/acp/types.ts +0 -29
  376. package/app/lib/agent/model.ts +20 -4
  377. package/app/lib/agent/non-streaming.ts +37 -20
  378. package/app/lib/agent/providers.ts +31 -0
  379. package/app/lib/agent/tools.ts +2 -1
  380. package/app/lib/core/embedding-index.ts +285 -0
  381. package/app/lib/core/embedding-provider.ts +164 -0
  382. package/app/lib/core/hybrid-search.ts +160 -0
  383. package/app/lib/core/search.ts +11 -21
  384. package/app/lib/i18n/modules/ai-chat.ts +26 -0
  385. package/app/lib/i18n/modules/panels.ts +14 -0
  386. package/app/lib/i18n/modules/settings.ts +2 -0
  387. package/app/lib/im/platforms.ts +6 -2
  388. package/app/lib/im/verify.ts +94 -0
  389. package/app/lib/pdf-extract.ts +6 -2
  390. package/app/lib/settings.ts +23 -0
  391. package/app/package.json +2 -1
  392. package/bin/cli.js +3 -1
  393. package/bin/commands/channel.js +342 -0
  394. package/bin/commands/update.js +11 -4
  395. package/bin/lib/build.js +34 -16
  396. package/bin/lib/channel-config.js +168 -0
  397. package/bin/lib/channel-constants.js +88 -0
  398. package/bin/lib/channel-mgmt.js +244 -0
  399. package/bin/lib/channel-prompts.js +72 -0
  400. package/bin/lib/channel-validate.js +57 -0
  401. package/bin/lib/safe-rm.js +165 -0
  402. package/package.json +1 -1
  403. package/skills/mindos/SKILL.md +45 -1
  404. package/_standalone/.next/server/chunks/1750.js +0 -1
  405. package/_standalone/.next/server/chunks/7200.js +0 -52
  406. package/_standalone/.next/static/HL8b6d3NCfyoAXNuY2kcn/_buildManifest.js +0 -1
  407. package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
  408. package/_standalone/.next/static/chunks/3466.bc6ab3172ad66091.js +0 -1
  409. package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +0 -1
  410. package/_standalone/.next/static/chunks/4351-9ab695985bb808ad.js +0 -1
  411. package/_standalone/.next/static/chunks/5133-3779d65f4fdfb041.js +0 -30
  412. package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
  413. package/_standalone/.next/static/chunks/8735.66a049abcf0971fb.js +0 -48
  414. package/_standalone/.next/static/chunks/app/agents/page-4c0637183e46c8d3.js +0 -1
  415. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e0c1e2c67572781c.js +0 -1
  416. package/_standalone/.next/static/chunks/app/api/a2a/route-e0c1e2c67572781c.js +0 -1
  417. package/_standalone/.next/static/chunks/app/api/acp/config/route-e0c1e2c67572781c.js +0 -1
  418. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e0c1e2c67572781c.js +0 -1
  419. package/_standalone/.next/static/chunks/app/api/acp/install/route-e0c1e2c67572781c.js +0 -1
  420. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e0c1e2c67572781c.js +0 -1
  421. package/_standalone/.next/static/chunks/app/api/acp/session/route-e0c1e2c67572781c.js +0 -1
  422. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e0c1e2c67572781c.js +0 -1
  423. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-e0c1e2c67572781c.js +0 -1
  424. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-e0c1e2c67572781c.js +0 -1
  425. package/_standalone/.next/static/chunks/app/api/agents/custom/route-e0c1e2c67572781c.js +0 -1
  426. package/_standalone/.next/static/chunks/app/api/ask/route-e0c1e2c67572781c.js +0 -1
  427. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e0c1e2c67572781c.js +0 -1
  428. package/_standalone/.next/static/chunks/app/api/auth/route-e0c1e2c67572781c.js +0 -1
  429. package/_standalone/.next/static/chunks/app/api/backlinks/route-e0c1e2c67572781c.js +0 -1
  430. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e0c1e2c67572781c.js +0 -1
  431. package/_standalone/.next/static/chunks/app/api/changes/route-e0c1e2c67572781c.js +0 -1
  432. package/_standalone/.next/static/chunks/app/api/connect/route-e0c1e2c67572781c.js +0 -1
  433. package/_standalone/.next/static/chunks/app/api/export/route-e0c1e2c67572781c.js +0 -1
  434. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e0c1e2c67572781c.js +0 -1
  435. package/_standalone/.next/static/chunks/app/api/file/import/route-e0c1e2c67572781c.js +0 -1
  436. package/_standalone/.next/static/chunks/app/api/file/raw/route-e0c1e2c67572781c.js +0 -1
  437. package/_standalone/.next/static/chunks/app/api/file/route-e0c1e2c67572781c.js +0 -1
  438. package/_standalone/.next/static/chunks/app/api/files/route-e0c1e2c67572781c.js +0 -1
  439. package/_standalone/.next/static/chunks/app/api/git/route-e0c1e2c67572781c.js +0 -1
  440. package/_standalone/.next/static/chunks/app/api/graph/route-e0c1e2c67572781c.js +0 -1
  441. package/_standalone/.next/static/chunks/app/api/health/route-e0c1e2c67572781c.js +0 -1
  442. package/_standalone/.next/static/chunks/app/api/im/config/route-e0c1e2c67572781c.js +0 -1
  443. package/_standalone/.next/static/chunks/app/api/im/status/route-e0c1e2c67572781c.js +0 -1
  444. package/_standalone/.next/static/chunks/app/api/im/test/route-e0c1e2c67572781c.js +0 -1
  445. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-e0c1e2c67572781c.js +0 -1
  446. package/_standalone/.next/static/chunks/app/api/inbox/route-e0c1e2c67572781c.js +0 -1
  447. package/_standalone/.next/static/chunks/app/api/init/route-e0c1e2c67572781c.js +0 -1
  448. package/_standalone/.next/static/chunks/app/api/lint/route-e0c1e2c67572781c.js +0 -1
  449. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e0c1e2c67572781c.js +0 -1
  450. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-e0c1e2c67572781c.js +0 -1
  451. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e0c1e2c67572781c.js +0 -1
  452. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e0c1e2c67572781c.js +0 -1
  453. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e0c1e2c67572781c.js +0 -1
  454. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e0c1e2c67572781c.js +0 -1
  455. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-e0c1e2c67572781c.js +0 -1
  456. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e0c1e2c67572781c.js +0 -1
  457. package/_standalone/.next/static/chunks/app/api/monitoring/route-e0c1e2c67572781c.js +0 -1
  458. package/_standalone/.next/static/chunks/app/api/recent-files/route-e0c1e2c67572781c.js +0 -1
  459. package/_standalone/.next/static/chunks/app/api/restart/route-e0c1e2c67572781c.js +0 -1
  460. package/_standalone/.next/static/chunks/app/api/search/route-e0c1e2c67572781c.js +0 -1
  461. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e0c1e2c67572781c.js +0 -1
  462. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e0c1e2c67572781c.js +0 -1
  463. package/_standalone/.next/static/chunks/app/api/settings/route-e0c1e2c67572781c.js +0 -1
  464. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e0c1e2c67572781c.js +0 -1
  465. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e0c1e2c67572781c.js +0 -1
  466. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e0c1e2c67572781c.js +0 -1
  467. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e0c1e2c67572781c.js +0 -1
  468. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e0c1e2c67572781c.js +0 -1
  469. package/_standalone/.next/static/chunks/app/api/setup/route-e0c1e2c67572781c.js +0 -1
  470. package/_standalone/.next/static/chunks/app/api/skills/route-e0c1e2c67572781c.js +0 -1
  471. package/_standalone/.next/static/chunks/app/api/space-overview/route-e0c1e2c67572781c.js +0 -1
  472. package/_standalone/.next/static/chunks/app/api/sync/route-e0c1e2c67572781c.js +0 -1
  473. package/_standalone/.next/static/chunks/app/api/tree-version/route-e0c1e2c67572781c.js +0 -1
  474. package/_standalone/.next/static/chunks/app/api/uninstall/route-e0c1e2c67572781c.js +0 -1
  475. package/_standalone/.next/static/chunks/app/api/update/route-e0c1e2c67572781c.js +0 -1
  476. package/_standalone/.next/static/chunks/app/api/update-check/route-e0c1e2c67572781c.js +0 -1
  477. package/_standalone/.next/static/chunks/app/api/update-status/route-e0c1e2c67572781c.js +0 -1
  478. package/_standalone/.next/static/chunks/app/api/workflows/route-e0c1e2c67572781c.js +0 -1
  479. package/_standalone/.next/static/chunks/app/changes/page-e0c1e2c67572781c.js +0 -1
  480. package/_standalone/.next/static/chunks/app/echo/[segment]/page-5333ab47257fab7f.js +0 -159
  481. package/_standalone/.next/static/chunks/app/echo/page-e0c1e2c67572781c.js +0 -1
  482. package/_standalone/.next/static/chunks/app/layout-bd0652768781e726.js +0 -133
  483. package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
  484. package/_standalone/.next/static/chunks/app/trash/page-8280ba2f5c20861e.js +0 -1
  485. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e0c1e2c67572781c.js +0 -1
  486. package/_standalone/.next/static/chunks/app/view/[...path]/page-b942374e2f88c53e.js +0 -12
  487. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e0c1e2c67572781c.js +0 -1
  488. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e0c1e2c67572781c.js +0 -1
  489. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e0c1e2c67572781c.js +0 -1
  490. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e0c1e2c67572781c.js +0 -1
  491. package/_standalone/.next/static/chunks/webpack-9e42857d6c44fe70.js +0 -1
  492. package/_standalone/.next/static/css/8b1f248d6540e52f.css +0 -1
  493. package/_standalone/lib/core/__tests__/synonym-dict.test.ts +0 -82
  494. package/app/lib/core/__tests__/synonym-dict.test.ts +0 -82
  495. package/app/lib/core/synonym-dict.ts +0 -139
  496. /package/_standalone/.next/static/{HL8b6d3NCfyoAXNuY2kcn → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
@@ -0,0 +1,207 @@
1
+ 'use client';
2
+
3
+ import { useState, useEffect, useRef, useCallback } from 'react';
4
+ import { Loader2, AlertTriangle, CheckCircle2, Settings } from 'lucide-react';
5
+ import { apiFetch } from '@/lib/api';
6
+ import { toast } from '@/lib/toast';
7
+
8
+ /* ── Types ─────────────────────────────────────────────────────── */
9
+
10
+ interface PortStatus {
11
+ checking: boolean;
12
+ available: boolean | null;
13
+ isSelf: boolean;
14
+ suggestion: number | null;
15
+ invalid?: boolean;
16
+ }
17
+
18
+ interface CheckPortResult {
19
+ available: boolean;
20
+ isSelf?: boolean;
21
+ suggestion?: number | null;
22
+ }
23
+
24
+ const EMPTY_STATUS: PortStatus = { checking: false, available: null, isSelf: false, suggestion: null };
25
+
26
+ /* ── McpPortSection (compact, inline) ──────────────────────────── */
27
+
28
+ export default function McpPortSection({ m }: { m: Record<string, any> }) {
29
+ const [origPort, setOrigPort] = useState<number>(0);
30
+ const [port, setPort] = useState<number>(0);
31
+ const [status, setStatus] = useState<PortStatus>(EMPTY_STATUS);
32
+ const [updating, setUpdating] = useState(false);
33
+ const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);
34
+ const pollRef = useRef<ReturnType<typeof setInterval>>(undefined);
35
+
36
+ useEffect(() => {
37
+ apiFetch<{ mcpPort?: number }>('/api/settings').then(d => {
38
+ const p = d.mcpPort || 8781;
39
+ setOrigPort(p);
40
+ setPort(p);
41
+ }).catch(() => {});
42
+ }, []);
43
+
44
+ useEffect(() => () => { clearTimeout(timerRef.current); clearInterval(pollRef.current); }, []);
45
+
46
+ const hasChanges = port !== origPort;
47
+ const portInvalid = port < 1024 || port > 65535;
48
+ const portUnavailable = status.checking || (status.available === false && !status.isSelf);
49
+
50
+ const checkPort = useCallback(async (p: number) => {
51
+ if (p < 1024 || p > 65535) {
52
+ setStatus({ ...EMPTY_STATUS, available: false, invalid: true });
53
+ return;
54
+ }
55
+ setStatus({ ...EMPTY_STATUS, checking: true });
56
+ try {
57
+ const res = await apiFetch<CheckPortResult>('/api/setup/check-port', {
58
+ method: 'POST',
59
+ headers: { 'Content-Type': 'application/json' },
60
+ body: JSON.stringify({ port: p }),
61
+ });
62
+ setStatus({
63
+ checking: false,
64
+ available: res.available,
65
+ isSelf: res.isSelf ?? false,
66
+ suggestion: res.suggestion ?? null,
67
+ });
68
+ } catch {
69
+ setStatus(EMPTY_STATUS);
70
+ }
71
+ }, []);
72
+
73
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
74
+ const v = parseInt(e.target.value, 10) || port;
75
+ setPort(v);
76
+ setStatus(EMPTY_STATUS);
77
+ clearTimeout(timerRef.current);
78
+ if (v >= 1024 && v <= 65535) {
79
+ timerRef.current = setTimeout(() => checkPort(v), 500);
80
+ }
81
+ };
82
+
83
+ const handleBlur = () => {
84
+ clearTimeout(timerRef.current);
85
+ if (port >= 1024 && port <= 65535) checkPort(port);
86
+ };
87
+
88
+ const handleUpdate = async () => {
89
+ if (!hasChanges || portInvalid || portUnavailable || updating) return;
90
+
91
+ setUpdating(true);
92
+ try {
93
+ const res = await apiFetch<CheckPortResult>('/api/setup/check-port', {
94
+ method: 'POST',
95
+ headers: { 'Content-Type': 'application/json' },
96
+ body: JSON.stringify({ port }),
97
+ });
98
+ if (!res.available && !res.isSelf) {
99
+ setStatus({ checking: false, available: false, isSelf: false, suggestion: res.suggestion ?? null });
100
+ setUpdating(false);
101
+ toast.error(m.portInUse(port));
102
+ return;
103
+ }
104
+
105
+ await apiFetch('/api/settings', {
106
+ method: 'POST',
107
+ headers: { 'Content-Type': 'application/json' },
108
+ body: JSON.stringify({ mcpPort: port }),
109
+ });
110
+
111
+ try {
112
+ await apiFetch('/api/mcp/restart', { method: 'POST' });
113
+ } catch {
114
+ setUpdating(false);
115
+ toast.error(m.portUpdateFailed);
116
+ return;
117
+ }
118
+
119
+ const deadline = Date.now() + 60_000;
120
+ pollRef.current = setInterval(async () => {
121
+ if (Date.now() > deadline) {
122
+ clearInterval(pollRef.current);
123
+ setUpdating(false);
124
+ toast.error(m.portRestartTimeout);
125
+ return;
126
+ }
127
+ try {
128
+ const s = await apiFetch<{ running: boolean; port: number }>('/api/mcp/status', { timeout: 3000 });
129
+ if (s.running) {
130
+ clearInterval(pollRef.current);
131
+ setUpdating(false);
132
+ setOrigPort(port);
133
+ toast.success(m.portUpdateSuccess);
134
+ }
135
+ } catch { /* keep polling */ }
136
+ }, 3000);
137
+ } catch {
138
+ setUpdating(false);
139
+ toast.error(m.portUpdateFailed);
140
+ }
141
+ };
142
+
143
+ if (origPort === 0) return null;
144
+
145
+ return (
146
+ <div className="rounded-lg border border-border overflow-hidden">
147
+ <div className="flex items-center gap-2 px-3 py-2 bg-muted/30">
148
+ <Settings size={11} className="text-muted-foreground" />
149
+ <span className="text-xs font-medium text-muted-foreground">{m.mcpPortLabel}</span>
150
+ </div>
151
+ <div className="px-3 py-2.5 space-y-2">
152
+ <div className="flex items-center gap-2">
153
+ <input
154
+ type="number" min={1024} max={65535} value={port}
155
+ onChange={handleChange}
156
+ onBlur={handleBlur}
157
+ className="flex-1 px-2.5 py-1.5 text-sm rounded-lg border border-border bg-muted/30 text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring tabular-nums"
158
+ />
159
+ <button
160
+ type="button"
161
+ onClick={handleUpdate}
162
+ disabled={!hasChanges || portInvalid || portUnavailable || updating}
163
+ className="px-3 py-1.5 rounded-lg text-xs font-medium transition-colors shrink-0
164
+ bg-[var(--amber)] text-[var(--amber-foreground)]
165
+ hover:opacity-90
166
+ disabled:opacity-40 disabled:cursor-not-allowed
167
+ focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
168
+ >
169
+ {updating ? <Loader2 size={12} className="animate-spin" /> : (m.portUpdateBtn)}
170
+ </button>
171
+ </div>
172
+
173
+ {/* Status feedback */}
174
+ {status.checking && (
175
+ <p className="text-2xs flex items-center gap-1 text-muted-foreground">
176
+ <Loader2 size={10} className="animate-spin" /> {m.portChecking}
177
+ </p>
178
+ )}
179
+ {!status.checking && status.available === false && !status.invalid && (
180
+ <div className="flex items-center gap-2">
181
+ <p className="text-2xs flex items-center gap-1 text-[var(--amber)]">
182
+ <AlertTriangle size={10} /> {m.portInUse(port)}
183
+ </p>
184
+ {status.suggestion !== null && (
185
+ <button type="button"
186
+ onClick={() => { setPort(status.suggestion!); setStatus(EMPTY_STATUS); setTimeout(() => checkPort(status.suggestion!), 0); }}
187
+ className="text-2xs px-1.5 py-0.5 rounded border border-[var(--amber)] text-[var(--amber)] transition-colors hover:bg-[var(--amber-subtle)]"
188
+ >
189
+ {m.portSuggest(status.suggestion)}
190
+ </button>
191
+ )}
192
+ </div>
193
+ )}
194
+ {!status.checking && status.invalid && (
195
+ <p className="text-2xs flex items-center gap-1 text-destructive">
196
+ <AlertTriangle size={10} /> 1024 – 65535
197
+ </p>
198
+ )}
199
+ {!status.checking && status.available === true && (
200
+ <p className="text-2xs flex items-center gap-1 text-success">
201
+ <CheckCircle2 size={10} /> {status.isSelf ? m.portSelf : m.portAvailable}
202
+ </p>
203
+ )}
204
+ </div>
205
+ </div>
206
+ );
207
+ }
@@ -11,7 +11,6 @@ import type { McpTabProps, McpStatus, AgentInfo, ConnectionMode } from './types'
11
11
  import AgentInstall from './McpAgentInstall';
12
12
  import SkillsSection from './McpSkillsSection';
13
13
  import McpExternalTools from './McpExternalTools';
14
- import ServerPortsCard from './ServerPortsCard';
15
14
 
16
15
  /* ── Main Connections Tab ────────────────────────────────────────── */
17
16
 
@@ -99,9 +98,6 @@ export function McpTab({ t }: McpTabProps) {
99
98
 
100
99
  return (
101
100
  <div className="space-y-6">
102
- {/* 0. Server Ports */}
103
- {m && <ServerPortsCard m={m} />}
104
-
105
101
  {/* 1. Connection Mode Toggle */}
106
102
  <ConnectionModeCard
107
103
  mcpEnabled={mcpEnabled}
@@ -114,7 +110,7 @@ export function McpTab({ t }: McpTabProps) {
114
110
  {/* 2. Auth Token */}
115
111
  <AuthTokenCard status={mcp.status} m={m} />
116
112
 
117
- {/* 3. Connect Agents (CLI/MCP guides + detected agents) */}
113
+ {/* 3. Connect Agents (CLI/MCP guides + detected agents + MCP port) */}
118
114
  <ConnectCard
119
115
  mode={mode}
120
116
  onModeChange={setMode}
@@ -8,6 +8,7 @@ function errorMessage(t: AiTabProps['t'], code?: ErrorCode): string {
8
8
  switch (code) {
9
9
  case 'auth_error': return t.settings.ai.testKeyAuthError;
10
10
  case 'model_not_found': return t.settings.ai.testKeyModelNotFound;
11
+ case 'endpoint_error': return t.settings.ai.testKeyEndpointError;
11
12
  case 'rate_limited': return t.settings.ai.testKeyRateLimited;
12
13
  case 'network_error': return t.settings.ai.testKeyNetworkError;
13
14
  default: return t.settings.ai.testKeyUnknown;
@@ -51,8 +51,8 @@ function PortField({
51
51
 
52
52
  return (
53
53
  <div className="space-y-1">
54
- <label className="text-xs font-medium text-foreground">{label}</label>
55
- <p className="text-2xs text-muted-foreground">{hint}</p>
54
+ {label && <label className="text-xs font-medium text-foreground">{label}</label>}
55
+ {hint && <p className="text-2xs text-muted-foreground">{hint}</p>}
56
56
  <input
57
57
  type="number" min={1024} max={65535} value={value}
58
58
  onChange={handleChange}
@@ -107,46 +107,33 @@ function RestartOverlay({ message, sub }: { message: string; sub?: string }) {
107
107
  );
108
108
  }
109
109
 
110
- /* ── ServerPortsCard ───────────────────────────────────────────── */
111
-
112
- export default function ServerPortsCard({ m }: { m: Record<string, any> }) {
113
- // Loaded from /api/settings
114
- const [origWebPort, setOrigWebPort] = useState<number>(0);
115
- const [origMcpPort, setOrigMcpPort] = useState<number>(0);
116
-
117
- const [webPort, setWebPort] = useState<number>(0);
118
- const [mcpPort, setMcpPort] = useState<number>(0);
119
-
120
- const [webStatus, setWebStatus] = useState<PortStatus>(EMPTY_STATUS);
121
- const [mcpStatus, setMcpStatus] = useState<PortStatus>(EMPTY_STATUS);
110
+ /* ── WebPortSection ────────────────────────────────────────────── */
122
111
 
112
+ export default function WebPortSection({ m }: { m: Record<string, any> }) {
113
+ const [origPort, setOrigPort] = useState<number>(0);
114
+ const [port, setPort] = useState<number>(0);
115
+ const [status, setStatus] = useState<PortStatus>(EMPTY_STATUS);
123
116
  const [updating, setUpdating] = useState(false);
124
117
  const [overlayMsg, setOverlayMsg] = useState<string | null>(null);
125
118
  const [overlaySub, setOverlaySub] = useState<string | undefined>(undefined);
126
119
  const pollRef = useRef<ReturnType<typeof setInterval>>(undefined);
127
120
 
128
- // Load current ports from API
129
121
  useEffect(() => {
130
- apiFetch<{ port?: number; mcpPort?: number }>('/api/settings').then(d => {
131
- const wp = d.port || 3456;
132
- const mp = d.mcpPort || 8781;
133
- setOrigWebPort(wp); setWebPort(wp);
134
- setOrigMcpPort(mp); setMcpPort(mp);
122
+ apiFetch<{ port?: number }>('/api/settings').then(d => {
123
+ const p = d.port || 3456;
124
+ setOrigPort(p);
125
+ setPort(p);
135
126
  }).catch(() => {});
136
127
  }, []);
137
128
 
138
129
  useEffect(() => () => clearInterval(pollRef.current), []);
139
130
 
140
- const hasChanges = webPort !== origWebPort || mcpPort !== origMcpPort;
141
- const portConflict = webPort === mcpPort && webPort > 0;
142
- const portInvalid = webPort < 1024 || webPort > 65535 || mcpPort < 1024 || mcpPort > 65535;
143
- const webChanged = webPort !== origWebPort;
144
- const mcpChanged = mcpPort !== origMcpPort;
131
+ const hasChanges = port !== origPort;
132
+ const portInvalid = port < 1024 || port > 65535;
133
+ const portUnavailable = status.checking || (status.available === false && !status.isSelf);
145
134
 
146
- // Port check via existing API
147
- const checkPort = useCallback(async (port: number, which: 'web' | 'mcp') => {
148
- const setStatus = which === 'web' ? setWebStatus : setMcpStatus;
149
- if (port < 1024 || port > 65535) {
135
+ const checkPort = useCallback(async (p: number) => {
136
+ if (p < 1024 || p > 65535) {
150
137
  setStatus({ ...EMPTY_STATUS, available: false, invalid: true });
151
138
  return;
152
139
  }
@@ -155,7 +142,7 @@ export default function ServerPortsCard({ m }: { m: Record<string, any> }) {
155
142
  const res = await apiFetch<CheckPortResult>('/api/setup/check-port', {
156
143
  method: 'POST',
157
144
  headers: { 'Content-Type': 'application/json' },
158
- body: JSON.stringify({ port }),
145
+ body: JSON.stringify({ port: p }),
159
146
  });
160
147
  setStatus({
161
148
  checking: false,
@@ -168,131 +155,74 @@ export default function ServerPortsCard({ m }: { m: Record<string, any> }) {
168
155
  }
169
156
  }, []);
170
157
 
171
- // Update handler
172
158
  const handleUpdate = async () => {
173
- if (!hasChanges || portConflict || portInvalid || updating) return;
159
+ if (!hasChanges || portInvalid || portUnavailable || updating) return;
174
160
 
175
161
  setUpdating(true);
176
162
  try {
177
- // 0. Final port availability check before committing
178
- // User may have waited a while since input — port state could have changed.
179
- const portsToCheck: Array<{ port: number; which: 'web' | 'mcp' }> = [];
180
- if (webChanged) portsToCheck.push({ port: webPort, which: 'web' });
181
- if (mcpChanged) portsToCheck.push({ port: mcpPort, which: 'mcp' });
182
-
183
- for (const { port, which } of portsToCheck) {
184
- const res = await apiFetch<CheckPortResult>('/api/setup/check-port', {
185
- method: 'POST',
186
- headers: { 'Content-Type': 'application/json' },
187
- body: JSON.stringify({ port }),
163
+ // Final availability check
164
+ const res = await apiFetch<CheckPortResult>('/api/setup/check-port', {
165
+ method: 'POST',
166
+ headers: { 'Content-Type': 'application/json' },
167
+ body: JSON.stringify({ port }),
168
+ });
169
+ if (!res.available && !res.isSelf) {
170
+ setStatus({
171
+ checking: false,
172
+ available: false,
173
+ isSelf: false,
174
+ suggestion: res.suggestion ?? null,
188
175
  });
189
- if (!res.available && !res.isSelf) {
190
- // Port became occupied since last check
191
- const setStatus = which === 'web' ? setWebStatus : setMcpStatus;
192
- setStatus({
193
- checking: false,
194
- available: false,
195
- isSelf: false,
196
- suggestion: res.suggestion ?? null,
197
- });
198
- setUpdating(false);
199
- toast.error(m.portInUse(port));
200
- return;
201
- }
176
+ setUpdating(false);
177
+ toast.error(m.portInUse(port));
178
+ return;
202
179
  }
203
180
 
204
- // 1. Save both ports to config
181
+ // Save port
205
182
  await apiFetch('/api/settings', {
206
183
  method: 'POST',
207
184
  headers: { 'Content-Type': 'application/json' },
208
- body: JSON.stringify({
209
- port: webPort,
210
- mcpPort,
211
- }),
185
+ body: JSON.stringify({ port }),
212
186
  });
213
187
 
214
- // 2. Determine restart strategy
215
- if (webChanged) {
216
- // Full restart needed — Web port changed
217
- setOverlayMsg(m.portWebRestarting);
218
- setOverlaySub(m.portRedirecting);
188
+ // Full restart — Web port changed
189
+ setOverlayMsg(m.portWebRestarting);
190
+ setOverlaySub(m.portRedirecting);
219
191
 
220
- try {
221
- await apiFetch('/api/restart', { method: 'POST' });
222
- } catch {
223
- // Expected: server dies before response completes
224
- }
192
+ try {
193
+ await apiFetch('/api/restart', { method: 'POST' });
194
+ } catch {
195
+ // Expected: server dies before response completes
196
+ }
225
197
 
226
- // Poll new port for health
227
- const newOrigin = `${window.location.protocol}//${window.location.hostname}:${webPort}`;
228
- const deadline = Date.now() + 30_000;
229
- pollRef.current = setInterval(async () => {
230
- if (Date.now() > deadline) {
231
- clearInterval(pollRef.current);
232
- setOverlayMsg(null);
233
- setUpdating(false);
234
- toast.error(m.portRestartTimeout);
235
- return;
236
- }
237
- try {
238
- const res = await fetch(`${newOrigin}/api/health`, { signal: AbortSignal.timeout(2000) });
239
- if (res.ok) {
240
- clearInterval(pollRef.current);
241
- // Redirect to new port
242
- window.location.href = newOrigin;
243
- }
244
- } catch {
245
- // Server not up yet, keep polling
246
- }
247
- }, 1500);
248
- } else if (mcpChanged) {
249
- // MCP-only restart
250
- setOverlayMsg(m.portMcpRestarting);
251
- try {
252
- await apiFetch('/api/mcp/restart', { method: 'POST' });
253
- } catch {
198
+ // Poll new port for health
199
+ const newOrigin = `${window.location.protocol}//${window.location.hostname}:${port}`;
200
+ const deadline = Date.now() + 30_000;
201
+ pollRef.current = setInterval(async () => {
202
+ if (Date.now() > deadline) {
203
+ clearInterval(pollRef.current);
254
204
  setOverlayMsg(null);
255
205
  setUpdating(false);
256
- toast.error(m.portUpdateFailed);
206
+ toast.error(m.portRestartTimeout);
257
207
  return;
258
208
  }
259
-
260
- // Poll MCP status
261
- const deadline = Date.now() + 60_000;
262
- pollRef.current = setInterval(async () => {
263
- if (Date.now() > deadline) {
209
+ try {
210
+ const r = await fetch(`${newOrigin}/api/health`, { signal: AbortSignal.timeout(2000) });
211
+ if (r.ok) {
264
212
  clearInterval(pollRef.current);
265
- setOverlayMsg(null);
266
- setUpdating(false);
267
- toast.error(m.portRestartTimeout);
268
- return;
269
- }
270
- try {
271
- const s = await apiFetch<{ running: boolean; port: number }>('/api/mcp/status', { timeout: 3000 });
272
- if (s.running) {
273
- clearInterval(pollRef.current);
274
- setOverlayMsg(null);
275
- setUpdating(false);
276
- setOrigMcpPort(mcpPort);
277
- toast.success(m.portUpdateSuccess);
278
- }
279
- } catch {
280
- // keep polling
213
+ window.location.href = newOrigin;
281
214
  }
282
- }, 3000);
283
- } else {
284
- // No restart needed (shouldn't reach here, but guard)
285
- setUpdating(false);
286
- toast.success(m.portUpdateSuccess);
287
- }
215
+ } catch {
216
+ // Server not up yet
217
+ }
218
+ }, 1500);
288
219
  } catch {
289
220
  setUpdating(false);
290
221
  toast.error(m.portUpdateFailed);
291
222
  }
292
223
  };
293
224
 
294
- // Don't render until data loaded
295
- if (origWebPort === 0) return null;
225
+ if (origPort === 0) return null;
296
226
 
297
227
  return (
298
228
  <>
@@ -302,34 +232,20 @@ export default function ServerPortsCard({ m }: { m: Record<string, any> }) {
302
232
  <Monitor size={14} className="text-muted-foreground" />
303
233
  </div>
304
234
  <div className="flex-1 min-w-0">
305
- <h3 className="text-sm font-semibold text-foreground">{m.portsCardTitle}</h3>
306
- <p className="text-2xs text-muted-foreground">{m.portsCardDesc}</p>
235
+ <h3 className="text-sm font-semibold text-foreground">{m.webPortLabel}</h3>
236
+ <p className="text-2xs text-muted-foreground">{m.webPortHint}</p>
307
237
  </div>
308
238
  </div>
309
- <div className="px-4 pb-4 space-y-4">
239
+ <div className="px-4 pb-4 space-y-3">
310
240
  <PortField
311
- label={m.webPortLabel} hint={m.webPortHint}
312
- value={webPort} onChange={v => { setWebPort(v); setWebStatus(EMPTY_STATUS); }}
313
- status={webStatus} onCheckPort={p => checkPort(p, 'web')} m={m}
241
+ label="" hint=""
242
+ value={port} onChange={v => { setPort(v); setStatus(EMPTY_STATUS); }}
243
+ status={status} onCheckPort={checkPort} m={m}
314
244
  />
315
- <PortField
316
- label={m.mcpPortLabel} hint={m.mcpPortHint}
317
- value={mcpPort} onChange={v => { setMcpPort(v); setMcpStatus(EMPTY_STATUS); }}
318
- status={mcpStatus} onCheckPort={p => checkPort(p, 'mcp')} m={m}
319
- />
320
-
321
- {/* Conflict warning */}
322
- {portConflict && (
323
- <p className="text-xs flex items-center gap-1.5 text-[var(--amber)]">
324
- <AlertTriangle size={12} /> {m.portConflict}
325
- </p>
326
- )}
327
-
328
- {/* Update button */}
329
245
  <button
330
246
  type="button"
331
247
  onClick={handleUpdate}
332
- disabled={!hasChanges || portConflict || portInvalid || updating}
248
+ disabled={!hasChanges || portInvalid || portUnavailable || updating}
333
249
  className="w-full py-2 rounded-lg text-xs font-medium transition-colors
334
250
  bg-[var(--amber)] text-[var(--amber-foreground)]
335
251
  hover:opacity-90
@@ -341,7 +257,6 @@ export default function ServerPortsCard({ m }: { m: Record<string, any> }) {
341
257
  </div>
342
258
  </div>
343
259
 
344
- {/* Full-screen restart overlay */}
345
260
  {overlayMsg && <RestartOverlay message={overlayMsg} sub={overlaySub} />}
346
261
  </>
347
262
  );
@@ -18,6 +18,18 @@ export interface AgentSettings {
18
18
  export interface SettingsData {
19
19
  ai: AiSettings;
20
20
  agent?: AgentSettings;
21
+ embedding?: {
22
+ enabled: boolean;
23
+ baseUrl: string;
24
+ apiKey: string;
25
+ model: string;
26
+ };
27
+ embeddingStatus?: {
28
+ enabled: boolean;
29
+ ready: boolean;
30
+ building: boolean;
31
+ docCount: number;
32
+ };
21
33
  mindRoot: string;
22
34
  webPassword?: string;
23
35
  authToken?: string; // masked: first-xxxx-••••-last pattern
@@ -5,7 +5,7 @@ import { type ProviderId } from '@/lib/agent/providers';
5
5
  import { type Provider, generateProviderId } from '@/lib/custom-endpoints';
6
6
 
7
7
  export type TestState = 'idle' | 'testing' | 'ok' | 'error';
8
- export type ErrorCode = 'auth_error' | 'model_not_found' | 'rate_limited' | 'network_error' | 'unknown';
8
+ export type ErrorCode = 'auth_error' | 'model_not_found' | 'endpoint_error' | 'rate_limited' | 'network_error' | 'unknown';
9
9
 
10
10
  export interface TestResult {
11
11
  state: TestState;
@@ -78,7 +78,7 @@ export function useCustomProviderForm({
78
78
  body: JSON.stringify(
79
79
  initial?.id
80
80
  ? { provider: initial.id, apiKey, model, baseUrl }
81
- : { protocol, apiKey, model, baseUrl },
81
+ : { provider: protocol, apiKey, model, baseUrl, baseProviderId: protocol },
82
82
  ),
83
83
  });
84
84
  const json = await res.json();
@@ -75,16 +75,60 @@ npm install -g @geminilight/mindos
75
75
 
76
76
  ---
77
77
 
78
+ ## Retrieval strategy
79
+
80
+ When retrieving knowledge, use **two paths in parallel**, then filter before deep-reading:
81
+
82
+ ### Path 1: Directory scan (by name/structure)
83
+
84
+ Browse the KB tree and **look at file names and directory names**. Titles often reveal content without reading. If a user asks about "authentication", and you see `Decisions/auth-jwt-vs-session.md`, that's a strong candidate — read it directly, no search needed.
85
+
86
+ - After bootstrap, scan the tree for paths whose names relate to the query topic.
87
+ - Pay attention to directory semantics: `Decisions/`, `Projects/`, `Workflows/`, `Resources/` etc. each imply what kind of content lives there.
88
+ - If the KB is small (<50 files), a quick tree scan may be faster and more reliable than search.
89
+
90
+ ### Path 2: Full-text search (by content)
91
+
92
+ Use `search` for content that can't be guessed from file names alone.
93
+
94
+ - Craft queries from the user's actual words. If the user says "那个很慢的接口", search for "慢 接口" or "性能 API".
95
+ - One well-targeted search is better than 4 vague ones. Only add a second search if the first returned <3 results or if the topic has obvious alternate terms (e.g., Chinese + English).
96
+ - **Do NOT** mechanically fire 2-4 searches every time. Think first, search precisely.
97
+
98
+ ### Filter: snippet triage before full read
99
+
100
+ Search results include a **snippet** and a **BM25 score**. Use them to decide what to read:
101
+
102
+ - **High score + snippet clearly on-topic** → read full file.
103
+ - **Medium score + snippet partially relevant** → read full file only if no better candidates exist.
104
+ - **Low score or snippet off-topic** → skip. Do not read every search result.
105
+ - Aim to read **1-3 files** deeply, not 10 files superficially.
106
+
107
+ ### Combined example
108
+
109
+ ```
110
+ User: "之前关于数据库选型的讨论"
111
+
112
+ Step 1 (tree scan): See "Decisions/database-postgres-vs-mongo.md" → strong match by name.
113
+ Step 2 (search): search("数据库选型") → returns 5 results.
114
+ Step 3 (triage): Result #1 snippet mentions "PostgreSQL vs MongoDB 对比" (score 18.3) → read.
115
+ Result #2 snippet mentions "数据库连接池配置" (score 4.1) → skip, off-topic.
116
+ Result #3 snippet mentions "选型会议纪要" (score 12.7) → read.
117
+ Step 4 (answer): Cite from the 2-3 files actually read.
118
+ ```
119
+
120
+ ---
121
+
78
122
  ## NEVER do (hard-won pitfalls)
79
123
 
80
124
  - **NEVER write to the KB root** unless explicitly told. Root is for governance files only. New content goes under the most fitting subdirectory.
81
125
  - **NEVER assume directory names.** Infer from the actual bootstrap tree — the KB may use Chinese names or flat layout.
82
126
  - **NEVER use full-file overwrite for a small edit.** Use `mindos file edit-section` or `mindos file insert-heading` for targeted changes. Full rewrites destroy git diffs.
83
- - **NEVER search with a single keyword.** Fire 2-4 parallel searches (synonyms, abbreviations, Chinese/English variants).
84
127
  - **NEVER modify `INSTRUCTION.md` or `README.md` without confirmation.** Governance docs — treat as high-sensitivity.
85
128
  - **NEVER create a file without checking siblings.** Read 1-2 files in the target directory to learn local style.
86
129
  - **NEVER leave orphan references.** After rename/move, check backlinks and update every referring file.
87
130
  - **NEVER skip routing confirmation for multi-file writes.** The user's mental model may differ from yours.
131
+ - **NEVER read every search result.** Use snippet + score to triage. Only deep-read files that are clearly relevant.
88
132
 
89
133
  ---
90
134
 
@@ -119,7 +119,7 @@ export function useAcpDetection(): AcpDetectionState {
119
119
  if (!cancelled) setLoading(false);
120
120
  });
121
121
 
122
- return () => { cancelled = true; };
122
+ return () => { cancelled = true; inflight.current = false; };
123
123
  }, [trigger]); // eslint-disable-line react-hooks/exhaustive-deps
124
124
 
125
125
  return { installedAgents, notInstalledAgents, loading, error, refresh };
@@ -79,7 +79,7 @@ export function useAcpRegistry(): AcpRegistryState {
79
79
  if (!cancelled) setLoading(false);
80
80
  });
81
81
 
82
- return () => { cancelled = true; };
82
+ return () => { cancelled = true; inflight.current = false; };
83
83
  }, [trigger]); // eslint-disable-line react-hooks/exhaustive-deps
84
84
 
85
85
  return { agents, loading, error, retry };