@geminilight/mindos 0.6.51 → 0.6.52
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/.mindos-build-version +1 -1
- package/_standalone/.next/BUILD_ID +1 -1
- package/_standalone/.next/app-path-routes-manifest.json +18 -18
- package/_standalone/.next/build-manifest.json +3 -3
- 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/react-loadable-manifest.json +1 -1
- 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.js +2 -2
- 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 +11 -6
- package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +11 -6
- 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 +6 -1
- package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/_standalone/.next/server/app/_not-found/page.js +2 -2
- 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 +2 -2
- 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 +3 -3
- 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_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_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/ask/route.js +1 -1
- 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 +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 +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 +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 +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/route.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 +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 +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 +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 +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 +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 +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 +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 +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_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_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_client-reference-manifest.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 +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 +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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/login/page.js +2 -2
- 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 +2 -2
- 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-paths-manifest.json +18 -18
- package/_standalone/.next/server/chunks/2190.js +1 -1
- package/_standalone/.next/server/chunks/2673.js +52 -0
- package/_standalone/.next/server/chunks/4241.js +1 -219
- package/_standalone/.next/server/chunks/8408.js +219 -0
- package/_standalone/.next/server/instrumentation.js +1 -1
- package/_standalone/.next/server/middleware-build-manifest.js +1 -1
- package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- 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/1053-c519cb347faa75e2.js +29 -0
- package/_standalone/.next/static/chunks/{1814.2ee1d03297c0bccd.js → 1814.72f7fe7c61e2b647.js} +1 -1
- package/_standalone/.next/static/chunks/{1880-c2a9e76201841c86.js → 1880-3ec02adc80531825.js} +1 -1
- package/_standalone/.next/static/chunks/6636-9bbc90fb3b8731fe.js +6 -0
- package/_standalone/.next/static/chunks/7035-032641fb6f4e07b2.js +1 -0
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/_global-error/page-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/{page-773071a99c4daac2.js → page-074d6aafc2606561.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/{page-0d9920b591ce999f.js → page-710d8c80fa86e93e.js} +2 -2
- package/_standalone/.next/static/chunks/app/api/a2a/agents/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/page-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/{layout-4264ca690ad73be1.js → layout-e706f9a963b177ba.js} +32 -32
- package/_standalone/.next/static/chunks/app/loading-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/page-2595175820acfd65.js +7 -0
- package/_standalone/.next/static/chunks/app/setup/page-99f40e9337388cda.js +1 -0
- package/_standalone/.next/static/chunks/app/trash/page-61c6210fac1e9710.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/page-798359c36f10ef8d.js +12 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/{webpack-7b276daaa930d480.js → webpack-bbd44cbc83dc0aa4.js} +1 -1
- package/_standalone/.next/static/css/ef1151f74f00d91a.css +1 -0
- package/_standalone/.next/trace +64 -63
- package/_standalone/app/globals.css +1 -1
- package/_standalone/components/ActivityBar.tsx +1 -1
- package/_standalone/components/AskFab.tsx +4 -4
- package/_standalone/components/ExportModal.tsx +4 -1
- package/_standalone/components/FileTree.tsx +13 -5
- package/_standalone/components/Panel.tsx +5 -12
- package/_standalone/components/RightAgentDetailPanel.tsx +5 -4
- package/_standalone/components/RightAskPanel.tsx +5 -4
- package/_standalone/components/agents/AgentsPrimitives.tsx +7 -3
- package/_standalone/components/ask/ProviderModelCapsule.tsx +16 -3
- package/_standalone/components/settings/AiTab.tsx +1 -0
- package/_standalone/components/settings/Primitives.tsx +84 -3
- package/_standalone/instrumentation.ts +3 -1
- package/_standalone/lib/config/animation.ts +76 -0
- package/_standalone/lib/config/icon-scale.ts +35 -0
- package/_standalone/lib/config/panel-sizes.ts +58 -0
- package/_standalone/lib/hooks/useFocusTrap.ts +65 -0
- package/_standalone/lib/i18n/modules/knowledge.ts +16 -8
- package/_standalone/lib/i18n/modules/onboarding.ts +2 -2
- package/_standalone/lib/i18n/modules/settings.ts +4 -0
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/globals.css +1 -1
- package/app/app/loading.tsx +80 -0
- package/app/app/view/[...path]/loading.tsx +32 -9
- package/app/components/ActivityBar.tsx +1 -1
- package/app/components/AskFab.tsx +4 -4
- package/app/components/ExportModal.tsx +4 -1
- package/app/components/FileTree.tsx +13 -5
- package/app/components/HomeContent.tsx +29 -12
- package/app/components/Panel.tsx +5 -12
- package/app/components/RightAgentDetailPanel.tsx +5 -4
- package/app/components/RightAskPanel.tsx +5 -4
- package/app/components/TrashPageClient.tsx +4 -4
- package/app/components/agents/AgentsPrimitives.tsx +7 -3
- package/app/components/ask/ProviderModelCapsule.tsx +16 -3
- package/app/components/settings/AiTab.tsx +1 -0
- package/app/components/settings/Primitives.tsx +84 -3
- package/app/components/ui/Toaster.tsx +1 -1
- package/app/instrumentation.ts +3 -1
- package/app/lib/config/animation.ts +76 -0
- package/app/lib/config/icon-scale.ts +35 -0
- package/app/lib/config/panel-sizes.ts +58 -0
- package/app/lib/hooks/useFocusTrap.ts +65 -0
- package/app/lib/i18n/modules/knowledge.ts +16 -8
- package/app/lib/i18n/modules/onboarding.ts +2 -2
- package/app/lib/i18n/modules/settings.ts +4 -0
- package/package.json +1 -1
- package/_standalone/.next/server/chunks/1975.js +0 -52
- package/_standalone/.next/server/chunks/6622.js +0 -1
- package/_standalone/.next/static/chunks/1053-8cb7fd1bfbbbedd3.js +0 -29
- package/_standalone/.next/static/chunks/4563-b2a2ce80aff845af.js +0 -6
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/_global-error/page-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/agents/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/page-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/page-00202b22c6db2144.js +0 -7
- package/_standalone/.next/static/chunks/app/setup/page-81c37de31c9a5beb.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-e0398f37b2a47da5.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-02d632d03f3ec6c6.js +0 -12
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/css/bc9179074eaf65ae.css +0 -1
- /package/_standalone/.next/static/{Oo3NOv4X7Res4OjfuRdIF → IiTZbEzZo8l5MSUxlDwKp}/_buildManifest.js +0 -0
- /package/_standalone/.next/static/{Oo3NOv4X7Res4OjfuRdIF → IiTZbEzZo8l5MSUxlDwKp}/_ssgManifest.js +0 -0
|
@@ -48,7 +48,7 @@ function RailButton({ icon, label, shortcut, active = false, expanded, onClick,
|
|
|
48
48
|
onClick={onClick}
|
|
49
49
|
aria-pressed={active}
|
|
50
50
|
aria-label={label}
|
|
51
|
-
title={
|
|
51
|
+
title={shortcut ? `${label} (${shortcut})` : label}
|
|
52
52
|
data-walkthrough={walkthroughId}
|
|
53
53
|
className={`
|
|
54
54
|
relative flex items-center ${expanded ? 'justify-start px-3 w-full' : 'justify-center w-10'} h-10 rounded-md transition-colors
|
|
@@ -22,16 +22,16 @@ export default function AskFab({ onToggle, askPanelOpen }: AskFabProps) {
|
|
|
22
22
|
fixed z-40 bottom-5 right-5
|
|
23
23
|
items-center justify-center
|
|
24
24
|
gap-0 hover:gap-2
|
|
25
|
-
p-
|
|
25
|
+
p-3 rounded-xl
|
|
26
26
|
text-white font-medium text-[13px]
|
|
27
|
-
shadow-
|
|
27
|
+
shadow-sm shadow-amber-900/10
|
|
28
28
|
transition-all duration-200 ease-out
|
|
29
|
-
hover:shadow-
|
|
29
|
+
hover:shadow-md hover:shadow-amber-900/15
|
|
30
30
|
active:scale-95 cursor-pointer overflow-hidden font-display
|
|
31
31
|
${askPanelOpen ? 'opacity-0 pointer-events-none translate-y-2' : 'opacity-100 translate-y-0'}
|
|
32
32
|
`}
|
|
33
33
|
style={{
|
|
34
|
-
background: '
|
|
34
|
+
background: 'var(--amber)',
|
|
35
35
|
}}
|
|
36
36
|
title={label}
|
|
37
37
|
aria-label={label}
|
|
@@ -104,13 +104,16 @@ export default function ExportModal({ open, onClose, filePath, isDirectory, file
|
|
|
104
104
|
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 backdrop-blur-sm" onClick={state === 'exporting' ? undefined : handleClose}>
|
|
105
105
|
<div
|
|
106
106
|
className="bg-card border border-border rounded-xl shadow-xl max-w-md w-full mx-4 animate-in fade-in-0 zoom-in-95 duration-200"
|
|
107
|
+
role="dialog"
|
|
108
|
+
aria-modal="true"
|
|
109
|
+
aria-labelledby="export-modal-title"
|
|
107
110
|
onClick={e => e.stopPropagation()}
|
|
108
111
|
>
|
|
109
112
|
{/* Header */}
|
|
110
113
|
<div className="flex items-center justify-between px-5 py-4 border-b border-border">
|
|
111
114
|
<div className="flex items-center gap-2">
|
|
112
115
|
<Download size={15} className="text-[var(--amber)]" />
|
|
113
|
-
<h3 className="text-sm font-semibold font-display">
|
|
116
|
+
<h3 id="export-modal-title" className="text-sm font-semibold font-display">
|
|
114
117
|
{isDirectory ? (t.export?.exportSpace ?? 'Export Space') : (t.export?.exportFile ?? 'Export File')}
|
|
115
118
|
</h3>
|
|
116
119
|
</div>
|
|
@@ -4,6 +4,7 @@ import { useState, useCallback, useRef, useTransition, useEffect, useSyncExterna
|
|
|
4
4
|
import { useRouter, usePathname } from 'next/navigation';
|
|
5
5
|
import { FileNode, SYSTEM_FILES, UNDELETABLE_FILES } from '@/lib/types';
|
|
6
6
|
import { encodePath } from '@/lib/utils';
|
|
7
|
+
import { ICON_SIZES } from '@/lib/config/icon-scale';
|
|
7
8
|
import {
|
|
8
9
|
ChevronDown, FileText, Table, Folder, FolderOpen, Plus, Loader2,
|
|
9
10
|
Trash2, Pencil, Layers, ScrollText, FolderInput, Copy, MoreHorizontal, Star, Inbox,
|
|
@@ -61,8 +62,8 @@ interface FileTreeProps {
|
|
|
61
62
|
|
|
62
63
|
function getIcon(node: FileNode) {
|
|
63
64
|
if (node.type === 'directory') return null;
|
|
64
|
-
if (node.extension === '.csv') return <Table size={
|
|
65
|
-
return <FileText size={
|
|
65
|
+
if (node.extension === '.csv') return <Table size={ICON_SIZES.md} className="text-success shrink-0" />;
|
|
66
|
+
return <FileText size={ICON_SIZES.md} className="text-muted-foreground shrink-0" />;
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
function getCurrentFilePath(pathname: string): string {
|
|
@@ -428,9 +429,10 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
|
|
|
428
429
|
className="shrink-0 p-1 rounded hover:bg-muted text-muted-foreground transition-colors"
|
|
429
430
|
style={{ marginLeft: `${depth * 12 + 4}px` }}
|
|
430
431
|
aria-label={open ? `Collapse ${node.name}` : `Expand ${node.name}`}
|
|
432
|
+
aria-expanded={open}
|
|
431
433
|
>
|
|
432
434
|
<span className="block transition-transform duration-150" style={{ transform: open ? 'rotate(0deg)' : 'rotate(-90deg)' }}>
|
|
433
|
-
<ChevronDown size={
|
|
435
|
+
<ChevronDown size={ICON_SIZES.xs} />
|
|
434
436
|
</span>
|
|
435
437
|
</button>
|
|
436
438
|
<button
|
|
@@ -446,7 +448,7 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
|
|
|
446
448
|
className={`
|
|
447
449
|
flex-1 flex items-center gap-1.5 px-1 py-1 rounded text-left min-w-0 pr-16
|
|
448
450
|
text-sm transition-colors duration-100
|
|
449
|
-
hover:bg-muted
|
|
451
|
+
hover:bg-muted cursor-text
|
|
450
452
|
${isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'}
|
|
451
453
|
`}
|
|
452
454
|
>
|
|
@@ -459,6 +461,9 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
|
|
|
459
461
|
: <Folder size={14} className="text-yellow-400 shrink-0" />
|
|
460
462
|
}
|
|
461
463
|
<span className="truncate leading-5" suppressHydrationWarning>{node.name}</span>
|
|
464
|
+
<span className="ml-auto text-xs text-muted-foreground/30 group-hover/dir:text-muted-foreground/60 transition-colors shrink-0 hidden group-hover/dir:inline-flex items-center gap-1">
|
|
465
|
+
<Pencil size={10} />
|
|
466
|
+
</span>
|
|
462
467
|
{isSpace && !open && (
|
|
463
468
|
<span className="ml-auto text-xs text-muted-foreground shrink-0 tabular-nums pr-1">{contentCount}</span>
|
|
464
469
|
)}
|
|
@@ -659,7 +664,7 @@ function FileNodeItem({ node, depth, currentPath, onNavigate }: {
|
|
|
659
664
|
data-filepath={node.path}
|
|
660
665
|
className={`
|
|
661
666
|
w-full flex items-center gap-1.5 px-2 py-1 rounded text-left
|
|
662
|
-
text-sm transition-colors duration-100 cursor-
|
|
667
|
+
text-sm transition-colors duration-100 cursor-text pr-16
|
|
663
668
|
${isActive
|
|
664
669
|
? 'bg-accent text-foreground'
|
|
665
670
|
: 'hover:bg-muted text-muted-foreground hover:text-foreground'
|
|
@@ -669,6 +674,9 @@ function FileNodeItem({ node, depth, currentPath, onNavigate }: {
|
|
|
669
674
|
>
|
|
670
675
|
{getIcon(node)}
|
|
671
676
|
<span className="truncate leading-5" suppressHydrationWarning>{node.name}</span>
|
|
677
|
+
<span className="ml-auto text-xs text-muted-foreground/30 group-hover/file:text-muted-foreground/60 transition-colors shrink-0 hidden group-hover/file:inline-flex items-center gap-1">
|
|
678
|
+
<Pencil size={10} />
|
|
679
|
+
</span>
|
|
672
680
|
{pinned && <Star size={10} className="shrink-0 fill-[var(--amber)] text-[var(--amber)] opacity-60" />}
|
|
673
681
|
</button>
|
|
674
682
|
<div className="absolute right-1 top-1/2 -translate-y-1/2 hidden group-hover/file:flex items-center gap-0.5">
|
|
@@ -11,6 +11,7 @@ import PanelHeader from './panels/PanelHeader';
|
|
|
11
11
|
import { useResizeDrag } from '@/hooks/useResizeDrag';
|
|
12
12
|
import { useLocale } from '@/lib/stores/locale-store';
|
|
13
13
|
import { listTrashAction } from '@/lib/actions';
|
|
14
|
+
import { DEFAULT_LEFT_PANEL_WIDTH, LEFT_PANEL } from '@/lib/config/panel-sizes';
|
|
14
15
|
|
|
15
16
|
const noop = () => {};
|
|
16
17
|
|
|
@@ -25,18 +26,10 @@ function getMaxDepth(nodes: FileNode[], current = 0): number {
|
|
|
25
26
|
return max;
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
const DEFAULT_PANEL_WIDTH
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
agents: 280,
|
|
33
|
-
discover: 280,
|
|
34
|
-
workflows: 280,
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const MIN_PANEL_WIDTH = 240;
|
|
38
|
-
const MAX_PANEL_WIDTH_RATIO = 0.45;
|
|
39
|
-
const MAX_PANEL_WIDTH_ABS = 600;
|
|
29
|
+
const DEFAULT_PANEL_WIDTH = DEFAULT_LEFT_PANEL_WIDTH;
|
|
30
|
+
const MIN_PANEL_WIDTH = LEFT_PANEL.MIN;
|
|
31
|
+
const MAX_PANEL_WIDTH_RATIO = LEFT_PANEL.MAX_RATIO;
|
|
32
|
+
const MAX_PANEL_WIDTH_ABS = LEFT_PANEL.MAX_ABS;
|
|
40
33
|
|
|
41
34
|
interface PanelProps {
|
|
42
35
|
activePanel: PanelId | null;
|
|
@@ -6,11 +6,12 @@ import { useLocale } from '@/lib/stores/locale-store';
|
|
|
6
6
|
import { useResizeDrag } from '@/hooks/useResizeDrag';
|
|
7
7
|
import AgentsPanelAgentDetail from '@/components/panels/AgentsPanelAgentDetail';
|
|
8
8
|
import { resolveAgentDetailStatus } from '@/components/panels/agents-panel-resolve-status';
|
|
9
|
+
import { RIGHT_AGENT_DETAIL_PANEL } from '@/lib/config/panel-sizes';
|
|
9
10
|
|
|
10
|
-
const DEFAULT_WIDTH =
|
|
11
|
-
const MIN_WIDTH =
|
|
12
|
-
const MAX_WIDTH_ABS =
|
|
13
|
-
const MAX_WIDTH_RATIO =
|
|
11
|
+
const DEFAULT_WIDTH = RIGHT_AGENT_DETAIL_PANEL.DEFAULT;
|
|
12
|
+
const MIN_WIDTH = RIGHT_AGENT_DETAIL_PANEL.MIN;
|
|
13
|
+
const MAX_WIDTH_ABS = RIGHT_AGENT_DETAIL_PANEL.MAX_ABS;
|
|
14
|
+
const MAX_WIDTH_RATIO = RIGHT_AGENT_DETAIL_PANEL.MAX_RATIO;
|
|
14
15
|
|
|
15
16
|
interface RightAgentDetailPanelProps {
|
|
16
17
|
open: boolean;
|
|
@@ -5,13 +5,14 @@ import { AlertCircle } from 'lucide-react';
|
|
|
5
5
|
import AskContent from '@/components/ask/AskContent';
|
|
6
6
|
import ErrorBoundary from '@/components/ErrorBoundary';
|
|
7
7
|
import { useResizeDrag } from '@/hooks/useResizeDrag';
|
|
8
|
+
import { RIGHT_ASK_PANEL } from '@/lib/config/panel-sizes';
|
|
8
9
|
|
|
9
|
-
const DEFAULT_WIDTH =
|
|
10
|
-
const MIN_WIDTH =
|
|
11
|
-
const MAX_WIDTH_ABS =
|
|
10
|
+
const DEFAULT_WIDTH = RIGHT_ASK_PANEL.DEFAULT;
|
|
11
|
+
const MIN_WIDTH = RIGHT_ASK_PANEL.MIN;
|
|
12
|
+
const MAX_WIDTH_ABS = RIGHT_ASK_PANEL.MAX_ABS;
|
|
12
13
|
const ENTER_SNAP_THRESHOLD = 80;
|
|
13
14
|
const EXIT_SNAP_THRESHOLD = 16;
|
|
14
|
-
const MIN_CONTENT_WIDTH =
|
|
15
|
+
const MIN_CONTENT_WIDTH = RIGHT_ASK_PANEL.MIN_CONTENT;
|
|
15
16
|
|
|
16
17
|
import type { AcpAgentSelection } from '@/hooks/useAskModal';
|
|
17
18
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { Loader2, Plus, X } from 'lucide-react';
|
|
4
4
|
import { useEffect, useRef } from 'react';
|
|
5
|
+
import { useFocusTrap } from '@/lib/hooks/useFocusTrap';
|
|
5
6
|
|
|
6
7
|
/* ────────── Pill / Status / Search ────────── */
|
|
7
8
|
|
|
@@ -243,6 +244,9 @@ export function ConfirmDialog({
|
|
|
243
244
|
variant?: 'destructive' | 'default';
|
|
244
245
|
}) {
|
|
245
246
|
const cancelRef = useRef<HTMLButtonElement>(null);
|
|
247
|
+
const dialogRef = useRef<HTMLDivElement>(null);
|
|
248
|
+
|
|
249
|
+
useFocusTrap(dialogRef, open);
|
|
246
250
|
|
|
247
251
|
useEffect(() => {
|
|
248
252
|
if (open) cancelRef.current?.focus();
|
|
@@ -260,10 +264,10 @@ export function ConfirmDialog({
|
|
|
260
264
|
if (!open) return null;
|
|
261
265
|
|
|
262
266
|
return (
|
|
263
|
-
<div className="fixed inset-0 z-50 flex items-center justify-center" role="alertdialog" aria-modal="true" aria-
|
|
267
|
+
<div className="fixed inset-0 z-50 flex items-center justify-center" role="alertdialog" aria-modal="true" aria-labelledby="confirm-dialog-title">
|
|
264
268
|
<div className="absolute inset-0 overlay-backdrop" onClick={onCancel} aria-hidden="true" />
|
|
265
|
-
<div className="relative bg-card border border-border rounded-lg shadow-xl p-5 max-w-sm w-full mx-4 animate-in fade-in zoom-in-95 duration-200">
|
|
266
|
-
<h3 className="text-sm font-medium text-foreground mb-1.5">{title}</h3>
|
|
269
|
+
<div ref={dialogRef} className="relative bg-card border border-border rounded-lg shadow-xl p-5 max-w-sm w-full mx-4 animate-in fade-in zoom-in-95 duration-200">
|
|
270
|
+
<h3 id="confirm-dialog-title" className="text-sm font-medium text-foreground mb-1.5">{title}</h3>
|
|
267
271
|
<p className="text-sm text-muted-foreground mb-4 leading-relaxed">{message}</p>
|
|
268
272
|
<div className="flex justify-end gap-2">
|
|
269
273
|
<button
|
|
@@ -29,7 +29,7 @@ interface DropdownPos {
|
|
|
29
29
|
interface SettingsData {
|
|
30
30
|
ai?: {
|
|
31
31
|
provider?: string;
|
|
32
|
-
providers?: Record<string, { apiKey?: string; model?: string }>;
|
|
32
|
+
providers?: Record<string, { apiKey?: string; model?: string; baseUrl?: string }>;
|
|
33
33
|
};
|
|
34
34
|
envOverrides?: Record<string, boolean>;
|
|
35
35
|
}
|
|
@@ -55,7 +55,8 @@ export function persistProvider(provider: ProviderId | null): void {
|
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
57
|
* Determine which providers are configured (have an API key set via settings or env).
|
|
58
|
-
* Providers with apiKeyFallback (e.g. Ollama)
|
|
58
|
+
* Providers with apiKeyFallback (e.g. Ollama) only appear if the user has explicitly
|
|
59
|
+
* configured them — having an API key, env var, or a saved model/baseUrl entry.
|
|
59
60
|
*/
|
|
60
61
|
function getConfiguredProviders(data: SettingsData): ProviderId[] {
|
|
61
62
|
const result: ProviderId[] = [];
|
|
@@ -67,7 +68,19 @@ function getConfiguredProviders(data: SettingsData): ProviderId[] {
|
|
|
67
68
|
const hasSettingsKey = providers[id]?.apiKey === '***set***';
|
|
68
69
|
const envVar = getApiKeyEnvVar(id);
|
|
69
70
|
const hasEnvKey = envVar ? !!env[envVar] : false;
|
|
70
|
-
|
|
71
|
+
|
|
72
|
+
if (hasSettingsKey || hasEnvKey) {
|
|
73
|
+
result.push(id);
|
|
74
|
+
} else if (preset.apiKeyFallback) {
|
|
75
|
+
// Local providers (Ollama etc.): only show if user has explicitly configured
|
|
76
|
+
// them (selected as default, or saved a model/baseUrl), not just because
|
|
77
|
+
// a fallback key exists and they haven't been touched.
|
|
78
|
+
const isDefault = data.ai?.provider === id;
|
|
79
|
+
const cfg = providers[id];
|
|
80
|
+
if (isDefault || (cfg && (cfg.model || cfg.baseUrl))) {
|
|
81
|
+
result.push(id);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
71
84
|
}
|
|
72
85
|
return result;
|
|
73
86
|
}
|
|
@@ -179,6 +179,7 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
|
|
|
179
179
|
<ApiKeyInput
|
|
180
180
|
value={currentConfig.apiKey}
|
|
181
181
|
onChange={v => patchProvider(provider, { apiKey: v })}
|
|
182
|
+
labels={{ change: t.settings.ai.keyChange, cancel: t.settings.ai.keyCancel }}
|
|
182
183
|
/>
|
|
183
184
|
{preset.signupUrl && !currentConfig.apiKey && !activeEnvKey && (
|
|
184
185
|
<a
|
|
@@ -195,22 +195,103 @@ export function Toggle({ checked, onChange, size = 'md', disabled, title, onClic
|
|
|
195
195
|
);
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
-
export function ApiKeyInput({ value, onChange, placeholder, disabled }: {
|
|
198
|
+
export function ApiKeyInput({ value, onChange, placeholder, disabled, labels }: {
|
|
199
199
|
value: string;
|
|
200
200
|
onChange: (v: string) => void;
|
|
201
201
|
placeholder?: string;
|
|
202
202
|
disabled?: boolean;
|
|
203
|
+
labels?: { change?: string; cancel?: string };
|
|
203
204
|
}) {
|
|
204
205
|
const isMasked = value === '***set***';
|
|
206
|
+
const [editing, setEditing] = useState(false);
|
|
207
|
+
const [draft, setDraft] = useState('');
|
|
208
|
+
const inputRef = useRef<HTMLInputElement>(null);
|
|
209
|
+
const prevValueRef = useRef(value);
|
|
210
|
+
|
|
211
|
+
// Reset editing when the masked value identity changes (e.g. provider switch)
|
|
212
|
+
useEffect(() => {
|
|
213
|
+
if (prevValueRef.current !== value) {
|
|
214
|
+
prevValueRef.current = value;
|
|
215
|
+
setEditing(false);
|
|
216
|
+
setDraft('');
|
|
217
|
+
}
|
|
218
|
+
}, [value]);
|
|
219
|
+
|
|
220
|
+
const commitDraft = useCallback(() => {
|
|
221
|
+
if (draft.trim()) {
|
|
222
|
+
onChange(draft);
|
|
223
|
+
}
|
|
224
|
+
setEditing(false);
|
|
225
|
+
setDraft('');
|
|
226
|
+
}, [draft, onChange]);
|
|
227
|
+
|
|
228
|
+
const cancelEdit = useCallback(() => {
|
|
229
|
+
setEditing(false);
|
|
230
|
+
setDraft('');
|
|
231
|
+
}, []);
|
|
232
|
+
|
|
233
|
+
const changeLabel = labels?.change ?? 'Change';
|
|
234
|
+
const cancelLabel = labels?.cancel ?? 'Cancel';
|
|
235
|
+
|
|
236
|
+
// Masked state: show dots + "Change" button. No clearing on click.
|
|
237
|
+
if (isMasked && !editing) {
|
|
238
|
+
return (
|
|
239
|
+
<div className="flex items-center gap-2">
|
|
240
|
+
<div className="flex-1 px-3 py-2 text-sm bg-muted/50 border border-border rounded-lg text-muted-foreground select-none tracking-widest">
|
|
241
|
+
••••••••••••
|
|
242
|
+
</div>
|
|
243
|
+
<button
|
|
244
|
+
type="button"
|
|
245
|
+
onClick={() => {
|
|
246
|
+
setDraft('');
|
|
247
|
+
setEditing(true);
|
|
248
|
+
requestAnimationFrame(() => inputRef.current?.focus());
|
|
249
|
+
}}
|
|
250
|
+
disabled={disabled}
|
|
251
|
+
className="shrink-0 px-3 py-2 text-xs font-medium rounded-lg border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors disabled:opacity-50"
|
|
252
|
+
>
|
|
253
|
+
{changeLabel}
|
|
254
|
+
</button>
|
|
255
|
+
</div>
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Edit mode (replacing masked key) — uses local draft, commits on Enter/blur
|
|
260
|
+
if (editing) {
|
|
261
|
+
return (
|
|
262
|
+
<div className="flex items-center gap-2">
|
|
263
|
+
<input
|
|
264
|
+
ref={inputRef}
|
|
265
|
+
type="password"
|
|
266
|
+
value={draft}
|
|
267
|
+
onChange={e => setDraft(e.target.value)}
|
|
268
|
+
onKeyDown={e => { if (e.key === 'Enter') commitDraft(); }}
|
|
269
|
+
onBlur={commitDraft}
|
|
270
|
+
placeholder={placeholder ?? 'sk-...'}
|
|
271
|
+
disabled={disabled}
|
|
272
|
+
className="flex-1 px-3 py-2 text-sm bg-background border border-border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50"
|
|
273
|
+
/>
|
|
274
|
+
<button
|
|
275
|
+
type="button"
|
|
276
|
+
onMouseDown={e => e.preventDefault()}
|
|
277
|
+
onClick={cancelEdit}
|
|
278
|
+
className="shrink-0 px-3 py-2 text-xs font-medium rounded-lg border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors"
|
|
279
|
+
>
|
|
280
|
+
{cancelLabel}
|
|
281
|
+
</button>
|
|
282
|
+
</div>
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Normal (no masked key) — direct editing
|
|
205
287
|
return (
|
|
206
288
|
<input
|
|
207
289
|
type="password"
|
|
208
|
-
value={
|
|
290
|
+
value={value}
|
|
209
291
|
onChange={e => onChange(e.target.value)}
|
|
210
292
|
placeholder={placeholder ?? 'sk-...'}
|
|
211
293
|
disabled={disabled}
|
|
212
294
|
className="w-full px-3 py-2 text-sm bg-background border border-border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50"
|
|
213
|
-
onFocus={() => { if (isMasked) onChange(''); }}
|
|
214
295
|
/>
|
|
215
296
|
);
|
|
216
297
|
}
|
|
@@ -40,7 +40,9 @@ export async function register() {
|
|
|
40
40
|
try {
|
|
41
41
|
const projRoot = process.env.MINDOS_PROJECT_ROOT || resolve(process.cwd(), '..');
|
|
42
42
|
const skillCheckModule = resolve(projRoot, 'bin', 'lib', 'skill-check.js');
|
|
43
|
-
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
44
|
+
const dynamicRequireSkill = new Function('id', 'return require(id)') as (id: string) => any;
|
|
45
|
+
const { checkSkillVersions, updateSkill } = dynamicRequireSkill(skillCheckModule);
|
|
44
46
|
const mismatches = checkSkillVersions(projRoot);
|
|
45
47
|
for (const m of mismatches) {
|
|
46
48
|
try {
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized animation configuration.
|
|
3
|
+
* Three-tier system for consistent animation timings across the app.
|
|
4
|
+
* All durations in milliseconds, <= 300ms per WCAG/a11y standards.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Animation duration tiers */
|
|
8
|
+
export const ANIMATION = {
|
|
9
|
+
// Micro: Quick feedback, hover/focus states
|
|
10
|
+
MICRO: 100, // Button hover, icon transitions, quick visual feedback
|
|
11
|
+
|
|
12
|
+
// Short: Interactive transitions, small content changes
|
|
13
|
+
SHORT: 200, // Slide/fade modals, popovers, panel opens, dropdowns, quick state changes
|
|
14
|
+
|
|
15
|
+
// Medium: Larger content transitions, drawing attention
|
|
16
|
+
MEDIUM: 300, // Long panel slides, collapse/expand grids, significant layout changes
|
|
17
|
+
|
|
18
|
+
// Fast-exit: When closing/dismissing (slightly faster)
|
|
19
|
+
FAST_EXIT: 150,
|
|
20
|
+
} as const;
|
|
21
|
+
|
|
22
|
+
/** Easing functions (using Tailwind defaults) */
|
|
23
|
+
export const EASING = {
|
|
24
|
+
// Use for enter/appear animations (slow start, fast end)
|
|
25
|
+
EASE_OUT: 'cubic-bezier(0, 0, 0.2, 1)',
|
|
26
|
+
|
|
27
|
+
// Use for exit/disappear animations (fast start, slow end)
|
|
28
|
+
EASE_IN: 'cubic-bezier(0.4, 0, 1, 1)',
|
|
29
|
+
|
|
30
|
+
// Use for continuous/reversible animations (uniform acceleration/deceleration)
|
|
31
|
+
EASE_IN_OUT: 'cubic-bezier(0.4, 0, 0.2, 1)',
|
|
32
|
+
} as const;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Helper to build transition string
|
|
36
|
+
* @example
|
|
37
|
+
* buildTransition('all') // 'all 200ms cubic-bezier(...)'
|
|
38
|
+
* buildTransition('opacity', { duration: ANIMATION.MICRO, easing: EASING.EASE_IN_OUT })
|
|
39
|
+
*/
|
|
40
|
+
export function buildTransition(
|
|
41
|
+
property: string = 'all',
|
|
42
|
+
options?: {
|
|
43
|
+
duration?: number;
|
|
44
|
+
easing?: string;
|
|
45
|
+
delay?: number;
|
|
46
|
+
}
|
|
47
|
+
) {
|
|
48
|
+
const duration = options?.duration ?? ANIMATION.SHORT;
|
|
49
|
+
const easing = options?.easing ?? EASING.EASE_IN_OUT;
|
|
50
|
+
const delay = options?.delay ?? 0;
|
|
51
|
+
|
|
52
|
+
const delayStr = delay > 0 ? ` ${delay}ms` : '';
|
|
53
|
+
return `${property} ${duration}ms ${easing}${delayStr}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Usage guide:
|
|
58
|
+
*
|
|
59
|
+
* ### Hover/Focus (MICRO)
|
|
60
|
+
* className="transition duration-100 ease-out hover:bg-muted"
|
|
61
|
+
*
|
|
62
|
+
* ### Modal/Panel Open (SHORT with EASE_OUT)
|
|
63
|
+
* className="animate-in fade-in-0 zoom-in-95 duration-200 ease-out"
|
|
64
|
+
*
|
|
65
|
+
* ### Collapse/Expand Grid (MEDIUM with EASE_IN_OUT)
|
|
66
|
+
* style={{
|
|
67
|
+
* transition: buildTransition('grid-template-rows', {
|
|
68
|
+
* duration: ANIMATION.MEDIUM,
|
|
69
|
+
* easing: EASING.EASE_IN_OUT
|
|
70
|
+
* })
|
|
71
|
+
* }}
|
|
72
|
+
*
|
|
73
|
+
* ### Sidebar Slide (SHORT with EASE_OUT for enter, EASE_IN for exit)
|
|
74
|
+
* // Sidebar appears: transition duration-200 ease-out
|
|
75
|
+
* // Sidebar closes: transition duration-150 ease-in
|
|
76
|
+
*/
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized icon size scale.
|
|
3
|
+
* Replaces arbitrary sizes (10/12/13/14/15/16/18/20px) with a named scale.
|
|
4
|
+
* Usage: import { ICON_SIZES } from '@/lib/config/icon-scale'
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const ICON_SIZES = {
|
|
8
|
+
xs: 10, // Tiny: breadcrumb items, status dots, inline badges
|
|
9
|
+
sm: 12, // Small: form field icons, list item decorators
|
|
10
|
+
md: 14, // Medium: button icons, sidebar items, file tree (DEFAULT)
|
|
11
|
+
lg: 16, // Large: main action buttons, panel headers
|
|
12
|
+
xl: 18, // XL: hero icons, large buttons, empty states
|
|
13
|
+
xxl: 20, // XXL: large empty state icons, prominent UI
|
|
14
|
+
xxxl: 24, // XXXL: section headers, splash screens
|
|
15
|
+
} as const;
|
|
16
|
+
|
|
17
|
+
export type IconSize = keyof typeof ICON_SIZES;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Helper: Get pixel value by size name
|
|
21
|
+
* @param size - Size key, e.g., 'md', 'lg'
|
|
22
|
+
* @returns Pixel value, e.g., 14
|
|
23
|
+
*/
|
|
24
|
+
export function getIconSize(size: IconSize): number {
|
|
25
|
+
return ICON_SIZES[size];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Most common sizes in the codebase:
|
|
30
|
+
* - md (14px): 60% of icons → FileTree, buttons, lists, sidebars
|
|
31
|
+
* - lg (16px): 20% of icons → Headers, main actions
|
|
32
|
+
* - sm (12px): 10% of icons → Inline, compact
|
|
33
|
+
* - xs (10px): 8% of icons → Badges, tiny status
|
|
34
|
+
* - xl+ (18-24px): 2% of icons → Empty states, highlights
|
|
35
|
+
*/
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized panel width configuration.
|
|
3
|
+
* All panel sizing constants in one place for easy maintenance.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { PanelId } from '@/components/ActivityBar';
|
|
7
|
+
|
|
8
|
+
// ── Left Panel (Files/Search/Agents/Echo/Discover) ──
|
|
9
|
+
|
|
10
|
+
export const DEFAULT_LEFT_PANEL_WIDTH: Record<PanelId, number> = {
|
|
11
|
+
files: 280,
|
|
12
|
+
search: 320,
|
|
13
|
+
echo: 340,
|
|
14
|
+
agents: 300,
|
|
15
|
+
discover: 300,
|
|
16
|
+
workflows: 320,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const LEFT_PANEL: { DEFAULT: number; MIN: number; MAX_RATIO: number; MAX_ABS: number } = {
|
|
20
|
+
DEFAULT: 280,
|
|
21
|
+
MIN: 240,
|
|
22
|
+
MAX_RATIO: 0.45, // 45% of screen width
|
|
23
|
+
MAX_ABS: 600, // Absolute pixel max
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// ── Right Ask Panel ──
|
|
27
|
+
|
|
28
|
+
export const RIGHT_ASK_PANEL: { DEFAULT: number; MIN: number; MAX_ABS: number; MIN_CONTENT: number } = {
|
|
29
|
+
DEFAULT: 420,
|
|
30
|
+
MIN: 400,
|
|
31
|
+
MAX_ABS: 4000, // Unlikely but safe upper bound
|
|
32
|
+
MIN_CONTENT: 360, // Minimum content width when panel is resized
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// ── Right Agent Detail Panel ──
|
|
36
|
+
|
|
37
|
+
export const RIGHT_AGENT_DETAIL_PANEL: { DEFAULT: number; MIN: number; MAX_ABS: number; MAX_RATIO: number } = {
|
|
38
|
+
DEFAULT: 400,
|
|
39
|
+
MIN: 300,
|
|
40
|
+
MAX_ABS: 640,
|
|
41
|
+
MAX_RATIO: 0.42, // 42% of screen width
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// ── Mobile/Responsive Breakpoints ──
|
|
45
|
+
|
|
46
|
+
export const RESPONSIVE_BREAKPOINTS = {
|
|
47
|
+
mobile: 375,
|
|
48
|
+
tablet: 768,
|
|
49
|
+
desktop: 1024,
|
|
50
|
+
wide: 1440,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// ── Activity Bar ──
|
|
54
|
+
|
|
55
|
+
export const ACTIVITY_BAR = {
|
|
56
|
+
WIDTH_COLLAPSED: 48,
|
|
57
|
+
WIDTH_EXPANDED: 180,
|
|
58
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Focus trap hook: keeps Tab navigation within a dialog/modal.
|
|
7
|
+
* Wraps focus from last focusable element back to first, and vice versa.
|
|
8
|
+
*/
|
|
9
|
+
export function useFocusTrap(ref: React.RefObject<HTMLElement | null>, enabled = true) {
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (!enabled || !ref.current) return;
|
|
12
|
+
|
|
13
|
+
const handleKeyDown = (e: KeyboardEvent) => {
|
|
14
|
+
if (e.key !== 'Tab') return;
|
|
15
|
+
|
|
16
|
+
const focusableElements = ref.current?.querySelectorAll(
|
|
17
|
+
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
18
|
+
) as NodeListOf<HTMLElement>;
|
|
19
|
+
|
|
20
|
+
if (!focusableElements || focusableElements.length === 0) return;
|
|
21
|
+
|
|
22
|
+
const firstElement = focusableElements[0];
|
|
23
|
+
const lastElement = focusableElements[focusableElements.length - 1];
|
|
24
|
+
const activeElement = document.activeElement;
|
|
25
|
+
|
|
26
|
+
if (e.shiftKey) {
|
|
27
|
+
// Shift+Tab on first element -> focus last
|
|
28
|
+
if (activeElement === firstElement) {
|
|
29
|
+
e.preventDefault();
|
|
30
|
+
lastElement.focus();
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
// Tab on last element -> focus first
|
|
34
|
+
if (activeElement === lastElement) {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
firstElement.focus();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const container = ref.current;
|
|
42
|
+
container.addEventListener('keydown', handleKeyDown);
|
|
43
|
+
return () => container.removeEventListener('keydown', handleKeyDown);
|
|
44
|
+
}, [ref, enabled]);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Return focus hook: saves reference to trigger element and restores focus on unmount
|
|
49
|
+
*/
|
|
50
|
+
export function useReturnFocus() {
|
|
51
|
+
const triggerRef = useRef<HTMLElement | null>(null);
|
|
52
|
+
|
|
53
|
+
const saveTrigger = (el: HTMLElement | null) => {
|
|
54
|
+
triggerRef.current = el;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
return () => {
|
|
59
|
+
// Return focus on unmount
|
|
60
|
+
triggerRef.current?.focus();
|
|
61
|
+
};
|
|
62
|
+
}, []);
|
|
63
|
+
|
|
64
|
+
return saveTrigger;
|
|
65
|
+
}
|