@geminilight/mindos 0.6.61 → 0.6.65

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 (313) hide show
  1. package/_standalone/.antigravity/mcp_config.json +14 -0
  2. package/_standalone/.mindos-build-version +1 -1
  3. package/_standalone/.next/BUILD_ID +1 -1
  4. package/_standalone/.next/app-path-routes-manifest.json +23 -23
  5. package/_standalone/.next/build-manifest.json +2 -2
  6. package/_standalone/.next/cache/.previewinfo +1 -1
  7. package/_standalone/.next/cache/.rscinfo +1 -1
  8. package/_standalone/.next/cache/config.json +3 -3
  9. package/_standalone/.next/prerender-manifest.json +3 -3
  10. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  11. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error.html +2 -2
  13. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  14. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  26. package/_standalone/.next/server/app/agents/page.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  28. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  29. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/detect/route.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/registry/route.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  41. package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
  42. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/ask/route.js +53 -47
  46. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  47. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  51. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  53. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  55. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  57. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  60. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  61. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  63. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  65. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  67. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  69. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  71. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  74. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  76. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
  78. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  86. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  88. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  91. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  93. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  96. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  97. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  99. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/setup/route.js +1 -1
  105. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/skills/route.js +1 -1
  107. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  110. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  116. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/changes/page.js +1 -1
  118. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  119. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/echo/[segment]/page.js +2 -2
  121. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  122. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  123. package/_standalone/.next/server/app/echo/page.js +1 -1
  124. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  125. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  126. package/_standalone/.next/server/app/explore/page.js +1 -1
  127. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  128. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  129. package/_standalone/.next/server/app/help/page.js +1 -1
  130. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  131. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  132. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  133. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  134. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  135. package/_standalone/.next/server/app/login/page.js +1 -1
  136. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  137. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  138. package/_standalone/.next/server/app/page.js +1 -1
  139. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  140. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  141. package/_standalone/.next/server/app/setup/page.js +2 -2
  142. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  143. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  144. package/_standalone/.next/server/app/trash/page.js +3 -3
  145. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  146. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  147. package/_standalone/.next/server/app/view/[...path]/page.js +2 -2
  148. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  149. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  150. package/_standalone/.next/server/app/wiki/page.js +1 -1
  151. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  152. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  153. package/_standalone/.next/server/app-paths-manifest.json +23 -23
  154. package/_standalone/.next/server/chunks/122.js +222 -0
  155. package/_standalone/.next/server/chunks/1550.js +1 -1
  156. package/_standalone/.next/server/chunks/1750.js +1 -1
  157. package/_standalone/.next/server/chunks/3113.js +52 -0
  158. package/_standalone/.next/server/chunks/6539.js +1 -1
  159. package/_standalone/.next/server/chunks/8388.js +3 -3
  160. package/_standalone/.next/server/chunks/953.js +3 -3
  161. package/_standalone/.next/server/pages/500.html +2 -2
  162. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  163. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  164. package/_standalone/.next/static/chunks/1001-99da82ec8d8c136f.js +1 -0
  165. package/_standalone/.next/static/chunks/1088-77544af0a50cb7a4.js +1 -0
  166. package/_standalone/.next/static/chunks/1467-87dde7eed498806f.js +1 -0
  167. package/_standalone/.next/static/chunks/5149-4d828886dda479fa.js +1 -0
  168. package/_standalone/.next/static/chunks/5581-c671163a2fe1b312.js +29 -0
  169. package/_standalone/.next/static/chunks/{7266-bb7be1128eccd48e.js → 5718-3837c3210a0e175f.js} +2 -2
  170. package/_standalone/.next/static/chunks/6636-53238eff89503f03.js +6 -0
  171. package/_standalone/.next/static/chunks/6757-1c1a89720fdda8f0.js +1 -0
  172. package/_standalone/.next/static/chunks/7129-20e9d2463a9da646.js +1 -0
  173. package/_standalone/.next/static/chunks/7294-cac25d97869afadc.js +1 -0
  174. package/_standalone/.next/static/chunks/8225-21e5cebc3731ddf0.js +1 -0
  175. package/_standalone/.next/static/chunks/8520-b51810e66293ceb8.js +22 -0
  176. package/_standalone/.next/static/chunks/9207-dc9c31b351a2ed78.js +1 -0
  177. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-2f5cf97e03dc1cc9.js +1 -0
  178. package/_standalone/.next/static/chunks/app/agents/page-50eac58d511dcc6e.js +1 -0
  179. package/_standalone/.next/static/chunks/app/echo/[segment]/page-2a00f4686adf3885.js +11 -0
  180. package/_standalone/.next/static/chunks/app/layout-2cb7a6602d2e5d5f.js +168 -0
  181. package/_standalone/.next/static/chunks/app/{page-6a1f8d21c12b829e.js → page-5ab911b2226f6ff7.js} +1 -1
  182. package/_standalone/.next/static/chunks/app/setup/page-907b7c57fad2292b.js +1 -0
  183. package/_standalone/.next/static/chunks/app/trash/page-11a511b065ea84c2.js +1 -0
  184. package/_standalone/.next/static/chunks/app/view/[...path]/page-26e47dd4c533a58c.js +12 -0
  185. package/_standalone/.next/static/chunks/app/wiki/page-dce495b9048022fb.js +1 -0
  186. package/_standalone/.next/static/css/67e7918f5ed7d147.css +1 -0
  187. package/_standalone/.next/trace +65 -65
  188. package/_standalone/__tests__/acp/registry.test.ts +30 -20
  189. package/_standalone/__tests__/api/ask-attachments.test.ts +194 -0
  190. package/_standalone/__tests__/api/mcp-install.test.ts +49 -2
  191. package/_standalone/__tests__/api/settings.test.ts +16 -12
  192. package/_standalone/__tests__/api/setup.test.ts +11 -9
  193. package/_standalone/__tests__/api/test-key.test.ts +0 -10
  194. package/_standalone/__tests__/components/UpdateToast.test.ts +344 -0
  195. package/_standalone/__tests__/core/context.test.ts +48 -426
  196. package/_standalone/__tests__/lib/pi-skills.test.ts +4 -4
  197. package/_standalone/__tests__/lib/settings-ai-client.test.ts +32 -12
  198. package/_standalone/__tests__/setup.ts +5 -5
  199. package/_standalone/app/globals.css +4 -4
  200. package/_standalone/components/ActivityBar.tsx +17 -6
  201. package/_standalone/components/Panel.tsx +24 -6
  202. package/_standalone/components/SidebarLayout.tsx +36 -8
  203. package/_standalone/components/agents/AgentsMcpSection.tsx +2 -2
  204. package/_standalone/components/agents/AgentsOverviewSection.tsx +5 -1
  205. package/_standalone/components/agents/AgentsPanelA2aTab.tsx +173 -113
  206. package/_standalone/components/agents/AgentsSkillsSection.tsx +2 -2
  207. package/_standalone/components/ask/AskContent.tsx +83 -44
  208. package/_standalone/components/ask/AskHeader.tsx +8 -1
  209. package/_standalone/components/ask/MessageList.tsx +37 -3
  210. package/_standalone/components/ask/ProviderModelCapsule.tsx +444 -174
  211. package/_standalone/components/home/InboxSection.tsx +25 -25
  212. package/_standalone/components/settings/AiTab.tsx +353 -298
  213. package/_standalone/components/settings/CustomProviderFields.tsx +121 -0
  214. package/_standalone/components/settings/CustomProvidersCard.tsx +154 -0
  215. package/_standalone/components/settings/KnowledgeTab.tsx +6 -20
  216. package/_standalone/components/settings/McpAgentInstall.tsx +7 -2
  217. package/_standalone/components/settings/Primitives.tsx +48 -104
  218. package/_standalone/components/settings/ProviderModal.tsx +87 -0
  219. package/_standalone/components/settings/SettingsContent.tsx +2 -5
  220. package/_standalone/components/settings/TestButton.tsx +64 -0
  221. package/_standalone/components/settings/types.ts +3 -9
  222. package/_standalone/components/settings/useCustomProviderForm.ts +132 -0
  223. package/_standalone/components/setup/StepAI.tsx +12 -5
  224. package/_standalone/components/shared/ModelInput.tsx +220 -0
  225. package/_standalone/components/shared/ProviderSelect.tsx +126 -36
  226. package/_standalone/hooks/useAskChat.ts +100 -13
  227. package/_standalone/hooks/useAskPanel.ts +17 -1
  228. package/_standalone/lib/settings-ai-client.ts +17 -8
  229. package/_standalone/tsconfig.tsbuildinfo +1 -1
  230. package/app/.antigravity/mcp_config.json +14 -0
  231. package/app/app/api/ask/route.ts +154 -45
  232. package/app/app/api/mcp/agents/route.ts +3 -3
  233. package/app/app/api/settings/list-models/route.ts +36 -9
  234. package/app/app/api/settings/route.ts +14 -42
  235. package/app/app/api/settings/test-key/route.ts +78 -2
  236. package/app/app/api/setup/route.ts +36 -18
  237. package/app/app/api/skills/route.ts +1 -1
  238. package/app/app/globals.css +4 -4
  239. package/app/app/layout.tsx +5 -3
  240. package/app/app/view/[...path]/page.tsx +5 -0
  241. package/app/components/ActivityBar.tsx +17 -6
  242. package/app/components/HomeContent.tsx +11 -0
  243. package/app/components/InboxView.tsx +656 -0
  244. package/app/components/Panel.tsx +24 -6
  245. package/app/components/SidebarLayout.tsx +36 -8
  246. package/app/components/UpdateToast.tsx +255 -0
  247. package/app/components/agents/AgentDetailContent.tsx +8 -8
  248. package/app/components/agents/AgentsMcpSection.tsx +2 -2
  249. package/app/components/agents/AgentsOverviewSection.tsx +5 -1
  250. package/app/components/agents/AgentsPanelA2aTab.tsx +173 -113
  251. package/app/components/agents/AgentsSkillsSection.tsx +2 -2
  252. package/app/components/ask/AskContent.tsx +83 -44
  253. package/app/components/ask/AskHeader.tsx +8 -1
  254. package/app/components/ask/MessageList.tsx +37 -3
  255. package/app/components/ask/ProviderModelCapsule.tsx +444 -174
  256. package/app/components/home/InboxSection.tsx +25 -25
  257. package/app/components/settings/AiTab.tsx +353 -298
  258. package/app/components/settings/CustomProviderFields.tsx +121 -0
  259. package/app/components/settings/CustomProvidersCard.tsx +154 -0
  260. package/app/components/settings/KnowledgeTab.tsx +6 -20
  261. package/app/components/settings/McpAgentInstall.tsx +7 -2
  262. package/app/components/settings/Primitives.tsx +48 -104
  263. package/app/components/settings/ProviderModal.tsx +87 -0
  264. package/app/components/settings/SettingsContent.tsx +2 -5
  265. package/app/components/settings/TestButton.tsx +64 -0
  266. package/app/components/settings/types.ts +3 -9
  267. package/app/components/settings/useCustomProviderForm.ts +132 -0
  268. package/app/components/setup/StepAI.tsx +12 -5
  269. package/app/components/shared/ModelInput.tsx +220 -0
  270. package/app/components/shared/ProviderSelect.tsx +126 -36
  271. package/app/hooks/useAskChat.ts +100 -13
  272. package/app/hooks/useAskPanel.ts +17 -1
  273. package/app/lib/acp/registry.ts +92 -10
  274. package/app/lib/agent/context.ts +65 -0
  275. package/app/lib/agent/providers.ts +25 -0
  276. package/app/lib/agent/tools.ts +1 -1
  277. package/app/lib/custom-endpoints.ts +160 -0
  278. package/app/lib/fs.ts +8 -1
  279. package/app/lib/i18n/modules/ai-chat.ts +6 -0
  280. package/app/lib/i18n/modules/knowledge.ts +16 -0
  281. package/app/lib/i18n/modules/onboarding.ts +4 -0
  282. package/app/lib/i18n/modules/settings.ts +88 -2
  283. package/app/lib/mcp-agents.ts +11 -0
  284. package/app/lib/pi-integration/skills.ts +16 -4
  285. package/app/lib/settings-ai-client.ts +17 -8
  286. package/app/lib/settings.ts +68 -72
  287. package/app/lib/types.ts +4 -0
  288. package/bin/lib/mcp-agents.js +11 -0
  289. package/bin/lib/mcp-install.js +71 -7
  290. package/package.json +1 -1
  291. package/_standalone/.next/server/chunks/530.js +0 -218
  292. package/_standalone/.next/server/chunks/8955.js +0 -52
  293. package/_standalone/.next/static/chunks/1369-7d0ac5d1564eed1e.js +0 -1
  294. package/_standalone/.next/static/chunks/3427-2e61a5df1f5e55fb.js +0 -1
  295. package/_standalone/.next/static/chunks/5581-0c700c20718bd916.js +0 -29
  296. package/_standalone/.next/static/chunks/6297-085daa21037d5f81.js +0 -1
  297. package/_standalone/.next/static/chunks/6636-9bbc90fb3b8731fe.js +0 -6
  298. package/_standalone/.next/static/chunks/7637-904b0a381dc3ec02.js +0 -1
  299. package/_standalone/.next/static/chunks/8520-76d1b05072178b43.js +0 -22
  300. package/_standalone/.next/static/chunks/8658-16ff58b75ae37fbb.js +0 -1
  301. package/_standalone/.next/static/chunks/9905-a19d379cb225246e.js +0 -1
  302. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-0ea3571c8fbae823.js +0 -1
  303. package/_standalone/.next/static/chunks/app/agents/page-66858acbcd1d4bf8.js +0 -1
  304. package/_standalone/.next/static/chunks/app/echo/[segment]/page-bf5c290fa3ccff09.js +0 -11
  305. package/_standalone/.next/static/chunks/app/layout-a5d5925b47e87cc3.js +0 -164
  306. package/_standalone/.next/static/chunks/app/setup/page-821714e7477be46c.js +0 -1
  307. package/_standalone/.next/static/chunks/app/trash/page-40bc7316806acd62.js +0 -1
  308. package/_standalone/.next/static/chunks/app/view/[...path]/page-6fbb14b8f322d0f0.js +0 -12
  309. package/_standalone/.next/static/chunks/app/wiki/page-ba36eccf4fe62cfe.js +0 -1
  310. package/_standalone/.next/static/css/b57c4eb3cc88308b.css +0 -1
  311. package/_standalone/lib/agent/context.ts +0 -403
  312. /package/_standalone/.next/static/{5GmVArEG8OX03azKICsGq → eIlwbGas1iRGonlPyEwj7}/_buildManifest.js +0 -0
  313. /package/_standalone/.next/static/{5GmVArEG8OX03azKICsGq → eIlwbGas1iRGonlPyEwj7}/_ssgManifest.js +0 -0
@@ -12,6 +12,8 @@ import { useAcpDetection } from '@/hooks/useAcpDetection';
12
12
  import { openAskModal } from '@/hooks/useAskModal';
13
13
  import DiscoverAgentModal from './DiscoverAgentModal';
14
14
 
15
+ /* ────────── Props ────────── */
16
+
15
17
  interface AgentsPanelA2aTabProps {
16
18
  agents: RemoteAgent[];
17
19
  discovering: boolean;
@@ -20,6 +22,8 @@ interface AgentsPanelA2aTabProps {
20
22
  onRemove: (id: string) => void;
21
23
  }
22
24
 
25
+ /* ────────── Main Component ────────── */
26
+
23
27
  export default function AgentsPanelA2aTab({
24
28
  agents,
25
29
  discovering,
@@ -36,21 +40,26 @@ export default function AgentsPanelA2aTab({
36
40
  const isEmpty = agents.length === 0 && !acp.loading && acp.agents.length === 0;
37
41
 
38
42
  return (
39
- <div className="space-y-5">
40
- {/* Header + Discover button */}
43
+ <div className="space-y-6">
44
+ {/* Header + Discover button — [V-1] clear section title hierarchy */}
41
45
  <div className="flex items-center justify-between">
42
- <h2 className="text-sm font-medium text-foreground">{p.a2aTabTitle}</h2>
46
+ <h2 className="text-sm font-medium text-foreground flex items-center gap-2">
47
+ <div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]">
48
+ <Globe size={13} />
49
+ </div>
50
+ {p.a2aTabTitle}
51
+ </h2>
43
52
  <button
44
53
  type="button"
45
54
  onClick={() => setShowModal(true)}
46
- className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg bg-foreground text-background hover:bg-foreground/90 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
55
+ className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg bg-foreground text-background hover:bg-foreground/90 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
47
56
  >
48
57
  <Globe size={12} />
49
58
  {p.a2aDiscover}
50
59
  </button>
51
60
  </div>
52
61
 
53
- {/* Unified empty state when both A2A and ACP are empty */}
62
+ {/* Unified empty state [P-1] better first-time UX */}
54
63
  {isEmpty ? (
55
64
  <NetworkEmptyState
56
65
  onDiscover={() => setShowModal(true)}
@@ -58,23 +67,25 @@ export default function AgentsPanelA2aTab({
58
67
  />
59
68
  ) : (
60
69
  <>
61
- {/* Remote A2A agent list */}
70
+ {/* Remote A2A agent list — [A-3] semantic list */}
62
71
  {agents.length === 0 ? (
63
- <div className="rounded-xl border border-border/40 bg-card/30 p-8 text-center">
64
- <div className="w-12 h-12 rounded-2xl bg-muted/40 flex items-center justify-center mx-auto mb-3">
72
+ <div className="rounded-lg border border-border/40 bg-card/30 p-8 text-center">
73
+ <div className="w-12 h-12 rounded-xl bg-muted/40 flex items-center justify-center mx-auto mb-3">
65
74
  <Globe size={20} className="text-muted-foreground/50" aria-hidden="true" />
66
75
  </div>
67
76
  <p className="text-sm font-medium text-muted-foreground mb-1">{p.a2aTabEmpty}</p>
68
- <p className="text-xs text-muted-foreground/70 leading-relaxed max-w-xs mx-auto">
77
+ <p className="text-xs text-muted-foreground/60 leading-relaxed max-w-xs mx-auto">
69
78
  {p.a2aTabEmptyHint}
70
79
  </p>
71
80
  </div>
72
81
  ) : (
73
- <div className="space-y-2">
82
+ <ul role="list" className="space-y-2">
74
83
  {agents.map((agent) => (
75
- <RemoteAgentRow key={agent.id} agent={agent} onRemove={onRemove} removeCopy={p.a2aRemoveAgent} skillsCopy={p.a2aSkills} />
84
+ <li key={agent.id}>
85
+ <RemoteAgentRow agent={agent} onRemove={onRemove} removeCopy={p.a2aRemoveAgent} skillsCopy={p.a2aSkills} />
86
+ </li>
76
87
  ))}
77
- </div>
88
+ </ul>
78
89
  )}
79
90
 
80
91
  {/* ACP Registry section */}
@@ -96,7 +107,7 @@ export default function AgentsPanelA2aTab({
96
107
  );
97
108
  }
98
109
 
99
- /* ────────── Network Empty State ────────── */
110
+ /* ────────── Network Empty State — [P-1] enhanced first-time UX ────────── */
100
111
 
101
112
  function NetworkEmptyState({
102
113
  onDiscover,
@@ -109,19 +120,20 @@ function NetworkEmptyState({
109
120
  const p = t.panels.agents;
110
121
 
111
122
  return (
112
- <div className="rounded-xl border border-border/40 bg-card/30 p-12 text-center">
113
- <div className="w-14 h-14 rounded-2xl bg-muted/40 flex items-center justify-center mx-auto mb-4">
123
+ <div className="rounded-lg border border-border/40 bg-card/30 p-10 text-center">
124
+ <div className="w-14 h-14 rounded-xl bg-muted/40 flex items-center justify-center mx-auto mb-4">
114
125
  <Network size={22} className="text-muted-foreground/50" aria-hidden="true" />
115
126
  </div>
116
- <p className="text-sm font-medium text-foreground mb-1">{p.networkEmptyTitle}</p>
117
- <p className="text-xs text-muted-foreground/70 leading-relaxed max-w-sm mx-auto mb-5">
127
+ <p className="text-base font-semibold text-foreground mb-1">{p.networkEmptyTitle}</p>
128
+ <p className="text-xs text-muted-foreground/60 leading-relaxed max-w-sm mx-auto mb-6">
118
129
  {p.networkEmptyDesc}
119
130
  </p>
120
- <div className="flex items-center justify-center gap-2.5">
131
+ {/* [S-1] gap-3 (12px) instead of gap-2.5 (10px) */}
132
+ <div className="flex items-center justify-center gap-3">
121
133
  <button
122
134
  type="button"
123
135
  onClick={onDiscover}
124
- className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg bg-foreground text-background hover:bg-foreground/90 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
136
+ className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg bg-foreground text-background hover:bg-foreground/90 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
125
137
  >
126
138
  <Globe size={12} />
127
139
  {p.networkDiscoverBtn}
@@ -129,7 +141,7 @@ function NetworkEmptyState({
129
141
  <button
130
142
  type="button"
131
143
  onClick={onBrowseRegistry}
132
- className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg border border-border text-foreground hover:bg-muted transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
144
+ className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg border border-border text-foreground hover:bg-muted transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
133
145
  >
134
146
  <Network size={12} />
135
147
  {p.networkBrowseBtn}
@@ -153,6 +165,23 @@ const QUICK_ACTIONS: QuickAction[] = [
153
165
  { labelKey: 'acpQuickExplain', icon: MessageSquare, promptSuffix: 'explain the structure of this project' },
154
166
  ];
155
167
 
168
+ /* ────────── Skeleton Card — [R-4][U-1] loading placeholder ────────── */
169
+
170
+ function SkeletonCard() {
171
+ return (
172
+ <div className="rounded-lg border border-border/30 bg-card/50 p-3 motion-safe:animate-pulse" aria-hidden="true">
173
+ <div className="flex items-center gap-2">
174
+ <div className="w-8 h-8 rounded-lg bg-muted/60 shrink-0" />
175
+ <div className="flex-1 space-y-1.5">
176
+ <div className="h-3.5 bg-muted/60 rounded w-28" />
177
+ <div className="h-2.5 bg-muted/40 rounded w-48" />
178
+ </div>
179
+ <div className="h-5 bg-muted/40 rounded w-10" />
180
+ </div>
181
+ </div>
182
+ );
183
+ }
184
+
156
185
  /* ────────── ACP Registry Section ────────── */
157
186
 
158
187
  function AcpRegistrySection() {
@@ -163,27 +192,33 @@ function AcpRegistrySection() {
163
192
  const acpConfig = useAcpConfig();
164
193
  const [showAvailable, setShowAvailable] = useState(false);
165
194
 
195
+ /* [U-1][R-4] Skeleton loading state */
166
196
  if (acp.loading) {
167
197
  return (
168
- <div className="space-y-2">
169
- <h3 className="text-xs font-medium text-muted-foreground uppercase tracking-wide">
198
+ <div className="space-y-2" role="status" aria-label={p.acpLoading}>
199
+ <h3 className="text-xs font-medium text-muted-foreground uppercase tracking-wide flex items-center gap-2">
200
+ <div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]"><Network size={13} /></div>
170
201
  {p.acpSectionTitle}
171
202
  </h3>
172
- <div className="flex items-center justify-center py-6 gap-2">
173
- <Loader2 size={14} className="animate-spin text-muted-foreground" />
174
- <span className="text-xs text-muted-foreground">{p.acpLoading}</span>
203
+ <div className="space-y-2">
204
+ <SkeletonCard />
205
+ <SkeletonCard />
206
+ <SkeletonCard />
175
207
  </div>
208
+ <p className="sr-only">{p.acpLoading}</p>
176
209
  </div>
177
210
  );
178
211
  }
179
212
 
213
+ /* [U-3] Improved error state with context */
180
214
  if (acp.error) {
181
215
  return (
182
216
  <div className="space-y-2">
183
- <h3 className="text-xs font-medium text-muted-foreground uppercase tracking-wide">
217
+ <h3 className="text-xs font-medium text-muted-foreground uppercase tracking-wide flex items-center gap-2">
218
+ <div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]"><Network size={13} /></div>
184
219
  {p.acpSectionTitle}
185
220
  </h3>
186
- <div className="rounded-lg border border-border/60 bg-card/80 p-4 text-center">
221
+ <div className="rounded-lg border border-border/60 bg-card/80 p-4 text-center" role="alert">
187
222
  <p className="text-xs text-muted-foreground mb-2">{p.acpLoadFailed}</p>
188
223
  <button
189
224
  type="button"
@@ -217,10 +252,11 @@ function AcpRegistrySection() {
217
252
  }
218
253
 
219
254
  return (
220
- <div className="space-y-3">
221
- {/* ── Installed Agents ── */}
255
+ <section className="space-y-3" aria-labelledby="acp-section-title">
256
+ {/* ── Section header ── [V-1] clear hierarchy */}
222
257
  <div className="flex items-center justify-between">
223
- <h3 className="text-xs font-medium text-muted-foreground uppercase tracking-wide">
258
+ <h3 id="acp-section-title" className="text-xs font-medium text-muted-foreground uppercase tracking-wide flex items-center gap-2">
259
+ <div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]"><Network size={13} /></div>
224
260
  {p.acpSectionTitle}
225
261
  </h3>
226
262
  <div className="flex items-center gap-2">
@@ -228,46 +264,55 @@ function AcpRegistrySection() {
228
264
  type="button"
229
265
  onClick={() => detection.refresh()}
230
266
  disabled={detection.loading}
231
- className="inline-flex items-center gap-1 px-2 py-1 text-2xs font-medium rounded-md border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50"
267
+ aria-label={p.acpScan}
268
+ className="inline-flex items-center gap-1 px-2 py-1 text-2xs font-medium rounded-md border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50"
232
269
  >
233
- <RefreshCw size={10} className={detection.loading ? 'animate-spin' : ''} />
270
+ <RefreshCw size={10} className={detection.loading ? 'motion-safe:animate-spin' : ''} />
234
271
  {p.acpScan}
235
272
  </button>
236
273
  {installedAgents.length > 0 && (
237
- <span className="text-2xs text-muted-foreground/60">
274
+ <span className="text-2xs text-muted-foreground/50">
238
275
  {p.acpSectionDesc(installedAgents.length)}
239
276
  </span>
240
277
  )}
241
278
  </div>
242
279
  </div>
243
280
 
244
- {installedAgents.length > 0 ? (
281
+ {/* ── Installed agents — [A-3] semantic list, [C-2] shadow for depth ── */}
282
+ {detection.loading ? (
245
283
  <div className="space-y-2">
284
+ <SkeletonCard />
285
+ <SkeletonCard />
286
+ </div>
287
+ ) : installedAgents.length > 0 ? (
288
+ <ul role="list" className="space-y-2">
246
289
  {installedAgents.map(({ agent, info }) => (
247
- <AcpAgentCard
248
- key={agent.id}
249
- agent={agent}
250
- installed={info}
251
- detectionDone={!detection.loading}
252
- acpConfig={acpConfig}
253
- />
290
+ <li key={agent.id}>
291
+ <AcpAgentCard
292
+ agent={agent}
293
+ installed={info}
294
+ detectionDone={!detection.loading}
295
+ acpConfig={acpConfig}
296
+ />
297
+ </li>
254
298
  ))}
255
- </div>
256
- ) : !detection.loading ? (
257
- <div className="rounded-lg border border-border/40 bg-card/30 p-5 text-center">
258
- <p className="text-xs text-muted-foreground/70 leading-relaxed max-w-xs mx-auto">
299
+ </ul>
300
+ ) : (
301
+ <div className="rounded-lg border border-border/40 bg-card/30 p-4 text-center">
302
+ <p className="text-xs text-muted-foreground/60 leading-relaxed max-w-xs mx-auto">
259
303
  {p.acpNoInstalled}
260
304
  </p>
261
305
  </div>
262
- ) : null}
306
+ )}
263
307
 
264
- {/* ── Available (Not Installed) — collapsed by default, shown only after detection completes ── */}
308
+ {/* ── Available (Not Installed) — [A-2] aria-expanded ── */}
265
309
  {!detection.loading && notInstalledAgents.length > 0 && (
266
310
  <div className="space-y-2">
267
311
  <button
268
312
  type="button"
269
313
  onClick={() => setShowAvailable(v => !v)}
270
- className="flex items-center gap-1.5 text-xs text-muted-foreground/70 hover:text-muted-foreground transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"
314
+ aria-expanded={showAvailable}
315
+ className="flex items-center gap-1.5 text-xs text-muted-foreground/60 hover:text-muted-foreground transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"
271
316
  >
272
317
  {showAvailable ? <ChevronUp size={12} /> : <ChevronDown size={12} />}
273
318
  <span className="font-medium">{p.acpAvailableTitle}</span>
@@ -275,31 +320,33 @@ function AcpRegistrySection() {
275
320
  </button>
276
321
 
277
322
  {showAvailable && (
278
- <div className="space-y-1 animate-in fade-in slide-in-from-top-1 duration-150">
323
+ <ul role="list" className="space-y-1 motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-top-1 duration-150">
279
324
  {notInstalledAgents.map(({ agent, installCmd, packageName }) => (
280
- <AcpAgentCompactRow
281
- key={agent.id}
282
- agent={agent}
283
- installCmd={installCmd}
284
- packageName={packageName}
285
- detectionDone={!detection.loading}
286
- onInstalled={detection.refresh}
287
- />
325
+ <li key={agent.id}>
326
+ <AcpAgentCompactRow
327
+ agent={agent}
328
+ installCmd={installCmd}
329
+ packageName={packageName}
330
+ detectionDone={!detection.loading}
331
+ onInstalled={detection.refresh}
332
+ />
333
+ </li>
288
334
  ))}
289
- </div>
335
+ </ul>
290
336
  )}
291
337
  </div>
292
338
  )}
293
- </div>
339
+ </section>
294
340
  );
295
341
  }
296
342
 
297
343
  /* ────────── ACP Agent Card (Installed — prominent) ────────── */
298
344
 
345
+ /* [C-3] Unified badge styles — low saturation for metadata, high for status */
299
346
  const TRANSPORT_STYLES: Record<string, string> = {
300
- npx: 'bg-[var(--amber)]/15 text-[var(--amber)]',
347
+ npx: 'bg-muted text-muted-foreground',
301
348
  binary: 'bg-muted text-muted-foreground',
302
- uvx: 'bg-[var(--success)]/15 text-[var(--success)]',
349
+ uvx: 'bg-muted text-muted-foreground',
303
350
  stdio: 'bg-muted text-muted-foreground',
304
351
  };
305
352
 
@@ -330,7 +377,6 @@ function AcpAgentCard({ agent, installed, detectionDone, acpConfig }: {
330
377
 
331
378
  const handleToggleConfig = useCallback(() => {
332
379
  if (!configOpen && resolved) {
333
- // Pre-fill with current resolved values
334
380
  setEditCmd(resolved.cmd);
335
381
  setEditArgs(resolved.args.join(' '));
336
382
  }
@@ -346,7 +392,7 @@ function AcpAgentCard({ agent, installed, detectionDone, acpConfig }: {
346
392
  });
347
393
  if (ok) {
348
394
  setSaveState('saved');
349
- setTimeout(() => setSaveState('idle'), 2000);
395
+ setTimeout(() => setSaveState('idle'), 3000);
350
396
  }
351
397
  }, [acpConfig, agent.id, editCmd, editArgs]);
352
398
 
@@ -365,53 +411,59 @@ function AcpAgentCard({ agent, installed, detectionDone, acpConfig }: {
365
411
  };
366
412
 
367
413
  return (
368
- <div className="rounded-xl border border-[var(--amber)]/20 bg-card p-3 hover:border-[var(--amber)]/40 transition-all duration-150">
369
- {/* Header row */}
370
- <div className="flex items-center gap-2.5">
414
+ /* [C-2] shadow-sm for installed cards; [S-1] p-4 (16px) */
415
+ <div className="rounded-lg border border-[var(--amber)]/20 bg-card shadow-sm hover:border-[var(--amber)]/40 transition-colors duration-150 p-4">
416
+ {/* Header row — [V-1] stronger agent name, [V-2] weaker metadata */}
417
+ <div className="flex items-center gap-2">
371
418
  <div className="w-8 h-8 rounded-lg bg-[var(--amber)]/10 flex items-center justify-center shrink-0">
372
419
  <Network size={14} className="text-[var(--amber)]" />
373
420
  </div>
374
421
  <div className="flex-1 min-w-0">
375
422
  <div className="flex items-center gap-1.5">
376
- <p className="text-sm font-medium text-foreground truncate">{agent.name}</p>
423
+ {/* [V-1] agent name is 16px semibold — most prominent element */}
424
+ <p className="text-base font-semibold text-foreground truncate leading-tight">{agent.name}</p>
377
425
  {agent.version && (
378
- <span className="text-2xs text-muted-foreground/60 shrink-0">v{agent.version}</span>
426
+ <span className="text-2xs text-muted-foreground/40 shrink-0">v{agent.version}</span>
379
427
  )}
380
428
  </div>
429
+ {/* [V-2] description is muted and smaller — weaker than name */}
381
430
  {agent.description && (
382
- <p className="text-2xs text-muted-foreground truncate">{agent.description}</p>
431
+ <p className="text-2xs text-muted-foreground/50 truncate mt-0.5">{agent.description}</p>
383
432
  )}
384
433
  </div>
385
- <span className={`text-2xs px-1.5 py-0.5 rounded font-medium shrink-0 ${TRANSPORT_STYLES[agent.transport] ?? TRANSPORT_STYLES.stdio}`}>
434
+ {/* [V-2][C-3] transport badge low saturation, metadata-level */}
435
+ <span className={`text-2xs px-1.5 py-0.5 rounded shrink-0 ${TRANSPORT_STYLES[agent.transport] ?? TRANSPORT_STYLES.stdio}`}>
386
436
  {transportLabels[agent.transport] ?? agent.transport}
387
437
  </span>
438
+ {/* [V-2] "Ready" badge — only high-saturation badge */}
388
439
  {detectionDone && (
389
440
  <span className="text-2xs px-1.5 py-0.5 rounded font-medium shrink-0 bg-[var(--success)]/15 text-[var(--success)]">
390
441
  {p.acpReady}
391
442
  </span>
392
443
  )}
444
+ {/* [A-1] aria-label for icon-only button; [P-2] aria-expanded */}
393
445
  <button
394
446
  type="button"
395
447
  onClick={handleToggleConfig}
396
- className="p-1 rounded-md text-muted-foreground hover:text-foreground hover:bg-muted transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
397
- title={p.acpConfigToggle}
448
+ aria-label={p.acpConfigToggle}
398
449
  aria-expanded={configOpen}
450
+ className="p-1.5 rounded-md text-muted-foreground hover:text-foreground hover:bg-muted transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
399
451
  >
400
- <Settings2 size={13} />
452
+ <Settings2 size={14} />
401
453
  </button>
402
454
  <button
403
455
  type="button"
404
456
  onClick={handleUse}
405
- className="inline-flex items-center gap-1 px-2.5 py-1 text-2xs font-medium rounded-md border border-[var(--amber)] text-[var(--amber)] hover:bg-[var(--amber)]/10 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring cursor-pointer"
457
+ className="inline-flex items-center gap-1 px-2.5 py-1 text-2xs font-medium rounded-md border border-[var(--amber)] text-[var(--amber)] hover:bg-[var(--amber)]/10 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring cursor-pointer"
406
458
  >
407
459
  <Zap size={10} />
408
460
  {p.acpUseAgent}
409
461
  </button>
410
462
  </div>
411
463
 
412
- {/* Collapsible config section */}
464
+ {/* Collapsible config section — [U-5] more breathing room, [S-3] larger inputs */}
413
465
  {configOpen && resolved && (
414
- <div className="mt-2.5 pt-2.5 border-t border-border/40 space-y-2">
466
+ <div className="mt-3 pt-3 border-t border-border/40 space-y-3 bg-muted/10 -mx-4 px-4 pb-4 rounded-b-lg">
415
467
  {/* Command */}
416
468
  <div className="flex items-center gap-2">
417
469
  <label className="text-2xs text-muted-foreground w-12 shrink-0">{p.acpConfigCommand}</label>
@@ -419,7 +471,7 @@ function AcpAgentCard({ agent, installed, detectionDone, acpConfig }: {
419
471
  type="text"
420
472
  value={editCmd}
421
473
  onChange={e => { setEditCmd(e.target.value); setSaveState('idle'); }}
422
- className="flex-1 rounded-md border border-border bg-background text-foreground text-xs font-mono px-2 py-1 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
474
+ className="flex-1 rounded-md border border-border bg-background text-foreground text-xs font-mono px-2.5 py-1.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
423
475
  placeholder={resolved.cmd}
424
476
  />
425
477
  </div>
@@ -430,27 +482,27 @@ function AcpAgentCard({ agent, installed, detectionDone, acpConfig }: {
430
482
  type="text"
431
483
  value={editArgs}
432
484
  onChange={e => { setEditArgs(e.target.value); setSaveState('idle'); }}
433
- className="flex-1 rounded-md border border-border bg-background text-foreground text-xs font-mono px-2 py-1 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
485
+ className="flex-1 rounded-md border border-border bg-background text-foreground text-xs font-mono px-2.5 py-1.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
434
486
  placeholder={resolved.args.join(' ')}
435
487
  />
436
488
  </div>
437
489
  {/* Status row */}
438
- <div className="flex items-center gap-2 text-2xs text-muted-foreground">
490
+ <div className="flex items-center gap-2 text-2xs text-muted-foreground/60">
439
491
  <span>{p.acpConfigSource}:</span>
440
- <span className={`px-1.5 py-0.5 rounded font-medium ${
492
+ <span className={`px-1.5 py-0.5 rounded ${
441
493
  resolved.source === 'user-override' ? 'bg-[var(--amber)]/15 text-[var(--amber)]'
442
494
  : 'bg-muted text-muted-foreground'
443
495
  }`}>{sourceLabel}</span>
444
- <span className="text-muted-foreground/50">|</span>
496
+ <span className="text-muted-foreground/30">|</span>
445
497
  <span>{p.acpConfigPath}: <span className="font-mono">{installed?.binaryPath}</span></span>
446
498
  </div>
447
- {/* Action buttons */}
499
+ {/* Action buttons — [S-1] pt-2 for separation */}
448
500
  <div className="flex items-center justify-end gap-2 pt-1">
449
501
  {acpConfig.configs[agent.id] && (
450
502
  <button
451
503
  type="button"
452
504
  onClick={handleReset}
453
- className="inline-flex items-center gap-1 px-2 py-1 text-2xs font-medium rounded-md border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
505
+ className="inline-flex items-center gap-1 px-2 py-1 text-2xs font-medium rounded-md border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
454
506
  >
455
507
  <RotateCcw size={10} />
456
508
  {p.acpConfigReset}
@@ -460,7 +512,7 @@ function AcpAgentCard({ agent, installed, detectionDone, acpConfig }: {
460
512
  type="button"
461
513
  onClick={handleSave}
462
514
  disabled={acpConfig.saving}
463
- className="inline-flex items-center gap-1 px-2.5 py-1 text-2xs font-medium rounded-md bg-[var(--amber)] text-[var(--amber-foreground)] hover:bg-[var(--amber)]/90 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50"
515
+ className="inline-flex items-center gap-1 px-2.5 py-1 text-2xs font-medium rounded-md bg-[var(--amber)] text-[var(--amber-foreground)] hover:bg-[var(--amber)]/90 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50"
464
516
  >
465
517
  {saveState === 'saved' ? <><Check size={10} /> {p.acpConfigSaved}</> : <><Save size={10} /> {p.acpConfigSave}</>}
466
518
  </button>
@@ -468,9 +520,9 @@ function AcpAgentCard({ agent, installed, detectionDone, acpConfig }: {
468
520
  </div>
469
521
  )}
470
522
 
471
- {/* Quick action chips */}
523
+ {/* Quick action chips — [V-3] always visible, clear grouping */}
472
524
  {isReady && !configOpen && (
473
- <div className="mt-2.5 pt-2 border-t border-border/40 flex items-center gap-1.5 flex-wrap">
525
+ <div className="mt-3 pt-2.5 border-t border-border/30 flex items-center gap-1.5 flex-wrap">
474
526
  {QUICK_ACTIONS.map((action) => {
475
527
  const Icon = action.icon;
476
528
  return (
@@ -478,7 +530,7 @@ function AcpAgentCard({ agent, installed, detectionDone, acpConfig }: {
478
530
  key={action.labelKey}
479
531
  type="button"
480
532
  onClick={() => handleQuickAction(action)}
481
- className="inline-flex items-center gap-1 px-2 py-0.5 text-2xs font-medium rounded-md bg-muted/60 text-muted-foreground hover:bg-muted hover:text-foreground border border-border/50 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
533
+ className="inline-flex items-center gap-1 px-2 py-0.5 text-2xs font-medium rounded-md bg-muted/60 text-muted-foreground hover:bg-muted hover:text-foreground border border-transparent hover:border-border/50 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
482
534
  >
483
535
  <Icon size={10} />
484
536
  {p[action.labelKey]}
@@ -506,31 +558,34 @@ function AcpAgentCompactRow({ agent, installCmd }: {
506
558
 
507
559
  const effectiveCmd = installCmd || (agent.packageName ? `npm install -g ${agent.packageName}` : null);
508
560
 
561
+ /* [U-2] copy with longer feedback (3s) */
509
562
  const handleCopy = useCallback(() => {
510
563
  if (!effectiveCmd) return;
511
564
  navigator.clipboard.writeText(effectiveCmd).then(() => {
512
565
  setCopied(true);
513
- setTimeout(() => setCopied(false), 2000);
566
+ setTimeout(() => setCopied(false), 3000);
514
567
  }).catch(() => {});
515
568
  }, [effectiveCmd]);
516
569
 
517
570
  return (
518
- <div className="group rounded-lg border border-border/60 bg-card/60 px-3 py-2 hover:border-border transition-all duration-150">
571
+ /* [P-3] list-row style for not-installed clearly different from installed cards */
572
+ <div className="group rounded-md border border-border/40 bg-card/40 px-3 py-2 hover:border-border/60 transition-colors duration-150">
519
573
  <div className="flex items-center gap-2">
520
- <div className="w-6 h-6 rounded-md bg-muted/40 flex items-center justify-center shrink-0">
521
- <Network size={11} className="text-muted-foreground/60" />
574
+ <div className="w-6 h-6 rounded-md bg-muted/30 flex items-center justify-center shrink-0">
575
+ <Network size={11} className="text-muted-foreground/40" />
522
576
  </div>
523
577
  <div className="flex-1 min-w-0">
524
578
  <p className="text-xs text-muted-foreground truncate">{agent.name}</p>
525
579
  {agent.description && (
526
- <p className="text-2xs text-muted-foreground/50 truncate">{agent.description}</p>
580
+ <p className="text-2xs text-muted-foreground/40 truncate">{agent.description}</p>
527
581
  )}
528
582
  </div>
529
583
  {effectiveCmd && (
530
584
  <button
531
585
  type="button"
532
586
  onClick={handleCopy}
533
- className="inline-flex items-center gap-1 px-2 py-0.5 text-2xs font-medium rounded-md border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring shrink-0"
587
+ aria-label={`${p.acpCopyCmd}: ${effectiveCmd}`}
588
+ className="inline-flex items-center gap-1 px-2 py-0.5 text-2xs font-medium rounded-md border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring shrink-0"
534
589
  title={effectiveCmd}
535
590
  >
536
591
  {copied ? (
@@ -552,20 +607,23 @@ function DelegationHistorySection({ delegations }: { delegations: DelegationReco
552
607
  const p = t.panels.agents;
553
608
 
554
609
  return (
555
- <div className="space-y-2">
556
- <h3 className="text-xs font-medium text-muted-foreground uppercase tracking-wide">
610
+ <section className="space-y-2" aria-labelledby="delegation-section-title">
611
+ <h3 id="delegation-section-title" className="text-xs font-medium text-muted-foreground uppercase tracking-wide flex items-center gap-2">
612
+ <div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]"><Clock size={13} /></div>
557
613
  {p.a2aDelegations}
558
614
  </h3>
559
615
  {delegations.length === 0 ? (
560
- <p className="text-xs text-muted-foreground/70 py-3">{p.a2aDelegationsEmpty}</p>
616
+ <p className="text-xs text-muted-foreground/50 py-3">{p.a2aDelegationsEmpty}</p>
561
617
  ) : (
562
- <div className="space-y-1.5">
618
+ <ul role="list" className="space-y-1.5">
563
619
  {delegations.map((d) => (
564
- <DelegationRow key={d.id} record={d} />
620
+ <li key={d.id}>
621
+ <DelegationRow record={d} />
622
+ </li>
565
623
  ))}
566
- </div>
624
+ </ul>
567
625
  )}
568
- </div>
626
+ </section>
569
627
  );
570
628
  }
571
629
 
@@ -591,10 +649,10 @@ function DelegationRow({ record }: { record: DelegationRecord }) {
591
649
  : null;
592
650
 
593
651
  return (
594
- <div className="rounded-lg border border-border/60 bg-card/80 px-3 py-2.5 flex items-center gap-2.5">
652
+ <div className="rounded-lg border border-border/40 bg-card/60 px-3 py-2.5 flex items-center gap-2">
595
653
  <div className="flex-1 min-w-0">
596
654
  <p className="text-xs font-medium text-foreground truncate">{record.agentName}</p>
597
- <p className="text-2xs text-muted-foreground truncate" title={record.message}>
655
+ <p className="text-2xs text-muted-foreground/50 truncate" title={record.message}>
598
656
  {record.message.length > 60 ? record.message.slice(0, 60) + '...' : record.message}
599
657
  </p>
600
658
  </div>
@@ -602,7 +660,7 @@ function DelegationRow({ record }: { record: DelegationRecord }) {
602
660
  {statusLabels[record.status]}
603
661
  </span>
604
662
  {duration && (
605
- <span className="text-2xs text-muted-foreground/60 shrink-0 flex items-center gap-0.5">
663
+ <span className="text-2xs text-muted-foreground/40 shrink-0 flex items-center gap-0.5">
606
664
  <Clock size={10} aria-hidden="true" />
607
665
  {duration}
608
666
  </span>
@@ -640,20 +698,22 @@ function RemoteAgentRow({
640
698
  : 'text-muted-foreground/50';
641
699
 
642
700
  return (
643
- <div className="group rounded-xl border border-border bg-card p-3.5 hover:border-[var(--amber)]/30 transition-all duration-150">
644
- <div className="flex items-center gap-2.5">
701
+ <div className="group rounded-lg border border-border bg-card p-4 hover:border-[var(--amber)]/30 transition-colors duration-150">
702
+ <div className="flex items-center gap-2">
645
703
  <div className="w-8 h-8 rounded-lg bg-muted/50 flex items-center justify-center shrink-0">
646
704
  <Globe size={14} className="text-muted-foreground" />
647
705
  </div>
648
706
  <div className="flex-1 min-w-0">
649
- <p className="text-sm font-medium text-foreground truncate">{agent.card.name}</p>
650
- <p className="text-2xs text-muted-foreground truncate">{agent.card.description}</p>
707
+ {/* [V-1] agent name stronger */}
708
+ <p className="text-base font-semibold text-foreground truncate leading-tight">{agent.card.name}</p>
709
+ <p className="text-2xs text-muted-foreground/50 truncate mt-0.5">{agent.card.description}</p>
651
710
  </div>
652
711
  <StatusIcon size={13} className={statusColor} aria-hidden="true" />
712
+ {/* [P-4] Delete button — visible on hover, accessible via keyboard */}
653
713
  <button
654
714
  type="button"
655
715
  onClick={() => onRemove(agent.id)}
656
- className="p-1.5 rounded-md text-muted-foreground/50 hover:text-error hover:bg-error/10 transition-colors opacity-0 group-hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:opacity-100"
716
+ className="p-1.5 rounded-md text-muted-foreground/50 hover:text-[var(--error)] hover:bg-[var(--error)]/10 transition-colors duration-150 opacity-0 group-hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:opacity-100"
657
717
  aria-label={removeCopy}
658
718
  title={removeCopy}
659
719
  >
@@ -661,21 +721,21 @@ function RemoteAgentRow({
661
721
  </button>
662
722
  </div>
663
723
  {agent.card.skills.length > 0 && (
664
- <div className="mt-2.5 pt-2 border-t border-border/40 flex items-center gap-1.5">
665
- <Zap size={11} className="text-muted-foreground/60 shrink-0" aria-hidden="true" />
666
- <span className="text-2xs text-muted-foreground">{skillsCopy}: {agent.card.skills.length}</span>
724
+ <div className="mt-3 pt-2.5 border-t border-border/30 flex items-center gap-1.5">
725
+ <Zap size={11} className="text-muted-foreground/40 shrink-0" aria-hidden="true" />
726
+ <span className="text-2xs text-muted-foreground/60">{skillsCopy}: {agent.card.skills.length}</span>
667
727
  <div className="flex flex-wrap gap-1 ml-1">
668
728
  {agent.card.skills.slice(0, 3).map((s) => (
669
729
  <span
670
730
  key={s.id}
671
- className="text-2xs px-1.5 py-0.5 rounded bg-muted/80 text-muted-foreground border border-border/50"
731
+ className="text-2xs px-1.5 py-0.5 rounded bg-muted/60 text-muted-foreground border border-border/30"
672
732
  title={s.description}
673
733
  >
674
734
  {s.name}
675
735
  </span>
676
736
  ))}
677
737
  {agent.card.skills.length > 3 && (
678
- <span className="text-2xs text-muted-foreground/60">+{agent.card.skills.length - 3}</span>
738
+ <span className="text-2xs text-muted-foreground/40">+{agent.card.skills.length - 3}</span>
679
739
  )}
680
740
  </div>
681
741
  </div>