@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,54 @@
1
+ export const dynamic = 'force-dynamic';
2
+
3
+ import { NextRequest, NextResponse } from 'next/server';
4
+ import { validatePlatformConfig } from '@/lib/im/config';
5
+ import { verifyIMCredentials } from '@/lib/im/verify';
6
+ import { handleRouteErrorSimple } from '@/lib/errors';
7
+
8
+ const SUPPORTED_PLATFORMS = new Set([
9
+ 'telegram',
10
+ 'discord',
11
+ 'feishu',
12
+ 'slack',
13
+ 'wecom',
14
+ 'dingtalk',
15
+ 'wechat',
16
+ 'qq',
17
+ ]);
18
+
19
+ export async function POST(req: NextRequest) {
20
+ try {
21
+ const body = await req.json() as { platform?: string; credentials?: unknown };
22
+ const platform = body.platform;
23
+ const credentials = body.credentials;
24
+
25
+ if (!platform || !SUPPORTED_PLATFORMS.has(platform)) {
26
+ return NextResponse.json({ ok: false, error: 'Invalid platform' }, { status: 400 });
27
+ }
28
+
29
+ if (!credentials || typeof credentials !== 'object') {
30
+ return NextResponse.json({ ok: false, error: 'Missing credentials' }, { status: 400 });
31
+ }
32
+
33
+ const validation = validatePlatformConfig(platform as any, credentials);
34
+ if (!validation.valid) {
35
+ return NextResponse.json(
36
+ { ok: false, error: `Missing required fields: ${validation.missing?.join(', ') || 'unknown'}` },
37
+ { status: 400 },
38
+ );
39
+ }
40
+
41
+ const result = await verifyIMCredentials(platform as any, credentials);
42
+ if (!result.ok) {
43
+ return NextResponse.json({ ok: false, error: result.error || 'Credential verification failed' }, { status: 401 });
44
+ }
45
+
46
+ return NextResponse.json({
47
+ ok: true,
48
+ botName: result.botName,
49
+ botId: result.botId,
50
+ });
51
+ } catch (err) {
52
+ return handleRouteErrorSimple(err);
53
+ }
54
+ }
@@ -28,7 +28,7 @@ function truncateText(text: string): { result: string; truncated: boolean } {
28
28
  * resolution at runtime. Running the extraction in a plain Node process
29
29
  * avoids the bundler entirely.
30
30
  */
31
- function extractPdf(buf: Buffer): { text: string; pages: number } {
31
+ function extractPdf(buf: Buffer): { text: string; pages: number; error?: string } {
32
32
  const scriptPath = resolveScript('extract-pdf.cjs');
33
33
  if (!scriptPath) {
34
34
  throw new Error(
@@ -73,7 +73,21 @@ export async function POST(req: NextRequest) {
73
73
  return NextResponse.json({ error: 'PDF is too large (max 12MB)' }, { status: 400 });
74
74
  }
75
75
 
76
- const { text: rawText, pages } = extractPdf(raw);
76
+ const { text: rawText, pages, error: extractError } = extractPdf(raw);
77
+
78
+ // If extraction failed, return error state
79
+ if (extractError) {
80
+ return NextResponse.json({
81
+ name,
82
+ text: '',
83
+ extracted: 'error' as const,
84
+ extractionError: extractError,
85
+ truncated: false,
86
+ totalChars: 0,
87
+ pagesParsed: pages ?? 0,
88
+ });
89
+ }
90
+
77
91
  const text = rawText.replace(/\u0000/g, '').trim();
78
92
  const totalChars = text.length;
79
93
  const { result: finalText, truncated } = truncateText(text);
@@ -81,7 +95,7 @@ export async function POST(req: NextRequest) {
81
95
  return NextResponse.json({
82
96
  name,
83
97
  text: finalText,
84
- extracted: text.length > 0,
98
+ extracted: text.length > 0 ? 'success' : 'empty',
85
99
  truncated,
86
100
  totalChars,
87
101
  pagesParsed: pages,
@@ -2,7 +2,7 @@ export const dynamic = 'force-dynamic';
2
2
  import { NextRequest, NextResponse } from 'next/server';
3
3
  import { getModels as piGetModels } from '@mariozechner/pi-ai';
4
4
  import { effectiveAiConfig, readSettings } from '@/lib/settings';
5
- import { type ProviderId, isProviderId, PROVIDER_PRESETS, toPiProvider, getDefaultBaseUrl } from '@/lib/agent/providers';
5
+ import { type ProviderId, isProviderId, PROVIDER_PRESETS, toPiProvider, getDefaultBaseUrl, getProviderApiType, buildCompatEndpointCandidates } from '@/lib/agent/providers';
6
6
  import { isProviderEntryId, findProvider } from '@/lib/custom-endpoints';
7
7
  import { handleRouteErrorSimple } from '@/lib/errors';
8
8
 
@@ -96,63 +96,59 @@ function getRegistryModels(provider: ProviderId): string[] {
96
96
  }
97
97
 
98
98
  async function fetchModels(provider: ProviderId, apiKey: string, baseUrl: string, signal: AbortSignal): Promise<string[]> {
99
- if (provider === 'anthropic') {
100
- return fetchAnthropicModels(apiKey, signal);
101
- }
102
-
103
- const endpoint = resolveListModelsUrl(provider, baseUrl);
104
- return fetchOpenAICompatModels(endpoint, apiKey, signal);
99
+ const apiType = getProviderApiType(provider);
100
+ const endpoints = resolveListModelsUrls(provider, baseUrl, apiType);
101
+ return fetchCompatModels(endpoints, apiKey, apiType, signal);
105
102
  }
106
103
 
107
- function resolveListModelsUrl(provider: ProviderId, baseUrl: string): string {
104
+ function resolveListModelsUrls(provider: ProviderId, baseUrl: string, apiType: string): string[] {
108
105
  if (baseUrl) {
109
- return baseUrl.replace(/\/+$/, '') + '/models';
106
+ return buildCompatEndpointCandidates(baseUrl, '/models', apiType);
110
107
  }
111
108
 
112
109
  const base = getDefaultBaseUrl(provider);
113
110
  if (base) {
114
- return base.replace(/\/+$/, '') + '/models';
111
+ return buildCompatEndpointCandidates(base, '/models', apiType);
115
112
  }
116
113
 
117
- return 'https://api.openai.com/v1/models';
114
+ return ['https://api.openai.com/v1/models'];
118
115
  }
119
116
 
120
- async function fetchAnthropicModels(apiKey: string, signal: AbortSignal): Promise<string[]> {
121
- const res = await fetch('https://api.anthropic.com/v1/models', {
122
- headers: {
123
- 'x-api-key': apiKey,
124
- 'anthropic-version': '2023-06-01',
125
- },
126
- signal,
127
- });
128
-
129
- if (!res.ok) {
130
- const errBody = await res.text().catch(() => '');
131
- throw new Error(`Failed to list models: HTTP ${res.status} ${errBody.slice(0, 200)}`);
132
- }
117
+ async function fetchCompatModels(
118
+ endpoints: string[], apiKey: string, apiType: string, signal: AbortSignal,
119
+ ): Promise<string[]> {
120
+ let lastError = 'No endpoint candidates';
121
+ const attempted: string[] = [];
122
+
123
+ for (const endpoint of endpoints) {
124
+ attempted.push(endpoint);
125
+ const headers: Record<string, string> = {};
126
+ if (apiType === 'anthropic-messages') {
127
+ if (apiKey) headers['x-api-key'] = apiKey;
128
+ headers['anthropic-version'] = '2023-06-01';
129
+ } else if (apiKey) {
130
+ headers['Authorization'] = `Bearer ${apiKey}`;
131
+ }
133
132
 
134
- const json = await res.json();
135
- if (Array.isArray(json?.data)) {
136
- return json.data.map((m: any) => m.id as string).filter(Boolean).sort();
137
- }
138
- return [];
139
- }
133
+ const res = await fetch(endpoint, { headers, signal });
134
+ if (!res.ok) {
135
+ const errBody = await res.text().catch(() => '');
136
+ lastError = `HTTP ${res.status} @ ${endpoint}: ${errBody.slice(0, 200)}`;
137
+ if (res.status === 404) continue;
138
+ throw new Error(`Failed to list models: ${lastError}`);
139
+ }
140
140
 
141
- async function fetchOpenAICompatModels(
142
- endpoint: string, apiKey: string, signal: AbortSignal,
143
- ): Promise<string[]> {
144
- const headers: Record<string, string> = {};
145
- if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`;
146
- const res = await fetch(endpoint, { headers, signal });
141
+ const json = await res.json();
142
+ if (Array.isArray(json?.data)) {
143
+ return json.data.map((m: any) => m.id as string).filter(Boolean).sort();
144
+ }
147
145
 
148
- if (!res.ok) {
149
- const errBody = await res.text().catch(() => '');
150
- throw new Error(`Failed to list models: HTTP ${res.status} ${errBody.slice(0, 200)}`);
151
- }
146
+ if (Array.isArray(json?.models)) {
147
+ return json.models.map((m: any) => (typeof m === 'string' ? m : m?.id)).filter(Boolean).sort();
148
+ }
152
149
 
153
- const json = await res.json();
154
- if (Array.isArray(json?.data)) {
155
- return json.data.map((m: any) => m.id as string).filter(Boolean).sort();
150
+ throw new Error(`Failed to list models: incompatible response shape from ${endpoint}; tried ${attempted.join(' , ')}`);
156
151
  }
157
- return [];
152
+
153
+ throw new Error(`Failed to list models: ${lastError}; tried ${attempted.join(' , ')}`);
158
154
  }
@@ -5,6 +5,7 @@ import { invalidateCache } from '@/lib/fs';
5
5
  import { ALL_PROVIDER_IDS, getApiKeyEnvVar, getApiKeyFromEnv } from '@/lib/agent/providers';
6
6
  import { parseProviders } from '@/lib/custom-endpoints';
7
7
  import { handleRouteErrorSimple } from '@/lib/errors';
8
+ import { getEmbeddingStatus } from '@/lib/core/hybrid-search';
8
9
 
9
10
  function maskToken(token: string | undefined): string {
10
11
  if (!token) return '';
@@ -41,6 +42,8 @@ export async function GET() {
41
42
  activeProvider: settings.ai.activeProvider,
42
43
  providers: settings.ai.providers,
43
44
  },
45
+ embedding: settings.embedding ?? { enabled: false, baseUrl: '', apiKey: '', model: '' },
46
+ embeddingStatus: getEmbeddingStatus(),
44
47
  mindRoot: settings.mindRoot,
45
48
  webPassword: settings.webPassword ?? '',
46
49
  authToken: maskToken(settings.authToken),
@@ -73,6 +76,18 @@ export async function POST(req: NextRequest) {
73
76
  ? (incomingAuthToken === '' ? '' : current.authToken)
74
77
  : current.authToken;
75
78
 
79
+ // Handle embedding config
80
+ let resolvedEmbedding = current.embedding;
81
+ if (body.embedding && typeof body.embedding === 'object') {
82
+ const e = body.embedding;
83
+ resolvedEmbedding = {
84
+ enabled: (e as any).enabled === true,
85
+ baseUrl: typeof (e as any).baseUrl === 'string' ? (e as any).baseUrl : '',
86
+ apiKey: typeof (e as any).apiKey === 'string' ? (e as any).apiKey : '',
87
+ model: typeof (e as any).model === 'string' ? (e as any).model : '',
88
+ };
89
+ }
90
+
76
91
  // Handle connectionMode: validate if provided, otherwise keep existing
77
92
  let resolvedConnectionMode = current.connectionMode ?? { cli: true, mcp: false };
78
93
  if (body.connectionMode && typeof body.connectionMode === 'object') {
@@ -87,6 +102,7 @@ export async function POST(req: NextRequest) {
87
102
 
88
103
  const next: ServerSettings = {
89
104
  ai: resolvedAi,
105
+ embedding: resolvedEmbedding,
90
106
  mindRoot: body.mindRoot ?? current.mindRoot,
91
107
  agent: body.agent ?? current.agent,
92
108
  webPassword: resolvedWebPassword,
@@ -9,7 +9,7 @@ import { handleRouteErrorSimple } from '@/lib/errors';
9
9
 
10
10
  const TIMEOUT = 15_000;
11
11
 
12
- type ErrorCode = 'auth_error' | 'model_not_found' | 'rate_limited' | 'network_error' | 'unknown';
12
+ type ErrorCode = 'auth_error' | 'model_not_found' | 'endpoint_error' | 'rate_limited' | 'network_error' | 'unknown';
13
13
 
14
14
  function classifyPiAiError(err: unknown): { code: ErrorCode; error: string } {
15
15
  const msg = err instanceof Error ? err.message : String(err);
@@ -24,7 +24,10 @@ function classifyPiAiError(err: unknown): { code: ErrorCode; error: string } {
24
24
  || lower.includes('api key') && (lower.includes('not valid') || lower.includes('incorrect')))
25
25
  return { code: 'auth_error', error: 'Invalid API key' };
26
26
 
27
- if (lower.includes('404') || lower.includes('not found') || lower.includes('does not exist'))
27
+ if (lower.includes('404') || lower.includes('page not found') || lower.includes('invalid url'))
28
+ return { code: 'endpoint_error', error: `Endpoint or protocol mismatch: ${msg.slice(0, 200)}` };
29
+
30
+ if (lower.includes('model') && (lower.includes('not found') || lower.includes('does not exist')))
28
31
  return { code: 'model_not_found', error: `Model not found: ${msg.slice(0, 200)}` };
29
32
 
30
33
  if (lower.includes('429') || lower.includes('rate') || lower.includes('quota'))
@@ -359,7 +359,7 @@ export default function ViewPageClient({
359
359
  <div className="flex flex-col min-h-screen">
360
360
  {/* Top bar */}
361
361
  <div className="sticky top-[52px] md:top-0 z-20 border-b border-border px-4 md:px-6 h-[46px] flex items-center" style={{ background: 'var(--background)' }}>
362
- <div className="content-width flex items-center justify-between gap-2 h-full">
362
+ <div className="w-full min-w-0 flex items-center justify-between gap-3 h-full">
363
363
  <div className="min-w-0 flex-1 flex items-center gap-1.5">
364
364
  <button
365
365
  onClick={() => router.back()}
@@ -21,7 +21,7 @@ export default function Breadcrumb({ filePath }: { filePath: string }) {
21
21
 
22
22
  if (friendly) {
23
23
  return (
24
- <nav className="flex items-center gap-2 text-xs text-muted-foreground flex-wrap">
24
+ <nav className="flex min-w-0 items-center gap-1 text-xs text-muted-foreground flex-nowrap overflow-hidden">
25
25
  <Link
26
26
  href="/"
27
27
  className="p-1.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors shrink-0"
@@ -30,17 +30,17 @@ export default function Breadcrumb({ filePath }: { filePath: string }) {
30
30
  <Home size={14} />
31
31
  </Link>
32
32
  <ChevronRight size={12} className="text-muted-foreground/50 shrink-0" />
33
- <div className="flex items-center gap-1.5 text-foreground font-medium shrink-0">
33
+ <span className="min-w-0 flex items-center gap-1.5 text-foreground font-medium">
34
34
  {friendly.icon}
35
- <span>{friendly.getLabel(t)}</span>
36
- </div>
35
+ <span className="block truncate max-w-[180px] sm:max-w-[260px] md:max-w-[360px]">{friendly.getLabel(t)}</span>
36
+ </span>
37
37
  </nav>
38
38
  );
39
39
  }
40
40
 
41
41
  const parts = filePath.split('/');
42
42
  return (
43
- <nav className="flex items-center gap-2 text-xs text-muted-foreground flex-wrap">
43
+ <nav className="flex min-w-0 items-center gap-1 text-xs text-muted-foreground flex-nowrap overflow-hidden">
44
44
  <Link
45
45
  href="/"
46
46
  className="p-1.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors shrink-0"
@@ -52,19 +52,19 @@ export default function Breadcrumb({ filePath }: { filePath: string }) {
52
52
  const isLast = i === parts.length - 1;
53
53
  const href = '/view/' + parts.slice(0, i + 1).map(encodeURIComponent).join('/');
54
54
  return (
55
- <div key={i} className="flex items-center gap-2 min-w-0">
55
+ <span key={i} className="flex items-center gap-1 min-w-0">
56
56
  <ChevronRight size={12} className="text-muted-foreground/50 shrink-0" />
57
57
  {isLast ? (
58
- <div className="flex items-center gap-1.5 text-foreground font-medium shrink-0">
58
+ <span className="min-w-0 flex items-center gap-1.5 px-1 py-0.5 text-foreground font-medium">
59
59
  <FileTypeIcon name={part} />
60
- <span suppressHydrationWarning>{part}</span>
61
- </div>
60
+ <span className="block truncate max-w-[180px] sm:max-w-[260px] md:max-w-[360px]" suppressHydrationWarning>{part}</span>
61
+ </span>
62
62
  ) : (
63
- <Link href={href} className="px-2 py-1 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors truncate text-muted-foreground hover:text-foreground" title={part}>
63
+ <Link href={href} className="block px-1 py-0.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors truncate max-w-[120px] sm:max-w-[160px] md:max-w-[200px]" title={part}>
64
64
  <span suppressHydrationWarning>{part}</span>
65
65
  </Link>
66
66
  )}
67
- </div>
67
+ </span>
68
68
  );
69
69
  })}
70
70
  </nav>
@@ -484,7 +484,7 @@ export default function DirView({ dirPath, entries, spacePreview }: DirViewProps
484
484
  <div className="flex flex-col min-h-screen">
485
485
  {/* Topbar */}
486
486
  <div className="sticky top-[52px] md:top-0 z-20 border-b border-border px-4 md:px-6 h-[46px] flex items-center bg-background">
487
- <div className="max-w-[860px] mx-auto flex items-center justify-between gap-2 w-full">
487
+ <div className="w-full flex items-center justify-between gap-2">
488
488
  <div className="min-w-0 flex-1">
489
489
  <Breadcrumb filePath={dirPath} />
490
490
  </div>
@@ -163,7 +163,7 @@ export default function FindInPage({ containerRef, onClose }: FindInPageProps) {
163
163
  outline: 2px solid rgba(250, 204, 21, 0.5);
164
164
  }
165
165
  `}</style>
166
- <div className="sticky top-[96px] md:top-[44px] z-30 flex justify-end px-4 md:px-6 pointer-events-none" data-find-in-page>
166
+ <div className="sticky top-[98px] md:top-[46px] z-30 flex justify-end px-4 md:px-6 pointer-events-none" data-find-in-page>
167
167
  <div className="pointer-events-auto flex items-center gap-1.5 px-3 py-1.5 rounded-lg border border-border bg-card shadow-lg">
168
168
  <input
169
169
  ref={inputRef}
@@ -197,7 +197,7 @@ export default function InboxView() {
197
197
  return (
198
198
  <div className="flex flex-col min-h-screen">
199
199
  <div className="sticky top-[52px] md:top-0 z-20 border-b border-border px-4 md:px-6 h-[46px] flex items-center bg-background">
200
- <div className="max-w-[780px] mx-auto">
200
+ <div className="px-4 md:px-6">
201
201
  <div className="h-5 w-32 bg-muted rounded animate-pulse" />
202
202
  </div>
203
203
  </div>
@@ -226,7 +226,7 @@ export default function InboxView() {
226
226
 
227
227
  {/* ─── Sticky Top Bar ─── */}
228
228
  <div className="sticky top-[52px] md:top-0 z-20 border-b border-border h-[46px] flex items-center bg-background">
229
- <div className="max-w-[780px] mx-auto px-4 md:px-6 flex items-center w-full">
229
+ <div className="w-full px-4 md:px-6 flex items-center justify-between">
230
230
  <div className="flex items-center gap-3">
231
231
  {/* Back */}
232
232
  <button
@@ -102,6 +102,10 @@ const components: Components = {
102
102
  void node;
103
103
  return <p {...stripNonDom(rest)} suppressHydrationWarning>{children}</p>;
104
104
  },
105
+ span({ children, node, ...rest }) {
106
+ void node;
107
+ return <span {...stripNonDom(rest)} suppressHydrationWarning>{children}</span>;
108
+ },
105
109
  a({ href, children, node, ...rest }) {
106
110
  void node;
107
111
  const isExternal = href?.startsWith('http');
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useMemo, useState, useRef, useEffect, useCallback } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
- import { ChevronsDownUp, ChevronsUpDown, Plus, Import, FileText, Layers, MoreHorizontal, Eye, EyeOff, Trash2, Inbox } from 'lucide-react';
5
+ import { ChevronsDownUp, ChevronsUpDown, Plus, Import, FileText, Layers, MoreHorizontal, Eye, EyeOff, Trash2, Inbox, History } from 'lucide-react';
6
6
  import type { PanelId } from './ActivityBar';
7
7
  import type { FileNode } from '@/lib/types';
8
8
  import FileTree, { setShowHiddenFiles, useShowHiddenFiles } from './FileTree';
@@ -284,15 +284,6 @@ export default function Panel({
284
284
  ref={morePopoverRef}
285
285
  className="absolute top-full right-0 mt-1 min-w-[172px] bg-card border border-border rounded-lg shadow-lg py-1 z-50"
286
286
  >
287
- <button
288
- className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
289
- onClick={() => { setShowHiddenFiles(!showHidden); }}
290
- >
291
- {showHidden ? <EyeOff size={14} className="shrink-0" /> : <Eye size={14} className="shrink-0" />}
292
- <span className="flex-1">{t.sidebar.showHiddenFiles}</span>
293
- {showHidden && <span className="text-[var(--amber)] text-xs">✓</span>}
294
- </button>
295
- <div className="my-1 border-t border-border/50" />
296
287
  <button
297
288
  className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
298
289
  onClick={() => { setMorePopover(false); router.push('/view/Inbox/'); }}
@@ -303,6 +294,13 @@ export default function Panel({
303
294
  <span className="text-2xs font-medium tabular-nums px-1.5 py-px rounded-full bg-[var(--amber)]/10 text-[var(--amber)]/70">{inboxCount}</span>
304
295
  )}
305
296
  </button>
297
+ <button
298
+ className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
299
+ onClick={() => { setMorePopover(false); router.push('/view/.mindos/change-log.json'); }}
300
+ >
301
+ <History size={14} className="shrink-0 text-[var(--amber)]" />
302
+ <span className="flex-1">{t.changes.title}</span>
303
+ </button>
306
304
  <button
307
305
  className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
308
306
  onClick={() => { setMorePopover(false); router.push('/trash'); }}
@@ -313,6 +311,15 @@ export default function Panel({
313
311
  <span className="text-xs text-muted-foreground tabular-nums">{trashCount}</span>
314
312
  )}
315
313
  </button>
314
+ <div className="my-1 border-t border-border/50" />
315
+ <button
316
+ className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
317
+ onClick={() => { setShowHiddenFiles(!showHidden); }}
318
+ >
319
+ {showHidden ? <EyeOff size={14} className="shrink-0" /> : <Eye size={14} className="shrink-0" />}
320
+ <span className="flex-1">{t.sidebar.showHiddenFiles}</span>
321
+ {showHidden && <span className="text-[var(--amber)] text-xs">✓</span>}
322
+ </button>
316
323
  </div>
317
324
  )}
318
325
  </div>
@@ -34,7 +34,7 @@ function parseHeadings(content: string): Heading[] {
34
34
  return headings;
35
35
  }
36
36
 
37
- const TOPBAR_H = 44;
37
+ const TOPBAR_H = 46;
38
38
  const SCROLL_OFFSET = TOPBAR_H + 12;
39
39
  const NAV_W = 212;
40
40
 
@@ -122,7 +122,7 @@ export default function TableOfContents({ content }: TableOfContentsProps) {
122
122
  {/* Collapse / expand toggle — separate from aside so it stays visible */}
123
123
  <button
124
124
  onClick={() => setCollapsed(v => !v)}
125
- className="hidden xl:flex fixed z-10 top-[50px] flex items-center justify-center w-5 h-8 rounded-l-md border border-r-0 border-border hover:bg-muted transition-colors"
125
+ className="hidden xl:flex fixed z-10 top-[46px] flex items-center justify-center w-5 h-8 rounded-l-md border border-r-0 border-border hover:bg-muted transition-colors"
126
126
  style={{
127
127
  right: `calc(var(--right-panel-width, 0px) + ${collapsed ? 0 : NAV_W}px)`,
128
128
  background: 'var(--background)',
@@ -149,17 +149,17 @@ export default function TableOfContents({ content }: TableOfContentsProps) {
149
149
  transition: 'transform 200ms ease-in-out, right 200ms ease-out',
150
150
  }}
151
151
  >
152
+ <div className="flex items-center h-[46px] px-4 border-l border-b border-border" style={{ background: 'var(--background)' }}>
153
+ <p className="text-2xs font-semibold uppercase tracking-wider text-muted-foreground/55 shrink-0">
154
+ {t.view.tocTitle}
155
+ </p>
156
+ </div>
152
157
  <nav
153
158
  ref={navRef}
154
159
  aria-label={t.view.tocTitle}
155
- className="flex flex-col gap-0.5 overflow-y-auto min-h-0 flex-1 py-5 pl-2 pr-3 border-l border-border"
160
+ className="flex flex-col gap-0.5 overflow-y-auto min-h-0 flex-1 pt-3 pb-5 pl-2 pr-3 border-l border-border"
156
161
  style={{ background: 'var(--background)' }}
157
162
  >
158
- <p
159
- className="text-2xs font-semibold uppercase tracking-wider px-2 mb-1 text-muted-foreground/50 shrink-0"
160
- >
161
- {t.view.tocTitle}
162
- </p>
163
163
  {headings.map((heading, i) => {
164
164
  const indent = (heading.level - minLevel) * 14;
165
165
  const isActive = activeId === heading.id;
@@ -194,7 +194,7 @@ export default function TableOfContents({ content }: TableOfContentsProps) {
194
194
  }}
195
195
  title={heading.text}
196
196
  >
197
- <span className="line-clamp-2" suppressHydrationWarning>
197
+ <span className="block truncate" suppressHydrationWarning>
198
198
  {heading.text}
199
199
  </span>
200
200
  </a>