@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
@@ -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
  )}
@@ -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}
@@ -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>
@@ -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
  );