@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.
- package/_standalone/.antigravity/mcp_config.json +14 -0
- package/_standalone/.mindos-build-version +1 -1
- package/_standalone/.next/BUILD_ID +1 -1
- package/_standalone/.next/app-path-routes-manifest.json +23 -23
- package/_standalone/.next/build-manifest.json +2 -2
- package/_standalone/.next/cache/.previewinfo +1 -1
- package/_standalone/.next/cache/.rscinfo +1 -1
- package/_standalone/.next/cache/config.json +3 -3
- package/_standalone/.next/prerender-manifest.json +3 -3
- package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error.html +2 -2
- package/_standalone/.next/server/app/_global-error.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/_standalone/.next/server/app/_not-found/page.js +1 -1
- package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/page.js +1 -1
- package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/detect/route.js +1 -1
- package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/registry/route.js +1 -1
- package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask/route.js +53 -47
- package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/route.js +1 -1
- package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/skills/route.js +1 -1
- package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/changes/page.js +1 -1
- package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page.js +2 -2
- package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/page.js +1 -1
- package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/explore/page.js +1 -1
- package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/help/page.js +1 -1
- package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/login/page.js +1 -1
- package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/page.js +1 -1
- package/_standalone/.next/server/app/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/setup/page.js +2 -2
- package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/trash/page.js +3 -3
- package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/view/[...path]/page.js +2 -2
- package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/wiki/page.js +1 -1
- package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app-paths-manifest.json +23 -23
- package/_standalone/.next/server/chunks/122.js +222 -0
- package/_standalone/.next/server/chunks/1550.js +1 -1
- package/_standalone/.next/server/chunks/1750.js +1 -1
- package/_standalone/.next/server/chunks/3113.js +52 -0
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/8388.js +3 -3
- package/_standalone/.next/server/chunks/953.js +3 -3
- package/_standalone/.next/server/pages/500.html +2 -2
- package/_standalone/.next/server/server-reference-manifest.js +1 -1
- package/_standalone/.next/server/server-reference-manifest.json +1 -1
- package/_standalone/.next/static/chunks/1001-99da82ec8d8c136f.js +1 -0
- package/_standalone/.next/static/chunks/1088-77544af0a50cb7a4.js +1 -0
- package/_standalone/.next/static/chunks/1467-87dde7eed498806f.js +1 -0
- package/_standalone/.next/static/chunks/5149-4d828886dda479fa.js +1 -0
- package/_standalone/.next/static/chunks/5581-c671163a2fe1b312.js +29 -0
- package/_standalone/.next/static/chunks/{7266-bb7be1128eccd48e.js → 5718-3837c3210a0e175f.js} +2 -2
- package/_standalone/.next/static/chunks/6636-53238eff89503f03.js +6 -0
- package/_standalone/.next/static/chunks/6757-1c1a89720fdda8f0.js +1 -0
- package/_standalone/.next/static/chunks/7129-20e9d2463a9da646.js +1 -0
- package/_standalone/.next/static/chunks/7294-cac25d97869afadc.js +1 -0
- package/_standalone/.next/static/chunks/8225-21e5cebc3731ddf0.js +1 -0
- package/_standalone/.next/static/chunks/8520-b51810e66293ceb8.js +22 -0
- package/_standalone/.next/static/chunks/9207-dc9c31b351a2ed78.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-2f5cf97e03dc1cc9.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/page-50eac58d511dcc6e.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-2a00f4686adf3885.js +11 -0
- package/_standalone/.next/static/chunks/app/layout-2cb7a6602d2e5d5f.js +168 -0
- package/_standalone/.next/static/chunks/app/{page-6a1f8d21c12b829e.js → page-5ab911b2226f6ff7.js} +1 -1
- package/_standalone/.next/static/chunks/app/setup/page-907b7c57fad2292b.js +1 -0
- package/_standalone/.next/static/chunks/app/trash/page-11a511b065ea84c2.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/page-26e47dd4c533a58c.js +12 -0
- package/_standalone/.next/static/chunks/app/wiki/page-dce495b9048022fb.js +1 -0
- package/_standalone/.next/static/css/67e7918f5ed7d147.css +1 -0
- package/_standalone/.next/trace +65 -65
- package/_standalone/__tests__/acp/registry.test.ts +30 -20
- package/_standalone/__tests__/api/ask-attachments.test.ts +194 -0
- package/_standalone/__tests__/api/mcp-install.test.ts +49 -2
- package/_standalone/__tests__/api/settings.test.ts +16 -12
- package/_standalone/__tests__/api/setup.test.ts +11 -9
- package/_standalone/__tests__/api/test-key.test.ts +0 -10
- package/_standalone/__tests__/components/UpdateToast.test.ts +344 -0
- package/_standalone/__tests__/core/context.test.ts +48 -426
- package/_standalone/__tests__/lib/pi-skills.test.ts +4 -4
- package/_standalone/__tests__/lib/settings-ai-client.test.ts +32 -12
- package/_standalone/__tests__/setup.ts +5 -5
- package/_standalone/app/globals.css +4 -4
- package/_standalone/components/ActivityBar.tsx +17 -6
- package/_standalone/components/Panel.tsx +24 -6
- package/_standalone/components/SidebarLayout.tsx +36 -8
- package/_standalone/components/agents/AgentsMcpSection.tsx +2 -2
- package/_standalone/components/agents/AgentsOverviewSection.tsx +5 -1
- package/_standalone/components/agents/AgentsPanelA2aTab.tsx +173 -113
- package/_standalone/components/agents/AgentsSkillsSection.tsx +2 -2
- package/_standalone/components/ask/AskContent.tsx +83 -44
- package/_standalone/components/ask/AskHeader.tsx +8 -1
- package/_standalone/components/ask/MessageList.tsx +37 -3
- package/_standalone/components/ask/ProviderModelCapsule.tsx +444 -174
- package/_standalone/components/home/InboxSection.tsx +25 -25
- package/_standalone/components/settings/AiTab.tsx +353 -298
- package/_standalone/components/settings/CustomProviderFields.tsx +121 -0
- package/_standalone/components/settings/CustomProvidersCard.tsx +154 -0
- package/_standalone/components/settings/KnowledgeTab.tsx +6 -20
- package/_standalone/components/settings/McpAgentInstall.tsx +7 -2
- package/_standalone/components/settings/Primitives.tsx +48 -104
- package/_standalone/components/settings/ProviderModal.tsx +87 -0
- package/_standalone/components/settings/SettingsContent.tsx +2 -5
- package/_standalone/components/settings/TestButton.tsx +64 -0
- package/_standalone/components/settings/types.ts +3 -9
- package/_standalone/components/settings/useCustomProviderForm.ts +132 -0
- package/_standalone/components/setup/StepAI.tsx +12 -5
- package/_standalone/components/shared/ModelInput.tsx +220 -0
- package/_standalone/components/shared/ProviderSelect.tsx +126 -36
- package/_standalone/hooks/useAskChat.ts +100 -13
- package/_standalone/hooks/useAskPanel.ts +17 -1
- package/_standalone/lib/settings-ai-client.ts +17 -8
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/.antigravity/mcp_config.json +14 -0
- package/app/app/api/ask/route.ts +154 -45
- package/app/app/api/mcp/agents/route.ts +3 -3
- package/app/app/api/settings/list-models/route.ts +36 -9
- package/app/app/api/settings/route.ts +14 -42
- package/app/app/api/settings/test-key/route.ts +78 -2
- package/app/app/api/setup/route.ts +36 -18
- package/app/app/api/skills/route.ts +1 -1
- package/app/app/globals.css +4 -4
- package/app/app/layout.tsx +5 -3
- package/app/app/view/[...path]/page.tsx +5 -0
- package/app/components/ActivityBar.tsx +17 -6
- package/app/components/HomeContent.tsx +11 -0
- package/app/components/InboxView.tsx +656 -0
- package/app/components/Panel.tsx +24 -6
- package/app/components/SidebarLayout.tsx +36 -8
- package/app/components/UpdateToast.tsx +255 -0
- package/app/components/agents/AgentDetailContent.tsx +8 -8
- package/app/components/agents/AgentsMcpSection.tsx +2 -2
- package/app/components/agents/AgentsOverviewSection.tsx +5 -1
- package/app/components/agents/AgentsPanelA2aTab.tsx +173 -113
- package/app/components/agents/AgentsSkillsSection.tsx +2 -2
- package/app/components/ask/AskContent.tsx +83 -44
- package/app/components/ask/AskHeader.tsx +8 -1
- package/app/components/ask/MessageList.tsx +37 -3
- package/app/components/ask/ProviderModelCapsule.tsx +444 -174
- package/app/components/home/InboxSection.tsx +25 -25
- package/app/components/settings/AiTab.tsx +353 -298
- package/app/components/settings/CustomProviderFields.tsx +121 -0
- package/app/components/settings/CustomProvidersCard.tsx +154 -0
- package/app/components/settings/KnowledgeTab.tsx +6 -20
- package/app/components/settings/McpAgentInstall.tsx +7 -2
- package/app/components/settings/Primitives.tsx +48 -104
- package/app/components/settings/ProviderModal.tsx +87 -0
- package/app/components/settings/SettingsContent.tsx +2 -5
- package/app/components/settings/TestButton.tsx +64 -0
- package/app/components/settings/types.ts +3 -9
- package/app/components/settings/useCustomProviderForm.ts +132 -0
- package/app/components/setup/StepAI.tsx +12 -5
- package/app/components/shared/ModelInput.tsx +220 -0
- package/app/components/shared/ProviderSelect.tsx +126 -36
- package/app/hooks/useAskChat.ts +100 -13
- package/app/hooks/useAskPanel.ts +17 -1
- package/app/lib/acp/registry.ts +92 -10
- package/app/lib/agent/context.ts +65 -0
- package/app/lib/agent/providers.ts +25 -0
- package/app/lib/agent/tools.ts +1 -1
- package/app/lib/custom-endpoints.ts +160 -0
- package/app/lib/fs.ts +8 -1
- package/app/lib/i18n/modules/ai-chat.ts +6 -0
- package/app/lib/i18n/modules/knowledge.ts +16 -0
- package/app/lib/i18n/modules/onboarding.ts +4 -0
- package/app/lib/i18n/modules/settings.ts +88 -2
- package/app/lib/mcp-agents.ts +11 -0
- package/app/lib/pi-integration/skills.ts +16 -4
- package/app/lib/settings-ai-client.ts +17 -8
- package/app/lib/settings.ts +68 -72
- package/app/lib/types.ts +4 -0
- package/bin/lib/mcp-agents.js +11 -0
- package/bin/lib/mcp-install.js +71 -7
- package/package.json +1 -1
- package/_standalone/.next/server/chunks/530.js +0 -218
- package/_standalone/.next/server/chunks/8955.js +0 -52
- package/_standalone/.next/static/chunks/1369-7d0ac5d1564eed1e.js +0 -1
- package/_standalone/.next/static/chunks/3427-2e61a5df1f5e55fb.js +0 -1
- package/_standalone/.next/static/chunks/5581-0c700c20718bd916.js +0 -29
- package/_standalone/.next/static/chunks/6297-085daa21037d5f81.js +0 -1
- package/_standalone/.next/static/chunks/6636-9bbc90fb3b8731fe.js +0 -6
- package/_standalone/.next/static/chunks/7637-904b0a381dc3ec02.js +0 -1
- package/_standalone/.next/static/chunks/8520-76d1b05072178b43.js +0 -22
- package/_standalone/.next/static/chunks/8658-16ff58b75ae37fbb.js +0 -1
- package/_standalone/.next/static/chunks/9905-a19d379cb225246e.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-0ea3571c8fbae823.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/page-66858acbcd1d4bf8.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-bf5c290fa3ccff09.js +0 -11
- package/_standalone/.next/static/chunks/app/layout-a5d5925b47e87cc3.js +0 -164
- package/_standalone/.next/static/chunks/app/setup/page-821714e7477be46c.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-40bc7316806acd62.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-6fbb14b8f322d0f0.js +0 -12
- package/_standalone/.next/static/chunks/app/wiki/page-ba36eccf4fe62cfe.js +0 -1
- package/_standalone/.next/static/css/b57c4eb3cc88308b.css +0 -1
- package/_standalone/lib/agent/context.ts +0 -403
- /package/_standalone/.next/static/{5GmVArEG8OX03azKICsGq → eIlwbGas1iRGonlPyEwj7}/_buildManifest.js +0 -0
- /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-
|
|
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">
|
|
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
|
|
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-
|
|
64
|
-
<div className="w-12 h-12 rounded-
|
|
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/
|
|
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
|
-
<
|
|
82
|
+
<ul role="list" className="space-y-2">
|
|
74
83
|
{agents.map((agent) => (
|
|
75
|
-
<
|
|
84
|
+
<li key={agent.id}>
|
|
85
|
+
<RemoteAgentRow agent={agent} onRemove={onRemove} removeCopy={p.a2aRemoveAgent} skillsCopy={p.a2aSkills} />
|
|
86
|
+
</li>
|
|
76
87
|
))}
|
|
77
|
-
</
|
|
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-
|
|
113
|
-
<div className="w-14 h-14 rounded-
|
|
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-
|
|
117
|
-
<p className="text-xs text-muted-foreground/
|
|
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
|
-
|
|
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="
|
|
173
|
-
<
|
|
174
|
-
<
|
|
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
|
-
<
|
|
221
|
-
{/* ──
|
|
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
|
-
|
|
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/
|
|
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
|
-
{
|
|
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
|
-
<
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
</
|
|
256
|
-
) :
|
|
257
|
-
<div className="rounded-lg border border-border/40 bg-card/30 p-
|
|
258
|
-
<p className="text-xs text-muted-foreground/
|
|
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
|
-
)
|
|
306
|
+
)}
|
|
263
307
|
|
|
264
|
-
{/* ── Available (Not Installed) —
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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
|
-
</
|
|
335
|
+
</ul>
|
|
290
336
|
)}
|
|
291
337
|
</div>
|
|
292
338
|
)}
|
|
293
|
-
</
|
|
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-
|
|
347
|
+
npx: 'bg-muted text-muted-foreground',
|
|
301
348
|
binary: 'bg-muted text-muted-foreground',
|
|
302
|
-
uvx: 'bg-
|
|
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'),
|
|
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
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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
|
-
|
|
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/
|
|
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
|
-
|
|
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
|
-
|
|
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={
|
|
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-
|
|
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
|
|
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/
|
|
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-
|
|
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),
|
|
566
|
+
setTimeout(() => setCopied(false), 3000);
|
|
514
567
|
}).catch(() => {});
|
|
515
568
|
}, [effectiveCmd]);
|
|
516
569
|
|
|
517
570
|
return (
|
|
518
|
-
|
|
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/
|
|
521
|
-
<Network size={11} className="text-muted-foreground/
|
|
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/
|
|
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
|
-
|
|
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
|
-
<
|
|
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/
|
|
616
|
+
<p className="text-xs text-muted-foreground/50 py-3">{p.a2aDelegationsEmpty}</p>
|
|
561
617
|
) : (
|
|
562
|
-
<
|
|
618
|
+
<ul role="list" className="space-y-1.5">
|
|
563
619
|
{delegations.map((d) => (
|
|
564
|
-
<
|
|
620
|
+
<li key={d.id}>
|
|
621
|
+
<DelegationRow record={d} />
|
|
622
|
+
</li>
|
|
565
623
|
))}
|
|
566
|
-
</
|
|
624
|
+
</ul>
|
|
567
625
|
)}
|
|
568
|
-
</
|
|
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/
|
|
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/
|
|
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-
|
|
644
|
-
<div className="flex items-center gap-2
|
|
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
|
-
|
|
650
|
-
<p className="text-
|
|
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-
|
|
665
|
-
<Zap size={11} className="text-muted-foreground/
|
|
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/
|
|
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/
|
|
738
|
+
<span className="text-2xs text-muted-foreground/40">+{agent.card.skills.length - 3}</span>
|
|
679
739
|
)}
|
|
680
740
|
</div>
|
|
681
741
|
</div>
|