@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
@@ -4,7 +4,7 @@ import { useState, useEffect, useCallback } from 'react';
4
4
  import Link from 'next/link';
5
5
  import {
6
6
  ArrowLeft, CheckCircle2, XCircle, Loader2, Send,
7
- Eye, EyeOff, Settings2, Trash2, AlertTriangle, AlertCircle, RefreshCw,
7
+ Eye, EyeOff, Settings2, Trash2, AlertTriangle, AlertCircle, RefreshCw, ExternalLink,
8
8
  } from 'lucide-react';
9
9
  import { useLocale } from '@/lib/stores/locale-store';
10
10
  import { getPlatform, type PlatformDef, type PlatformStatus } from '@/lib/im/platforms';
@@ -40,13 +40,15 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
40
40
  setError(false);
41
41
  try {
42
42
  const res = await fetch('/api/im/status');
43
- if (res.ok) {
44
- const data = await res.json();
45
- const platforms: PlatformStatus[] = data.platforms ?? [];
46
- setStatus(platforms.find(s => s.platform === platformId) ?? null);
47
- } else {
43
+ if (!res.ok) {
48
44
  setError(true);
45
+ setLoading(false);
46
+ return;
49
47
  }
48
+
49
+ const data = await res.json();
50
+ const platforms: PlatformStatus[] = data.platforms ?? [];
51
+ setStatus(platforms.find(s => s.platform === platformId) ?? null);
50
52
  } catch {
51
53
  setError(true);
52
54
  }
@@ -67,6 +69,7 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
67
69
  }
68
70
 
69
71
  const isConnected = status?.connected ?? false;
72
+ const hasExistingCredentials = isConnected;
70
73
 
71
74
  const handleSave = async () => {
72
75
  setSaving(true);
@@ -166,19 +169,19 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
166
169
  </Link>
167
170
 
168
171
  {/* Platform header */}
169
- <div className="flex items-center gap-3 mb-6">
170
- <span className="text-2xl">{platform.icon}</span>
171
- <div>
172
- <h2 className="text-lg font-semibold text-foreground">{platform.name}</h2>
173
- <p className="text-sm text-muted-foreground">
174
- {isConnected ? (
175
- <span className="inline-flex items-center gap-1.5 text-success">
176
- <CheckCircle2 size={14} /> {im.statusConnected}
177
- </span>
178
- ) : (
179
- im.notConfigured
180
- )}
181
- </p>
172
+ <div className="flex items-start gap-3 mb-6">
173
+ <span className="text-3xl shrink-0">{platform.icon}</span>
174
+ <div className="flex-1">
175
+ <h2 className="text-xl font-semibold text-foreground">{platform.name}</h2>
176
+ {isConnected ? (
177
+ <span className="inline-flex items-center gap-1.5 mt-1 text-xs font-medium px-2 py-0.5 rounded-md bg-success/10 text-success">
178
+ <CheckCircle2 size={14} /> {im.statusConnected}
179
+ </span>
180
+ ) : (
181
+ <span className="inline-flex items-center gap-1.5 mt-1 text-xs font-medium px-2 py-0.5 rounded-md bg-muted text-muted-foreground">
182
+ {im.notConfigured}
183
+ </span>
184
+ )}
182
185
  </div>
183
186
  </div>
184
187
 
@@ -186,60 +189,133 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
186
189
  /* ─── Connected View ─── */
187
190
  <div className="flex flex-col gap-6">
188
191
  {/* Status info */}
189
- <div className="rounded-lg border border-border bg-card p-4">
192
+ <div className="rounded-lg border border-border bg-muted/30 p-4 shadow-sm">
190
193
  <h3 className="text-sm font-medium text-foreground mb-3">{im.tabStatus}</h3>
191
194
  {status?.botName && (
192
- <div className="flex items-center gap-2 mb-2">
193
- <span className="text-2xs text-muted-foreground uppercase tracking-wider">Bot</span>
195
+ <div className="flex items-center gap-2 mb-3">
196
+ <span className="text-xs font-medium text-muted-foreground">Bot</span>
194
197
  <span className="text-sm text-foreground font-mono">{status.botName}</span>
195
198
  </div>
196
199
  )}
197
200
  {status?.capabilities && status.capabilities.length > 0 && (
198
201
  <div className="flex flex-wrap gap-1.5">
199
202
  {status.capabilities.map(cap => (
200
- <span key={cap} className="text-2xs px-2 py-0.5 rounded-md bg-muted text-muted-foreground">{cap}</span>
203
+ <span key={cap} className="text-xs px-2 py-1 rounded-md bg-muted text-muted-foreground">{cap}</span>
201
204
  ))}
202
205
  </div>
203
206
  )}
204
207
  </div>
205
208
 
209
+ {/* Credential update */}
210
+ <div className="rounded-lg border border-border bg-card p-4 shadow-sm">
211
+ <h3 className="text-sm font-medium text-foreground mb-2">{im.editCredentials}</h3>
212
+ <p className="text-sm text-muted-foreground leading-6 mb-4 max-w-prose">{platform.editHint || im.editCredentialsHint}</p>
213
+ {hasExistingCredentials && (
214
+ <p className="text-xs text-muted-foreground/80 leading-5 mb-4 max-w-prose">{im.savedValuesHint}</p>
215
+ )}
216
+ <div className="flex flex-col gap-4">
217
+ {platform.fields.map(field => (
218
+ <div key={field.key} className="flex flex-col gap-1.5">
219
+ <label className="text-xs font-medium text-muted-foreground">
220
+ {field.label}
221
+ <span className="text-muted-foreground/50 font-normal"> ({im.required})</span>
222
+ </label>
223
+ <div className="relative">
224
+ <input
225
+ type={showSecrets ? 'text' : 'password'}
226
+ placeholder={field.placeholder}
227
+ value={formValues[field.key] ?? ''}
228
+ onChange={e => setFormValues(prev => ({ ...prev, [field.key]: e.target.value }))}
229
+ className="h-11 w-full px-3 pr-10 text-sm font-mono bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
230
+ autoComplete="off"
231
+ aria-required="true"
232
+ aria-describedby={field.hint ? `connected-hint-${field.key}` : undefined}
233
+ />
234
+ <button
235
+ type="button"
236
+ onClick={() => setShowSecrets(!showSecrets)}
237
+ className="absolute right-2.5 top-1/2 -translate-y-1/2 p-1.5 text-muted-foreground hover:text-foreground rounded transition-colors"
238
+ aria-label={showSecrets ? im.hideSecret : im.showSecret}
239
+ title={showSecrets ? im.hideSecret : im.showSecret}
240
+ >
241
+ {showSecrets ? <EyeOff size={16} /> : <Eye size={16} />}
242
+ </button>
243
+ </div>
244
+ {field.hint && (
245
+ <span id={`connected-hint-${field.key}`} className="text-xs text-muted-foreground">{field.hint}</span>
246
+ )}
247
+ </div>
248
+ ))}
249
+ <div className="flex items-center gap-3 pt-1">
250
+ <button
251
+ type="button"
252
+ onClick={handleSave}
253
+ disabled={saving || !isFormComplete}
254
+ className="h-11 px-4 text-sm rounded-md inline-flex items-center gap-1.5 bg-[var(--amber)] text-[var(--amber-foreground)] shadow-sm hover:opacity-90 hover:shadow disabled:opacity-50 disabled:cursor-not-allowed transition-all"
255
+ aria-label={saving ? im.saving : im.saveConfig}
256
+ >
257
+ {saving ? <Loader2 size={14} className="animate-spin" /> : <Settings2 size={14} />}
258
+ {saving ? im.saving : im.saveConfig}
259
+ </button>
260
+ </div>
261
+ {saveResult && (
262
+ <div
263
+ role="alert"
264
+ aria-live="polite"
265
+ className={`flex items-start gap-1.5 text-sm ${saveResult.ok ? 'text-success' : 'text-error'}`}
266
+ >
267
+ {saveResult.ok ? <CheckCircle2 size={16} className="shrink-0 mt-0.5" /> : <XCircle size={16} className="shrink-0 mt-0.5" />}
268
+ <span className="break-all">{saveResult.msg}</span>
269
+ </div>
270
+ )}
271
+ </div>
272
+ </div>
273
+
206
274
  {/* Test send */}
207
- <div className="rounded-lg border border-border bg-card p-4">
275
+ <div className="rounded-lg border border-border bg-card p-4 shadow-sm">
208
276
  <h3 className="text-sm font-medium text-foreground mb-3">{im.testSend}</h3>
209
277
  <div className="flex flex-col gap-3">
210
278
  <div>
211
- <label className="text-2xs text-muted-foreground uppercase tracking-wider mb-1 block">{im.recipientPlaceholder}</label>
279
+ <label className="text-xs font-medium text-muted-foreground block mb-1.5">{im.recipientPlaceholder}</label>
212
280
  <input
213
281
  type="text"
214
282
  placeholder={im.recipientPlaceholder}
215
283
  value={testRecipient}
216
284
  onChange={e => setTestRecipient(e.target.value)}
217
- className="h-8 w-full px-3 text-sm bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
285
+ className="h-11 w-full px-3 text-sm bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
286
+ aria-label={im.recipientPlaceholder}
218
287
  />
288
+ <p className="text-xs text-muted-foreground mt-1.5 leading-5">{im.recipientHint}</p>
219
289
  </div>
220
290
  <div>
221
- <label className="text-2xs text-muted-foreground uppercase tracking-wider mb-1 block">{im.messagePlaceholder}</label>
291
+ <label className="text-xs font-medium text-muted-foreground block mb-1.5">{im.messagePlaceholder}</label>
222
292
  <input
223
293
  type="text"
224
294
  placeholder={im.messagePlaceholder}
225
295
  value={testMsg}
226
296
  onChange={e => setTestMsg(e.target.value)}
227
- className="h-8 w-full px-3 text-sm bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
297
+ className="h-11 w-full px-3 text-sm bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
298
+ aria-label={im.messagePlaceholder}
228
299
  />
229
300
  </div>
230
- <div className="flex items-center gap-3">
301
+ <div className="flex items-center gap-3 pt-1">
231
302
  <button
232
303
  type="button"
233
304
  onClick={handleTest}
234
305
  disabled={testStatus === 'sending' || !testRecipient.trim()}
235
- className="h-8 px-4 text-sm rounded-md inline-flex items-center gap-1.5 bg-[var(--amber)] text-[var(--amber-foreground)] hover:opacity-90 disabled:opacity-50 disabled:cursor-not-allowed transition-opacity"
306
+ className="h-11 px-4 text-sm rounded-md inline-flex items-center gap-1.5 bg-[var(--amber)] text-[var(--amber-foreground)] shadow-sm hover:opacity-90 hover:shadow disabled:opacity-50 disabled:cursor-not-allowed transition-all"
307
+ aria-label={im.sendTest}
236
308
  >
237
309
  {testStatus === 'sending' ? <Loader2 size={14} className="animate-spin" /> : <Send size={14} />}
238
310
  {im.sendTest}
239
311
  </button>
240
312
  </div>
241
313
  {testResult && (
242
- <div className={`flex items-start gap-1.5 text-sm ${testStatus === 'success' ? 'text-success' : 'text-error'}`}>
314
+ <div
315
+ role="alert"
316
+ aria-live="polite"
317
+ className={`flex items-start gap-1.5 text-sm ${testStatus === 'success' ? 'text-success' : 'text-error'}`}
318
+ >
243
319
  {testStatus === 'success' ? <CheckCircle2 size={16} className="shrink-0 mt-0.5" /> : <XCircle size={16} className="shrink-0 mt-0.5" />}
244
320
  <span className="break-all">{testResult}</span>
245
321
  </div>
@@ -248,18 +324,19 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
248
324
  </div>
249
325
 
250
326
  {/* Disconnect */}
251
- <div className="rounded-lg border border-error/20 bg-card p-4">
327
+ <div className="rounded-lg border border-error/20 bg-card p-4 shadow-sm">
252
328
  <h3 className="text-sm font-medium text-foreground mb-2">{im.disconnect}</h3>
253
- <p className="text-2xs text-muted-foreground mb-3">{im.disconnectHint}</p>
329
+ <p className="text-xs text-muted-foreground mb-3">{im.disconnectHint}</p>
254
330
  <button
255
331
  type="button"
256
332
  onClick={handleDisconnect}
257
333
  disabled={deleting}
258
- className={`h-8 px-4 text-sm rounded-md inline-flex items-center gap-1.5 border transition-colors ${
334
+ className={`h-11 px-4 text-sm rounded-md inline-flex items-center gap-1.5 border transition-colors ${
259
335
  confirmDelete
260
336
  ? 'text-error border-error/40 bg-error/5 hover:bg-error/10'
261
337
  : 'text-muted-foreground border-border hover:text-error hover:border-error/30'
262
338
  }`}
339
+ aria-label={im.disconnect}
263
340
  >
264
341
  {deleting ? <Loader2 size={14} className="animate-spin" />
265
342
  : confirmDelete ? <><AlertTriangle size={14} /> {im.confirmDisconnect}</>
@@ -270,60 +347,97 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
270
347
  </div>
271
348
  ) : (
272
349
  /* ─── Not Configured View ─── */
273
- <div className="flex flex-col gap-4">
350
+ <div className="flex flex-col gap-6">
274
351
  {/* Guide */}
275
352
  {platform.guide && (
276
- <div className="rounded-lg border border-border bg-card p-4">
277
- <h3 className="text-sm font-medium text-foreground mb-2">{im.setupGuide}</h3>
278
- <div className="text-sm text-muted-foreground leading-relaxed whitespace-pre-line">
279
- {platform.guide}
353
+ <div className="rounded-lg border border-border border-l-4 border-l-[var(--amber)] bg-card p-4 shadow-sm">
354
+ <div className="flex items-start justify-between gap-3 mb-3">
355
+ <h3 className="text-sm font-medium text-foreground">{im.setupGuide}</h3>
356
+ {platform.guideUrl && (
357
+ <Link
358
+ href={platform.guideUrl}
359
+ target="_blank"
360
+ rel="noreferrer"
361
+ className="inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs bg-[var(--amber-dim)] text-[var(--amber)] hover:bg-[var(--amber-dim)]/80 shrink-0 transition-colors"
362
+ >
363
+ {im.guideLink}
364
+ <ExternalLink size={12} />
365
+ </Link>
366
+ )}
367
+ </div>
368
+ <div className="text-sm text-muted-foreground leading-7 space-y-1.5 max-w-prose">
369
+ {platform.guide.split('\n').map((line, idx) => (
370
+ <div key={idx}>{line}</div>
371
+ ))}
280
372
  </div>
281
373
  </div>
282
374
  )}
283
375
 
284
376
  {/* Credential form */}
285
- <div className="rounded-lg border border-border bg-card p-4">
286
- <h3 className="text-sm font-medium text-foreground mb-3">{im.tabConfigure}</h3>
287
- <div className="flex flex-col gap-3">
377
+ <div className="rounded-lg border border-border bg-card p-4 shadow-sm">
378
+ <h3 className="text-sm font-medium text-foreground mb-4">{im.tabConfigure}</h3>
379
+ <div className="flex flex-col gap-4">
288
380
  {platform.fields.map(field => (
289
- <div key={field.key} className="flex flex-col gap-1">
290
- <label className="text-2xs text-muted-foreground uppercase tracking-wider">{field.label}</label>
381
+ <div key={field.key} className="flex flex-col gap-1.5">
382
+ <label className="text-xs font-medium text-muted-foreground">
383
+ {field.label}
384
+ <span className="text-muted-foreground/50 font-normal"> ({im.required})</span>
385
+ </label>
291
386
  <div className="relative">
292
387
  <input
293
388
  type={showSecrets ? 'text' : 'password'}
294
389
  placeholder={field.placeholder}
295
390
  value={formValues[field.key] ?? ''}
296
391
  onChange={e => setFormValues(prev => ({ ...prev, [field.key]: e.target.value }))}
297
- className="h-8 w-full px-3 pr-8 text-sm font-mono bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
392
+ className="h-11 w-full px-3 pr-10 text-sm font-mono bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
298
393
  autoComplete="off"
394
+ aria-required="true"
395
+ aria-describedby={field.hint ? `hint-${field.key}` : undefined}
299
396
  />
300
397
  <button
301
398
  type="button"
302
399
  onClick={() => setShowSecrets(!showSecrets)}
303
- className="absolute right-2 top-1/2 -translate-y-1/2 p-0.5 text-muted-foreground hover:text-foreground rounded-sm"
400
+ className="absolute right-2.5 top-1/2 -translate-y-1/2 p-1.5 text-muted-foreground hover:text-foreground rounded transition-colors"
304
401
  aria-label={showSecrets ? im.hideSecret : im.showSecret}
402
+ title={showSecrets ? im.hideSecret : im.showSecret}
305
403
  >
306
- {showSecrets ? <EyeOff size={14} /> : <Eye size={14} />}
404
+ {showSecrets ? <EyeOff size={16} /> : <Eye size={16} />}
307
405
  </button>
308
406
  </div>
309
- {field.hint && <span className="text-2xs text-muted-foreground/60">{field.hint}</span>}
407
+ {field.hint && (
408
+ <span id={`hint-${field.key}`} className="text-xs text-muted-foreground">{field.hint}</span>
409
+ )}
310
410
  </div>
311
411
  ))}
312
- <div className="flex items-center gap-3 pt-1">
412
+ <div className="flex items-center gap-3 pt-2">
313
413
  <button
314
414
  type="button"
315
415
  onClick={handleSave}
316
416
  disabled={saving || !isFormComplete}
317
- className="h-8 px-4 text-sm rounded-md inline-flex items-center gap-1.5 bg-[var(--amber)] text-[var(--amber-foreground)] hover:opacity-90 disabled:opacity-50 disabled:cursor-not-allowed transition-opacity"
417
+ className="h-11 px-4 text-sm rounded-md inline-flex items-center gap-1.5 bg-[var(--amber)] text-[var(--amber-foreground)] shadow-sm hover:opacity-90 hover:shadow disabled:opacity-50 disabled:cursor-not-allowed transition-all"
418
+ aria-label={saving ? im.saving : im.saveConfig}
318
419
  >
319
420
  {saving ? <Loader2 size={14} className="animate-spin" /> : <Settings2 size={14} />}
320
- {im.saveConfig}
421
+ {saving ? im.saving : im.saveConfig}
321
422
  </button>
322
423
  </div>
323
424
  {saveResult && (
324
- <div className={`flex items-start gap-1.5 text-sm ${saveResult.ok ? 'text-success' : 'text-error'}`}>
325
- {saveResult.ok ? <CheckCircle2 size={16} className="shrink-0 mt-0.5" /> : <XCircle size={16} className="shrink-0 mt-0.5" />}
326
- <span className="break-all">{saveResult.msg}</span>
425
+ <div
426
+ role="alert"
427
+ aria-live="polite"
428
+ className={`flex items-start gap-1.5 text-sm ${saveResult.ok ? 'text-success' : 'text-error'}`}
429
+ >
430
+ {saveResult.ok ? (
431
+ <>
432
+ <CheckCircle2 size={16} className="shrink-0 mt-0.5" />
433
+ <span className="break-all">{saveResult.msg}</span>
434
+ </>
435
+ ) : (
436
+ <>
437
+ <XCircle size={16} className="shrink-0 mt-0.5" />
438
+ <span className="break-all">{saveResult.msg}</span>
439
+ </>
440
+ )}
327
441
  </div>
328
442
  )}
329
443
  </div>
@@ -80,22 +80,22 @@ function ChannelsOverview() {
80
80
  const getStatus = (id: string) => statuses.find(s => s.platform === id);
81
81
 
82
82
  return (
83
- <div className="max-w-3xl">
83
+ <div className="max-w-4xl">
84
84
  {/* Stats row */}
85
- <div className="grid grid-cols-3 gap-4 mb-8">
86
- <div className="rounded-lg border border-border bg-card p-4">
87
- <div className="text-2xs text-muted-foreground uppercase tracking-wider mb-1">{im.statsConnected}</div>
88
- <div className="text-2xl font-semibold text-foreground tabular-nums">
89
- {connected}<span className="text-sm text-muted-foreground font-normal">/{total}</span>
85
+ <div className="grid grid-cols-1 sm:grid-cols-3 gap-4 mb-8">
86
+ <div className="rounded-lg border border-border bg-card p-4 shadow-sm">
87
+ <div className="text-xs font-medium text-muted-foreground uppercase tracking-wide mb-2">{im.statsConnected}</div>
88
+ <div className="text-3xl font-semibold text-foreground tabular-nums">
89
+ {connected}<span className="text-sm text-muted-foreground font-normal ml-1">/ {total}</span>
90
90
  </div>
91
91
  </div>
92
- <div className="rounded-lg border border-border bg-card p-4">
93
- <div className="text-2xs text-muted-foreground uppercase tracking-wider mb-1">{im.statsSupported}</div>
94
- <div className="text-2xl font-semibold text-foreground tabular-nums">{total}</div>
92
+ <div className="rounded-lg border border-border bg-card p-4 shadow-sm">
93
+ <div className="text-xs font-medium text-muted-foreground uppercase tracking-wide mb-2">{im.statsSupported}</div>
94
+ <div className="text-3xl font-semibold text-foreground tabular-nums">{total}</div>
95
95
  </div>
96
- <div className="rounded-lg border border-border bg-card p-4">
97
- <div className="text-2xs text-muted-foreground uppercase tracking-wider mb-1">{im.statsStatus}</div>
98
- <div className="text-sm text-foreground mt-1">
96
+ <div className="rounded-lg border border-border bg-card p-4 shadow-sm">
97
+ <div className="text-xs font-medium text-muted-foreground uppercase tracking-wide mb-2">{im.statsStatus}</div>
98
+ <div className="text-sm text-foreground">
99
99
  {connected > 0 ? (
100
100
  <span className="inline-flex items-center gap-1.5 text-success">
101
101
  <CheckCircle2 size={14} /> {im.statsReady}
@@ -108,8 +108,8 @@ function ChannelsOverview() {
108
108
  </div>
109
109
 
110
110
  {/* Platform grid — clickable */}
111
- <h2 className="text-sm font-medium text-foreground mb-3">{im.platformsTitle}</h2>
112
- <div className="grid grid-cols-2 gap-3">
111
+ <h2 className="text-sm font-medium text-foreground mb-4">{im.platformsTitle}</h2>
112
+ <div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
113
113
  {PLATFORMS.map(({ id, name, icon }) => {
114
114
  const status = getStatus(id);
115
115
  const isConnected = status?.connected ?? false;
@@ -118,28 +118,28 @@ function ChannelsOverview() {
118
118
  <Link
119
119
  key={id}
120
120
  href={`/agents?tab=channels&platform=${id}`}
121
- className="flex items-center gap-3 rounded-lg border border-border bg-card px-4 py-3 hover:border-[var(--amber)]/40 hover:bg-card/80 transition-colors"
121
+ className="flex items-center gap-3 rounded-lg border border-border bg-card px-4 py-3 shadow-sm hover:border-[var(--amber)]/50 hover:bg-card/80 hover:shadow transition-all"
122
122
  >
123
- <span className="text-lg">{icon}</span>
123
+ <span className="text-xl shrink-0">{icon}</span>
124
124
  <div className="flex-1 min-w-0">
125
125
  <div className="text-sm font-medium text-foreground">{name}</div>
126
126
  {isConnected && status?.botName ? (
127
- <div className="text-2xs text-muted-foreground font-mono truncate">{status.botName}</div>
127
+ <div className="text-xs text-muted-foreground font-mono truncate">{status.botName}</div>
128
128
  ) : (
129
- <div className="text-2xs text-muted-foreground">{isConnected ? im.statusConnected : im.notConfigured}</div>
129
+ <div className="text-xs text-muted-foreground">{isConnected ? im.statusConnected : im.notConfigured}</div>
130
130
  )}
131
131
  {isConnected && status?.capabilities && status.capabilities.length > 0 && (
132
- <div className="flex flex-wrap gap-1 mt-1">
132
+ <div className="flex flex-wrap gap-1 mt-1.5">
133
133
  {status.capabilities.slice(0, 3).map(cap => (
134
- <span key={cap} className="text-2xs px-1 py-0.5 rounded bg-muted text-muted-foreground/70">{cap}</span>
134
+ <span key={cap} className="text-xs px-2 py-0.5 rounded-md bg-muted text-muted-foreground">{cap}</span>
135
135
  ))}
136
136
  </div>
137
137
  )}
138
138
  </div>
139
139
  {isConnected ? (
140
- <CheckCircle2 size={16} className="text-success shrink-0" />
140
+ <CheckCircle2 size={18} className="text-success shrink-0" />
141
141
  ) : (
142
- <Circle size={16} className="text-border shrink-0" />
142
+ <Circle size={18} className="text-border shrink-0" />
143
143
  )}
144
144
  </Link>
145
145
  );
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { useEffect, useLayoutEffect, useRef, useState, useCallback, useMemo } from 'react';
4
+ import { createPortal } from 'react-dom';
4
5
  import { Send, StopCircle, X, Plus, FileText, ImageIcon } from 'lucide-react';
5
6
  import { useLocale } from '@/lib/stores/locale-store';
6
7
  import type { AskMode, Message } from '@/lib/types';
@@ -15,6 +16,7 @@ import MessageList from '@/components/ask/MessageList';
15
16
  import MentionPopover from '@/components/ask/MentionPopover';
16
17
  import SlashCommandPopover from '@/components/ask/SlashCommandPopover';
17
18
  import SessionHistory from '@/components/ask/SessionHistory';
19
+ import SessionHistoryPanel from '@/components/ask/SessionHistoryPanel';
18
20
  import AskHeader from '@/components/ask/AskHeader';
19
21
  import FileChip from '@/components/ask/FileChip';
20
22
  import AgentSelectorCapsule from '@/components/ask/AgentSelectorCapsule';
@@ -97,6 +99,8 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
97
99
  const [showHistory, setShowHistory] = useState(false);
98
100
  const [isDragOver, setIsDragOver] = useState(false);
99
101
  const [showAttachMenu, setShowAttachMenu] = useState(false);
102
+ const attachButtonRef = useRef<HTMLButtonElement>(null);
103
+ const [attachMenuPos, setAttachMenuPos] = useState<{ top: number; left: number } | null>(null);
100
104
 
101
105
  const [selectedSkill, setSelectedSkill] = useState<SlashItem | null>(null);
102
106
  const selectedSkillRef = useRef(selectedSkill);
@@ -182,6 +186,31 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
182
186
  return () => window.removeEventListener('mindos:inject-ask-files', handler);
183
187
  }, []);
184
188
 
189
+ // Position the attach menu popover above the button (using Portal to avoid clipping)
190
+ useEffect(() => {
191
+ if (!showAttachMenu || !attachButtonRef.current) {
192
+ setAttachMenuPos(null);
193
+ return;
194
+ }
195
+ const rect = attachButtonRef.current.getBoundingClientRect();
196
+ setAttachMenuPos({
197
+ top: rect.top - 8, // 8px above button
198
+ left: rect.left,
199
+ });
200
+ }, [showAttachMenu]);
201
+
202
+ // Close attach menu when clicking outside
203
+ useEffect(() => {
204
+ if (!showAttachMenu) return;
205
+ const handleClickOutside = (e: MouseEvent) => {
206
+ if (attachButtonRef.current && !attachButtonRef.current.contains(e.target as Node)) {
207
+ setShowAttachMenu(false);
208
+ }
209
+ };
210
+ document.addEventListener('mousedown', handleClickOutside);
211
+ return () => document.removeEventListener('mousedown', handleClickOutside);
212
+ }, [showAttachMenu]);
213
+
185
214
  // Home suggestion chip click — inject text into input
186
215
  useEffect(() => {
187
216
  if (!isHome) return;
@@ -534,7 +563,7 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
534
563
  />
535
564
 
536
565
  {showHistory && (
537
- <SessionHistory
566
+ <SessionHistoryPanel
538
567
  sessions={session.sessions}
539
568
  activeSessionId={session.activeSessionId}
540
569
  onLoad={handleLoadSession}
@@ -542,16 +571,13 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
542
571
  onRename={session.renameSession}
543
572
  onTogglePin={session.togglePinSession}
544
573
  onClearAll={session.clearAllSessions}
545
- labels={{
546
- title: t.ask.sessionHistory ?? 'Session History',
547
- clearAll: t.ask.clearAll ?? 'Clear all',
548
- confirmClear: t.ask.confirmClear ?? 'Confirm clear?',
549
- noSessions: t.ask.noSessions ?? 'No saved sessions.',
550
- rename: t.ask.renameSession ?? 'Rename',
551
- }}
574
+ onClose={() => setShowHistory(false)}
575
+ onNewChat={handleResetSession}
552
576
  />
553
577
  )}
554
578
 
579
+ {!showHistory && (
580
+ <>
555
581
  {/* Messages — home variant hides empty state unless maximized (suggestions rendered externally in normal mode) */}
556
582
  <div className="flex-1 min-h-0 flex flex-col">
557
583
  {!isHome && (
@@ -664,6 +690,7 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
664
690
  {/* + attach button with mini menu */}
665
691
  <div className="relative shrink-0">
666
692
  <button
693
+ ref={attachButtonRef}
667
694
  type="button"
668
695
  onClick={() => setShowAttachMenu(v => !v)}
669
696
  className="p-2 rounded-lg text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors"
@@ -671,28 +698,39 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
671
698
  >
672
699
  <Plus size={inputIconSize} />
673
700
  </button>
674
- {showAttachMenu && (
675
- <div className="absolute bottom-full left-0 mb-1.5 py-1 rounded-xl border border-border/60 bg-card shadow-lg z-50 min-w-[150px] animate-in fade-in-0 slide-in-from-bottom-2 duration-150">
676
- <button
677
- type="button"
678
- className="flex w-full items-center gap-2.5 px-3 py-2 text-xs hover:bg-muted transition-colors text-left rounded-lg"
679
- onClick={() => { setShowAttachMenu(false); upload.uploadInputRef.current?.click(); }}
680
- >
681
- <FileText size={12} className="shrink-0 text-muted-foreground" />
682
- {t.ask.attachFileLabel}
683
- </button>
684
- <button
685
- type="button"
686
- className="flex w-full items-center gap-2.5 px-3 py-2 text-xs hover:bg-muted transition-colors text-left rounded-lg"
687
- onClick={() => { setShowAttachMenu(false); imageInputRef.current?.click(); }}
688
- >
689
- <ImageIcon size={12} className="shrink-0 text-muted-foreground" />
690
- {t.ask.attachImageLabel}
691
- </button>
692
- </div>
693
- )}
694
701
  </div>
695
702
 
703
+ {/* Attach menu rendered as Portal to avoid clipping by overflow-hidden parent */}
704
+ {mounted && showAttachMenu && attachMenuPos && createPortal(
705
+ <div
706
+ className="fixed py-1 rounded-xl border border-border/60 bg-card shadow-lg z-50 min-w-[150px] animate-in fade-in-0 slide-in-from-bottom-2 duration-150"
707
+ style={{
708
+ top: `${attachMenuPos.top}px`,
709
+ left: `${attachMenuPos.left}px`,
710
+ transform: 'translateY(-100%)', // Position above the button
711
+ }}
712
+ onClick={(e) => e.stopPropagation()}
713
+ >
714
+ <button
715
+ type="button"
716
+ className="flex w-full items-center gap-2.5 px-3 py-2 text-xs hover:bg-muted transition-colors text-left rounded-lg"
717
+ onClick={() => { setShowAttachMenu(false); upload.uploadInputRef.current?.click(); }}
718
+ >
719
+ <FileText size={12} className="shrink-0 text-muted-foreground" />
720
+ {t.ask.attachFileLabel}
721
+ </button>
722
+ <button
723
+ type="button"
724
+ className="flex w-full items-center gap-2.5 px-3 py-2 text-xs hover:bg-muted transition-colors text-left rounded-lg"
725
+ onClick={() => { setShowAttachMenu(false); imageInputRef.current?.click(); }}
726
+ >
727
+ <ImageIcon size={12} className="shrink-0 text-muted-foreground" />
728
+ {t.ask.attachImageLabel}
729
+ </button>
730
+ </div>,
731
+ document.body
732
+ )}
733
+
696
734
  <input
697
735
  ref={upload.uploadInputRef}
698
736
  type="file"
@@ -773,6 +811,8 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
773
811
  </div>
774
812
  </div>
775
813
  </div>
814
+ </>
815
+ )}
776
816
  </div>
777
817
  );
778
818
  }
@@ -205,9 +205,13 @@ export default memo(function AskHeader({
205
205
  {!hideTitle && (
206
206
  <div className="flex items-center gap-2 min-w-0">
207
207
  <div className="w-6 h-6 rounded-lg bg-[var(--amber)]/10 flex items-center justify-center shrink-0">
208
- <Sparkles size={13} className="text-[var(--amber)]" />
208
+ {showHistory ? <History size={13} className="text-[var(--amber)]" /> : <Sparkles size={13} className="text-[var(--amber)]" />}
209
209
  </div>
210
- {hasMultipleSessions && activeTitle ? (
210
+ {showHistory ? (
211
+ <span className="text-sm font-medium text-[var(--amber)]">
212
+ {t.ask?.sessionHistory ?? 'Session History'}
213
+ </span>
214
+ ) : hasMultipleSessions && activeTitle ? (
211
215
  <button
212
216
  ref={switcherRef}
213
217
  type="button"