@geminilight/mindos 0.6.67 → 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 (500) 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 +26 -25
  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.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/registry/route.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/session/route.js +1 -1
  41. package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +1 -1
  42. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
  45. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/ask/route.js +17 -17
  49. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  50. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  54. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  56. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  58. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/channels/verify/route.js +1 -0
  60. package/_standalone/.next/server/app/api/channels/verify/route.js.nft.json +1 -0
  61. package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -0
  62. package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  64. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
  66. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  68. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  69. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  71. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  73. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  75. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  77. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
  85. package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  89. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
  91. package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  93. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  102. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  104. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  107. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  109. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  112. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  113. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  115. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  122. package/_standalone/.next/server/app/api/space-overview/route.js +2 -2
  123. package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
  124. package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  126. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  127. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  129. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  132. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  133. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  134. package/_standalone/.next/server/app/changelog/page.js +1 -1
  135. package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
  136. package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  137. package/_standalone/.next/server/app/changes/page.js +1 -1
  138. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  139. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  140. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  141. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  142. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  143. package/_standalone/.next/server/app/echo/page.js +1 -1
  144. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  145. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  146. package/_standalone/.next/server/app/explore/page.js +1 -1
  147. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  148. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  149. package/_standalone/.next/server/app/help/page.js +1 -1
  150. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  151. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  152. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  153. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  154. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  155. package/_standalone/.next/server/app/login/page.js +1 -1
  156. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  157. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  158. package/_standalone/.next/server/app/page.js +1 -1
  159. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  160. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  161. package/_standalone/.next/server/app/setup/page.js +1 -1
  162. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  163. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  164. package/_standalone/.next/server/app/trash/page.js +3 -3
  165. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  166. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  167. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  168. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  169. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  170. package/_standalone/.next/server/app/wiki/page.js +1 -1
  171. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  172. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  173. package/_standalone/.next/server/app-paths-manifest.json +26 -25
  174. package/_standalone/.next/server/chunks/3437.js +2 -2
  175. package/_standalone/.next/server/chunks/5299.js +1 -0
  176. package/_standalone/.next/server/chunks/6022.js +39 -39
  177. package/_standalone/.next/server/chunks/6133.js +54 -0
  178. package/_standalone/.next/server/chunks/6539.js +1 -1
  179. package/_standalone/.next/server/chunks/8326.js +1 -0
  180. package/_standalone/.next/server/chunks/8388.js +5 -3
  181. package/_standalone/.next/server/chunks/953.js +6 -4
  182. package/_standalone/.next/server/chunks/9938.js +24 -0
  183. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  184. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  185. package/_standalone/.next/server/pages/500.html +2 -2
  186. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  187. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  188. package/_standalone/.next/static/chunks/1814.8a1fef15856dce84.js +1 -0
  189. package/_standalone/.next/static/chunks/2654-e07c692d6c99f25b.js +1 -0
  190. package/_standalone/.next/static/chunks/{2935.7d75923daaf448d3.js → 2935.9b08eeade3644806.js} +1 -1
  191. package/_standalone/.next/static/chunks/3269.a7343771e3f0ff58.js +48 -0
  192. package/_standalone/.next/static/chunks/3637.2b2697198968d83f.js +1 -0
  193. package/_standalone/.next/static/chunks/{5550-b7c97fc13628db15.js → 4327-d70a8d457e2d03fe.js} +1 -1
  194. package/_standalone/.next/static/chunks/48-c88ea6a2a45f15b4.js +28 -0
  195. package/_standalone/.next/static/chunks/5581-6d403608b5dfb20b.js +29 -0
  196. package/_standalone/.next/static/chunks/6902-edc5c487c696bd0b.js +3 -0
  197. package/_standalone/.next/static/chunks/808.72eb7bdd399e9a24.js +1 -0
  198. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  199. package/_standalone/.next/static/chunks/app/_global-error/{page-e0c1e2c67572781c.js → page-930dfa67e2789df5.js} +1 -1
  200. package/_standalone/.next/static/chunks/app/agents/page-3dc2bf2f6bc7334c.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  202. package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  203. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-930dfa67e2789df5.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/a2a/route-930dfa67e2789df5.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/acp/config/route-930dfa67e2789df5.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/acp/detect/route-930dfa67e2789df5.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/acp/install/route-930dfa67e2789df5.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/acp/registry/route-930dfa67e2789df5.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/acp/session/route-930dfa67e2789df5.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/agent-activity/route-930dfa67e2789df5.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-930dfa67e2789df5.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-930dfa67e2789df5.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/agents/custom/route-930dfa67e2789df5.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/ask/route-930dfa67e2789df5.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-930dfa67e2789df5.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/auth/route-930dfa67e2789df5.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/backlinks/route-930dfa67e2789df5.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/bootstrap/route-930dfa67e2789df5.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/changes/route-930dfa67e2789df5.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/channels/verify/route-930dfa67e2789df5.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/connect/route-930dfa67e2789df5.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/export/route-930dfa67e2789df5.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-930dfa67e2789df5.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/file/import/route-930dfa67e2789df5.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/file/raw/route-930dfa67e2789df5.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/file/route-930dfa67e2789df5.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/files/route-930dfa67e2789df5.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/git/route-930dfa67e2789df5.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/graph/route-930dfa67e2789df5.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/health/route-930dfa67e2789df5.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/im/config/route-930dfa67e2789df5.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/im/status/route-930dfa67e2789df5.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/im/test/route-930dfa67e2789df5.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-930dfa67e2789df5.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/inbox/route-930dfa67e2789df5.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/init/route-930dfa67e2789df5.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/lint/route-930dfa67e2789df5.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-930dfa67e2789df5.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-930dfa67e2789df5.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/mcp/install/route-930dfa67e2789df5.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-930dfa67e2789df5.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-930dfa67e2789df5.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/mcp/status/route-930dfa67e2789df5.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-930dfa67e2789df5.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-930dfa67e2789df5.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/monitoring/route-930dfa67e2789df5.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/recent-files/route-930dfa67e2789df5.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/restart/route-930dfa67e2789df5.js +1 -0
  249. package/_standalone/.next/static/chunks/app/api/search/route-930dfa67e2789df5.js +1 -0
  250. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-930dfa67e2789df5.js +1 -0
  251. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-930dfa67e2789df5.js +1 -0
  252. package/_standalone/.next/static/chunks/app/api/settings/route-930dfa67e2789df5.js +1 -0
  253. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-930dfa67e2789df5.js +1 -0
  254. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-930dfa67e2789df5.js +1 -0
  255. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-930dfa67e2789df5.js +1 -0
  256. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-930dfa67e2789df5.js +1 -0
  257. package/_standalone/.next/static/chunks/app/api/setup/ls/route-930dfa67e2789df5.js +1 -0
  258. package/_standalone/.next/static/chunks/app/api/setup/route-930dfa67e2789df5.js +1 -0
  259. package/_standalone/.next/static/chunks/app/api/skills/route-930dfa67e2789df5.js +1 -0
  260. package/_standalone/.next/static/chunks/app/api/space-overview/route-930dfa67e2789df5.js +1 -0
  261. package/_standalone/.next/static/chunks/app/api/sync/route-930dfa67e2789df5.js +1 -0
  262. package/_standalone/.next/static/chunks/app/api/tree-version/route-930dfa67e2789df5.js +1 -0
  263. package/_standalone/.next/static/chunks/app/api/uninstall/route-930dfa67e2789df5.js +1 -0
  264. package/_standalone/.next/static/chunks/app/api/update/route-930dfa67e2789df5.js +1 -0
  265. package/_standalone/.next/static/chunks/app/api/update-check/route-930dfa67e2789df5.js +1 -0
  266. package/_standalone/.next/static/chunks/app/api/update-status/route-930dfa67e2789df5.js +1 -0
  267. package/_standalone/.next/static/chunks/app/api/workflows/route-930dfa67e2789df5.js +1 -0
  268. package/_standalone/.next/static/chunks/app/changes/page-930dfa67e2789df5.js +1 -0
  269. package/_standalone/.next/static/chunks/app/echo/[segment]/page-75a6330292613587.js +157 -0
  270. package/_standalone/.next/static/chunks/app/echo/page-930dfa67e2789df5.js +1 -0
  271. package/_standalone/.next/static/chunks/app/{layout-9bb19a959ffb87ac.js → layout-8aa53b34ef34a246.js} +28 -28
  272. package/_standalone/.next/static/chunks/app/loading-930dfa67e2789df5.js +1 -0
  273. package/_standalone/.next/static/chunks/app/{page-c3be6477dbcf182d.js → page-318332501426ef5b.js} +1 -1
  274. package/_standalone/.next/static/chunks/app/trash/page-17bd5aedcfea9b65.js +1 -0
  275. package/_standalone/.next/static/chunks/app/view/[...path]/loading-930dfa67e2789df5.js +1 -0
  276. package/_standalone/.next/static/chunks/app/view/[...path]/page-d5c37c41c556013d.js +12 -0
  277. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-930dfa67e2789df5.js +1 -0
  278. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-930dfa67e2789df5.js +1 -0
  279. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-930dfa67e2789df5.js +1 -0
  280. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-930dfa67e2789df5.js +1 -0
  281. package/_standalone/.next/static/chunks/webpack-1c2d44f6d86f3986.js +1 -0
  282. package/_standalone/.next/static/css/a8cadde78aea8585.css +1 -0
  283. package/_standalone/.next/static/ixCTELNH6V05Z00pC6ZMO/_buildManifest.js +1 -0
  284. package/_standalone/.next/trace +72 -71
  285. package/_standalone/.next/types/routes.d.ts +2 -1
  286. package/_standalone/.next/types/validator.ts +9 -0
  287. package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  288. package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  289. package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  290. package/_standalone/__tests__/acp/agent-descriptors.test.ts +101 -3
  291. package/_standalone/__tests__/acp/registry.test.ts +34 -5
  292. package/_standalone/__tests__/acp/session.test.ts +346 -167
  293. package/_standalone/__tests__/agent/provider-endpoints.test.ts +70 -0
  294. package/_standalone/__tests__/api/channels-verify.test.ts +75 -0
  295. package/_standalone/__tests__/api/extract-pdf.test.ts +265 -0
  296. package/_standalone/__tests__/api/test-key.test.ts +15 -3
  297. package/_standalone/__tests__/channel-mgmt.test.js +11 -0
  298. package/_standalone/__tests__/components/breadcrumb-header-ux.test.ts +14 -0
  299. package/_standalone/__tests__/components/header-toc-vertical-alignment.test.ts +23 -0
  300. package/_standalone/__tests__/components/table-of-contents-header-layout.test.ts +15 -0
  301. package/_standalone/__tests__/components/view-page-header-layout.test.ts +13 -0
  302. package/_standalone/__tests__/components/view-page-header-scroll-stability.test.ts +34 -0
  303. package/_standalone/__tests__/core/hybrid-search.test.ts +109 -0
  304. package/_standalone/components/Breadcrumb.tsx +10 -10
  305. package/_standalone/components/FindInPage.tsx +1 -1
  306. package/_standalone/components/MarkdownView.tsx +4 -0
  307. package/_standalone/components/Panel.tsx +17 -10
  308. package/_standalone/components/TableOfContents.tsx +9 -9
  309. package/_standalone/components/agents/AgentsContentChannelDetail.tsx +168 -54
  310. package/_standalone/components/agents/AgentsContentChannels.tsx +22 -22
  311. package/_standalone/components/ask/AskContent.tsx +68 -28
  312. package/_standalone/components/ask/AskHeader.tsx +6 -2
  313. package/_standalone/components/ask/ProviderModelCapsule.tsx +11 -9
  314. package/_standalone/components/ask/SessionHistoryPanel.tsx +398 -0
  315. package/_standalone/components/panels/AgentsPanel.tsx +8 -1
  316. package/_standalone/components/settings/AiTab.tsx +5 -1
  317. package/_standalone/components/settings/KnowledgeTab.tsx +92 -1
  318. package/_standalone/components/settings/McpConnectGuides.tsx +4 -0
  319. package/_standalone/components/settings/McpPortSection.tsx +207 -0
  320. package/_standalone/components/settings/McpTab.tsx +1 -5
  321. package/_standalone/components/settings/TestButton.tsx +1 -0
  322. package/_standalone/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  323. package/_standalone/components/settings/types.ts +12 -0
  324. package/_standalone/components/settings/useCustomProviderForm.ts +2 -2
  325. package/_standalone/data/skills/mindos/SKILL.md +45 -1
  326. package/_standalone/hooks/useAcpDetection.ts +1 -1
  327. package/_standalone/hooks/useAcpRegistry.ts +1 -1
  328. package/_standalone/hooks/useFileImport.ts +7 -2
  329. package/_standalone/hooks/useFileUpload.ts +17 -10
  330. package/_standalone/lib/acp/index.ts +4 -6
  331. package/_standalone/lib/acp/types.ts +0 -29
  332. package/_standalone/lib/im/platforms.ts +6 -2
  333. package/_standalone/lib/pdf-extract.ts +6 -2
  334. package/_standalone/package-lock.json +12 -2
  335. package/_standalone/package.json +2 -1
  336. package/_standalone/tsconfig.tsbuildinfo +1 -1
  337. package/app/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  338. package/app/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  339. package/app/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  340. package/app/app/api/acp/detect/route.ts +9 -15
  341. package/app/app/api/channels/verify/route.ts +54 -0
  342. package/app/app/api/extract-pdf/route.ts +17 -3
  343. package/app/app/api/settings/list-models/route.ts +40 -44
  344. package/app/app/api/settings/route.ts +16 -0
  345. package/app/app/api/settings/test-key/route.ts +5 -2
  346. package/app/app/view/[...path]/ViewPageClient.tsx +1 -1
  347. package/app/components/Breadcrumb.tsx +10 -10
  348. package/app/components/DirView.tsx +1 -1
  349. package/app/components/FindInPage.tsx +1 -1
  350. package/app/components/InboxView.tsx +2 -2
  351. package/app/components/MarkdownView.tsx +4 -0
  352. package/app/components/Panel.tsx +17 -10
  353. package/app/components/TableOfContents.tsx +9 -9
  354. package/app/components/agents/AgentsContentChannelDetail.tsx +168 -54
  355. package/app/components/agents/AgentsContentChannels.tsx +22 -22
  356. package/app/components/ask/AskContent.tsx +68 -28
  357. package/app/components/ask/AskHeader.tsx +6 -2
  358. package/app/components/ask/ProviderModelCapsule.tsx +11 -9
  359. package/app/components/ask/SessionHistoryPanel.tsx +398 -0
  360. package/app/components/panels/AgentsPanel.tsx +8 -1
  361. package/app/components/settings/AiTab.tsx +5 -1
  362. package/app/components/settings/KnowledgeTab.tsx +92 -1
  363. package/app/components/settings/McpConnectGuides.tsx +4 -0
  364. package/app/components/settings/McpPortSection.tsx +207 -0
  365. package/app/components/settings/McpTab.tsx +1 -5
  366. package/app/components/settings/TestButton.tsx +1 -0
  367. package/app/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  368. package/app/components/settings/types.ts +12 -0
  369. package/app/components/settings/useCustomProviderForm.ts +2 -2
  370. package/app/data/skills/mindos/SKILL.md +45 -1
  371. package/app/hooks/useAcpDetection.ts +1 -1
  372. package/app/hooks/useAcpRegistry.ts +1 -1
  373. package/app/hooks/useFileImport.ts +7 -2
  374. package/app/hooks/useFileUpload.ts +17 -10
  375. package/app/lib/acp/agent-descriptors.ts +69 -29
  376. package/app/lib/acp/index.ts +4 -6
  377. package/app/lib/acp/registry.ts +43 -47
  378. package/app/lib/acp/session.ts +253 -517
  379. package/app/lib/acp/subprocess.ts +249 -414
  380. package/app/lib/acp/types.ts +0 -29
  381. package/app/lib/agent/model.ts +20 -4
  382. package/app/lib/agent/non-streaming.ts +37 -20
  383. package/app/lib/agent/providers.ts +31 -0
  384. package/app/lib/agent/tools.ts +5 -3
  385. package/app/lib/core/embedding-index.ts +285 -0
  386. package/app/lib/core/embedding-provider.ts +164 -0
  387. package/app/lib/core/hybrid-search.ts +160 -0
  388. package/app/lib/core/search.ts +11 -21
  389. package/app/lib/i18n/modules/ai-chat.ts +26 -0
  390. package/app/lib/i18n/modules/panels.ts +14 -0
  391. package/app/lib/i18n/modules/settings.ts +2 -0
  392. package/app/lib/im/platforms.ts +6 -2
  393. package/app/lib/im/verify.ts +94 -0
  394. package/app/lib/pdf-extract.ts +6 -2
  395. package/app/lib/settings.ts +23 -0
  396. package/app/package.json +2 -1
  397. package/bin/cli.js +3 -1
  398. package/bin/commands/channel.js +342 -0
  399. package/bin/commands/update.js +11 -4
  400. package/bin/lib/build.js +34 -16
  401. package/bin/lib/channel-config.js +168 -0
  402. package/bin/lib/channel-constants.js +88 -0
  403. package/bin/lib/channel-mgmt.js +244 -0
  404. package/bin/lib/channel-prompts.js +72 -0
  405. package/bin/lib/channel-validate.js +57 -0
  406. package/bin/lib/safe-rm.js +165 -0
  407. package/package.json +1 -1
  408. package/skills/mindos/SKILL.md +45 -1
  409. package/_standalone/.next/server/chunks/1750.js +0 -1
  410. package/_standalone/.next/server/chunks/8947.js +0 -52
  411. package/_standalone/.next/static/0JtsgqDZLSJ6MrIZIV6gC/_buildManifest.js +0 -1
  412. package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
  413. package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +0 -1
  414. package/_standalone/.next/static/chunks/4351-9ab695985bb808ad.js +0 -1
  415. package/_standalone/.next/static/chunks/476.463546c195b89cce.js +0 -48
  416. package/_standalone/.next/static/chunks/5133-3779d65f4fdfb041.js +0 -30
  417. package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
  418. package/_standalone/.next/static/chunks/5998.7bd28de9747440b5.js +0 -1
  419. package/_standalone/.next/static/chunks/app/agents/page-4c0637183e46c8d3.js +0 -1
  420. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e0c1e2c67572781c.js +0 -1
  421. package/_standalone/.next/static/chunks/app/api/a2a/route-e0c1e2c67572781c.js +0 -1
  422. package/_standalone/.next/static/chunks/app/api/acp/config/route-e0c1e2c67572781c.js +0 -1
  423. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e0c1e2c67572781c.js +0 -1
  424. package/_standalone/.next/static/chunks/app/api/acp/install/route-e0c1e2c67572781c.js +0 -1
  425. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e0c1e2c67572781c.js +0 -1
  426. package/_standalone/.next/static/chunks/app/api/acp/session/route-e0c1e2c67572781c.js +0 -1
  427. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e0c1e2c67572781c.js +0 -1
  428. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-e0c1e2c67572781c.js +0 -1
  429. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-e0c1e2c67572781c.js +0 -1
  430. package/_standalone/.next/static/chunks/app/api/agents/custom/route-e0c1e2c67572781c.js +0 -1
  431. package/_standalone/.next/static/chunks/app/api/ask/route-e0c1e2c67572781c.js +0 -1
  432. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e0c1e2c67572781c.js +0 -1
  433. package/_standalone/.next/static/chunks/app/api/auth/route-e0c1e2c67572781c.js +0 -1
  434. package/_standalone/.next/static/chunks/app/api/backlinks/route-e0c1e2c67572781c.js +0 -1
  435. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e0c1e2c67572781c.js +0 -1
  436. package/_standalone/.next/static/chunks/app/api/changes/route-e0c1e2c67572781c.js +0 -1
  437. package/_standalone/.next/static/chunks/app/api/connect/route-e0c1e2c67572781c.js +0 -1
  438. package/_standalone/.next/static/chunks/app/api/export/route-e0c1e2c67572781c.js +0 -1
  439. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e0c1e2c67572781c.js +0 -1
  440. package/_standalone/.next/static/chunks/app/api/file/import/route-e0c1e2c67572781c.js +0 -1
  441. package/_standalone/.next/static/chunks/app/api/file/raw/route-e0c1e2c67572781c.js +0 -1
  442. package/_standalone/.next/static/chunks/app/api/file/route-e0c1e2c67572781c.js +0 -1
  443. package/_standalone/.next/static/chunks/app/api/files/route-e0c1e2c67572781c.js +0 -1
  444. package/_standalone/.next/static/chunks/app/api/git/route-e0c1e2c67572781c.js +0 -1
  445. package/_standalone/.next/static/chunks/app/api/graph/route-e0c1e2c67572781c.js +0 -1
  446. package/_standalone/.next/static/chunks/app/api/health/route-e0c1e2c67572781c.js +0 -1
  447. package/_standalone/.next/static/chunks/app/api/im/config/route-e0c1e2c67572781c.js +0 -1
  448. package/_standalone/.next/static/chunks/app/api/im/status/route-e0c1e2c67572781c.js +0 -1
  449. package/_standalone/.next/static/chunks/app/api/im/test/route-e0c1e2c67572781c.js +0 -1
  450. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-e0c1e2c67572781c.js +0 -1
  451. package/_standalone/.next/static/chunks/app/api/inbox/route-e0c1e2c67572781c.js +0 -1
  452. package/_standalone/.next/static/chunks/app/api/init/route-e0c1e2c67572781c.js +0 -1
  453. package/_standalone/.next/static/chunks/app/api/lint/route-e0c1e2c67572781c.js +0 -1
  454. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e0c1e2c67572781c.js +0 -1
  455. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-e0c1e2c67572781c.js +0 -1
  456. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e0c1e2c67572781c.js +0 -1
  457. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e0c1e2c67572781c.js +0 -1
  458. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e0c1e2c67572781c.js +0 -1
  459. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e0c1e2c67572781c.js +0 -1
  460. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-e0c1e2c67572781c.js +0 -1
  461. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e0c1e2c67572781c.js +0 -1
  462. package/_standalone/.next/static/chunks/app/api/monitoring/route-e0c1e2c67572781c.js +0 -1
  463. package/_standalone/.next/static/chunks/app/api/recent-files/route-e0c1e2c67572781c.js +0 -1
  464. package/_standalone/.next/static/chunks/app/api/restart/route-e0c1e2c67572781c.js +0 -1
  465. package/_standalone/.next/static/chunks/app/api/search/route-e0c1e2c67572781c.js +0 -1
  466. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e0c1e2c67572781c.js +0 -1
  467. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e0c1e2c67572781c.js +0 -1
  468. package/_standalone/.next/static/chunks/app/api/settings/route-e0c1e2c67572781c.js +0 -1
  469. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e0c1e2c67572781c.js +0 -1
  470. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e0c1e2c67572781c.js +0 -1
  471. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e0c1e2c67572781c.js +0 -1
  472. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e0c1e2c67572781c.js +0 -1
  473. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e0c1e2c67572781c.js +0 -1
  474. package/_standalone/.next/static/chunks/app/api/setup/route-e0c1e2c67572781c.js +0 -1
  475. package/_standalone/.next/static/chunks/app/api/skills/route-e0c1e2c67572781c.js +0 -1
  476. package/_standalone/.next/static/chunks/app/api/space-overview/route-e0c1e2c67572781c.js +0 -1
  477. package/_standalone/.next/static/chunks/app/api/sync/route-e0c1e2c67572781c.js +0 -1
  478. package/_standalone/.next/static/chunks/app/api/tree-version/route-e0c1e2c67572781c.js +0 -1
  479. package/_standalone/.next/static/chunks/app/api/uninstall/route-e0c1e2c67572781c.js +0 -1
  480. package/_standalone/.next/static/chunks/app/api/update/route-e0c1e2c67572781c.js +0 -1
  481. package/_standalone/.next/static/chunks/app/api/update-check/route-e0c1e2c67572781c.js +0 -1
  482. package/_standalone/.next/static/chunks/app/api/update-status/route-e0c1e2c67572781c.js +0 -1
  483. package/_standalone/.next/static/chunks/app/api/workflows/route-e0c1e2c67572781c.js +0 -1
  484. package/_standalone/.next/static/chunks/app/changes/page-e0c1e2c67572781c.js +0 -1
  485. package/_standalone/.next/static/chunks/app/echo/[segment]/page-5333ab47257fab7f.js +0 -159
  486. package/_standalone/.next/static/chunks/app/echo/page-e0c1e2c67572781c.js +0 -1
  487. package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
  488. package/_standalone/.next/static/chunks/app/trash/page-bebb28bf472cf691.js +0 -1
  489. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e0c1e2c67572781c.js +0 -1
  490. package/_standalone/.next/static/chunks/app/view/[...path]/page-dd5698f3df138835.js +0 -12
  491. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e0c1e2c67572781c.js +0 -1
  492. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e0c1e2c67572781c.js +0 -1
  493. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e0c1e2c67572781c.js +0 -1
  494. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e0c1e2c67572781c.js +0 -1
  495. package/_standalone/.next/static/chunks/webpack-043f40ef7816d8c4.js +0 -1
  496. package/_standalone/.next/static/css/8b1f248d6540e52f.css +0 -1
  497. package/_standalone/lib/core/__tests__/synonym-dict.test.ts +0 -82
  498. package/app/lib/core/__tests__/synonym-dict.test.ts +0 -82
  499. package/app/lib/core/synonym-dict.ts +0 -139
  500. /package/_standalone/.next/static/{0JtsgqDZLSJ6MrIZIV6gC → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
@@ -2,8 +2,7 @@ export const dynamic = 'force-dynamic';
2
2
 
3
3
  import { NextResponse } from 'next/server';
4
4
  import { exec } from 'child_process';
5
- import { getAcpAgents } from '@/lib/acp/registry';
6
- import { getDescriptorBinary, getDescriptorInstallCmd, resolveAgentCommand } from '@/lib/acp/agent-descriptors';
5
+ import { getDetectableAgents, resolveAgentCommand } from '@/lib/acp/agent-descriptors';
7
6
  import { readSettings } from '@/lib/settings';
8
7
  import { handleRouteErrorSimple } from '@/lib/errors';
9
8
 
@@ -43,8 +42,6 @@ function whichBatch(binaries: string[]): Promise<Map<string, string | null>> {
43
42
  const unique = [...new Set(binaries)];
44
43
  if (unique.length === 0) return Promise.resolve(new Map());
45
44
 
46
- // Build a shell snippet: for each binary, print path or empty line
47
- // e.g. `which gemini 2>/dev/null || echo ""; which claude 2>/dev/null || echo ""`
48
45
  const script = unique
49
46
  .map(bin => `which ${bin} 2>/dev/null || echo ""`)
50
47
  .join('; ');
@@ -53,7 +50,6 @@ function whichBatch(binaries: string[]): Promise<Map<string, string | null>> {
53
50
  exec(script, { encoding: 'utf-8', timeout: 3000 }, (err, stdout) => {
54
51
  const map = new Map<string, string | null>();
55
52
  if (err) {
56
- // On total failure, mark all as not found
57
53
  for (const bin of unique) map.set(bin, null);
58
54
  resolve(map);
59
55
  return;
@@ -77,22 +73,22 @@ export async function GET(req: Request) {
77
73
  return NextResponse.json(detectCache.data);
78
74
  }
79
75
 
80
- const agents = await getAcpAgents();
76
+ // Pure local detection — no CDN fetch, instant response
77
+ const agents = getDetectableAgents();
81
78
  const settings = readSettings();
82
79
 
83
- const binaryNames = agents.map((a) => getDescriptorBinary(a.id)).filter(Boolean) as string[];
80
+ const binaryNames = [...new Set(agents.map(a => a.binary))];
84
81
  const whichMap = await whichBatch(binaryNames);
85
82
 
86
83
  const installed: InstalledAgent[] = [];
87
84
  const notInstalled: NotInstalledAgent[] = [];
88
85
 
89
86
  for (const agent of agents) {
90
- const binary = getDescriptorBinary(agent.id);
91
- const binaryPath = binary ? (whichMap.get(binary) ?? null) : null;
87
+ const binaryPath = whichMap.get(agent.binary) ?? null;
92
88
 
93
89
  if (binaryPath) {
94
90
  const userOverride = settings.acpAgents?.[agent.id];
95
- const resolved = resolveAgentCommand(agent.id, agent, userOverride);
91
+ const resolved = resolveAgentCommand(agent.id, undefined, userOverride);
96
92
  installed.push({
97
93
  id: agent.id,
98
94
  name: agent.name,
@@ -100,14 +96,12 @@ export async function GET(req: Request) {
100
96
  resolvedCommand: { cmd: resolved.cmd, args: resolved.args, source: resolved.source },
101
97
  });
102
98
  } else {
103
- const installCmd =
104
- getDescriptorInstallCmd(agent.id) ??
105
- (agent.packageName ? `npm install -g ${agent.packageName}` : '');
99
+ const packageName = agent.installCmd?.match(/npm install -g (.+)/)?.[1];
106
100
  notInstalled.push({
107
101
  id: agent.id,
108
102
  name: agent.name,
109
- installCmd,
110
- packageName: agent.packageName,
103
+ installCmd: agent.installCmd ?? (packageName ? `npm install -g ${packageName}` : ''),
104
+ packageName,
111
105
  });
112
106
  }
113
107
  }
@@ -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,18 +21,18 @@ export default function Breadcrumb({ filePath }: { filePath: string }) {
21
21
 
22
22
  if (friendly) {
23
23
  return (
24
- <nav className="flex items-center gap-0.5 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
- className="p-1.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors"
27
+ className="p-1.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors shrink-0"
28
28
  title="Home"
29
29
  >
30
30
  <Home size={14} />
31
31
  </Link>
32
32
  <ChevronRight size={12} className="text-muted-foreground/50 shrink-0" />
33
- <span className="flex items-center gap-1.5 px-2 py-1 text-foreground font-medium">
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>
35
+ <span className="block truncate max-w-[180px] sm:max-w-[260px] md:max-w-[360px]">{friendly.getLabel(t)}</span>
36
36
  </span>
37
37
  </nav>
38
38
  );
@@ -40,10 +40,10 @@ export default function Breadcrumb({ filePath }: { filePath: string }) {
40
40
 
41
41
  const parts = filePath.split('/');
42
42
  return (
43
- <nav className="flex items-center gap-0.5 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
- className="p-1.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors"
46
+ className="p-1.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors shrink-0"
47
47
  title="Home"
48
48
  >
49
49
  <Home size={14} />
@@ -52,15 +52,15 @@ 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
- <span key={i} className="flex items-center gap-0.5">
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
- <span className="flex items-center gap-1.5 px-2 py-1 text-foreground font-medium">
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>
60
+ <span className="block truncate max-w-[180px] sm:max-w-[260px] md:max-w-[360px]" suppressHydrationWarning>{part}</span>
61
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 max-w-[200px]" 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
  )}
@@ -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>