@geminilight/mindos 0.6.51 → 0.6.53
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 +16 -16
- 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 +45 -17
- 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.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.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.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 +16 -16
- package/_standalone/.next/server/chunks/2190.js +1 -1
- package/_standalone/.next/server/chunks/{1975.js → 3436.js} +3 -3
- package/_standalone/.next/server/chunks/4241.js +1 -219
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/8388.js +1 -1
- 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-17786066ecd6f216.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-e5d2fb384207d821.js} +21 -21
- package/_standalone/.next/static/chunks/app/loading-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/page-54edd045d3448df5.js +7 -0
- package/_standalone/.next/static/chunks/app/setup/page-99f40e9337388cda.js +1 -0
- package/_standalone/.next/static/chunks/app/trash/page-6372bb3f5463affa.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-f3d1d87190dcfe28.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/components/walkthrough/WalkthroughOverlay.tsx +39 -10
- 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/stores/walkthrough-store.ts +33 -1
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/api/ask/route.ts +193 -3
- package/app/app/api/restart/route.ts +26 -21
- package/app/app/api/update/route.ts +24 -10
- 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/components/walkthrough/WalkthroughOverlay.tsx +39 -10
- package/app/instrumentation.ts +3 -1
- package/app/lib/agent/model.ts +2 -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/ai-chat.ts +8 -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/app/lib/settings.ts +32 -0
- package/app/lib/stores/walkthrough-store.ts +33 -1
- package/bin/commands/update.js +23 -11
- package/bin/lib/clean-env.js +38 -0
- package/bin/lib/gateway.js +41 -4
- package/bin/lib/stop.js +40 -4
- package/package.json +1 -1
- 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/lib/i18n/generated/explore-i18n.generated.ts +0 -138
- package/_standalone/lib/i18n/index.ts +0 -38
- package/_standalone/lib/i18n/modules/ai-chat.ts +0 -237
- package/_standalone/lib/i18n/modules/common.ts +0 -71
- package/_standalone/lib/i18n/modules/features.ts +0 -153
- package/_standalone/lib/i18n/modules/knowledge.ts +0 -719
- package/_standalone/lib/i18n/modules/navigation.ts +0 -157
- package/_standalone/lib/i18n/modules/onboarding.ts +0 -445
- package/_standalone/lib/i18n/modules/panels.ts +0 -1255
- package/_standalone/lib/i18n/modules/settings.ts +0 -885
- package/_standalone/lib/i18n.ts +0 -3
- /package/_standalone/.next/static/{Oo3NOv4X7Res4OjfuRdIF → W-wLgvhPtPJ5Psq9V4i3M}/_buildManifest.js +0 -0
- /package/_standalone/.next/static/{Oo3NOv4X7Res4OjfuRdIF → W-wLgvhPtPJ5Psq9V4i3M}/_ssgManifest.js +0 -0
|
@@ -123,7 +123,7 @@ function FileRow({ filePath, mtime, formatTime, subPath }: {
|
|
|
123
123
|
return (
|
|
124
124
|
<Link
|
|
125
125
|
href={`/view/${encodePath(filePath)}`}
|
|
126
|
-
className="flex items-center gap-3 px-3 py-2 rounded-lg transition-all duration-100 hover:translate-x-0.5 hover:bg-muted group"
|
|
126
|
+
className="flex items-center gap-3 px-3 py-2 rounded-lg transition-all duration-100 hover:translate-x-0.5 hover:bg-muted group overflow-hidden"
|
|
127
127
|
>
|
|
128
128
|
{isCSV
|
|
129
129
|
? <Table size={12} className="shrink-0 text-success" />
|
|
@@ -200,7 +200,7 @@ export default function HomeContent({ recent, existingFiles, spaces }: { recent:
|
|
|
200
200
|
data-walkthrough="ask-button"
|
|
201
201
|
className="flex-1 flex items-center gap-3 px-4 py-3 rounded-xl border border-border/60 shadow-sm bg-card transition-all duration-150 hover:border-[var(--amber)]/50 hover:shadow-md group"
|
|
202
202
|
>
|
|
203
|
-
<Sparkles size={
|
|
203
|
+
<Sparkles size={16} className="shrink-0 text-[var(--amber)] group-hover:scale-110 transition-transform duration-150" />
|
|
204
204
|
<div className="flex-1 min-h-[1.5rem] flex items-center">
|
|
205
205
|
<span
|
|
206
206
|
key={suggestionIdx}
|
|
@@ -219,7 +219,7 @@ export default function HomeContent({ recent, existingFiles, spaces }: { recent:
|
|
|
219
219
|
className="flex items-center gap-2 px-3.5 py-3 rounded-xl border border-border/60 text-sm text-muted-foreground transition-all duration-150 shrink-0 hover:bg-muted hover:shadow-sm"
|
|
220
220
|
>
|
|
221
221
|
<Search size={14} />
|
|
222
|
-
<kbd className="hidden sm:inline-flex items-center px-1.5 py-0.5 rounded text-
|
|
222
|
+
<kbd className="hidden sm:inline-flex items-center px-1.5 py-0.5 rounded text-xs font-mono bg-muted">
|
|
223
223
|
⌘K
|
|
224
224
|
</kbd>
|
|
225
225
|
</button>
|
|
@@ -264,7 +264,7 @@ export default function HomeContent({ recent, existingFiles, spaces }: { recent:
|
|
|
264
264
|
{(spaceList.length > 0 || true) && (
|
|
265
265
|
<section className="mb-10">
|
|
266
266
|
<SectionTitle
|
|
267
|
-
icon={<Brain size={
|
|
267
|
+
icon={<Brain size={14} />}
|
|
268
268
|
count={spaceList.length > 0 ? spaceList.length : undefined}
|
|
269
269
|
action={<CreateSpaceButton t={t} />}
|
|
270
270
|
>
|
|
@@ -330,7 +330,7 @@ export default function HomeContent({ recent, existingFiles, spaces }: { recent:
|
|
|
330
330
|
{recent.length > 0 && (
|
|
331
331
|
<section className="mb-10">
|
|
332
332
|
<SectionTitle
|
|
333
|
-
icon={<Clock size={
|
|
333
|
+
icon={<Clock size={14} />}
|
|
334
334
|
count={recent.length}
|
|
335
335
|
action={
|
|
336
336
|
<Link
|
|
@@ -356,7 +356,7 @@ export default function HomeContent({ recent, existingFiles, spaces }: { recent:
|
|
|
356
356
|
href={`/view/${encodePath(group.spacePath)}`}
|
|
357
357
|
className="flex items-center gap-2 px-1 py-1.5 rounded-lg group transition-colors hover:bg-muted/50"
|
|
358
358
|
>
|
|
359
|
-
<Folder size={
|
|
359
|
+
<Folder size={14} className="shrink-0 text-[var(--amber)]" />
|
|
360
360
|
<span className="text-xs font-semibold font-display text-foreground group-hover:text-[var(--amber)] transition-colors" suppressHydrationWarning>
|
|
361
361
|
{group.space}
|
|
362
362
|
</span>
|
|
@@ -387,7 +387,7 @@ export default function HomeContent({ recent, existingFiles, spaces }: { recent:
|
|
|
387
387
|
{rootFiles.length > 0 && (
|
|
388
388
|
<div>
|
|
389
389
|
<div className="flex items-center gap-2 px-1 py-1.5">
|
|
390
|
-
<FileText size={
|
|
390
|
+
<FileText size={14} className="shrink-0 text-muted-foreground/50" />
|
|
391
391
|
<span className="text-xs font-semibold font-display text-muted-foreground/60">
|
|
392
392
|
{t.home.other}
|
|
393
393
|
</span>
|
|
@@ -430,7 +430,7 @@ export default function HomeContent({ recent, existingFiles, spaces }: { recent:
|
|
|
430
430
|
/>
|
|
431
431
|
<Link
|
|
432
432
|
href={`/view/${encodePath(filePath)}`}
|
|
433
|
-
className="flex items-center gap-3 px-3 py-2 rounded-lg transition-all duration-100 group-hover:translate-x-0.5 hover:bg-muted"
|
|
433
|
+
className="flex items-center gap-3 px-3 py-2 rounded-lg transition-all duration-100 group-hover:translate-x-0.5 hover:bg-muted overflow-hidden"
|
|
434
434
|
>
|
|
435
435
|
{isCSV
|
|
436
436
|
? <Table size={12} className="shrink-0 text-success" />
|
|
@@ -476,11 +476,28 @@ function PinnedFilesSection({ formatTime }: { formatTime: (t: number) => string
|
|
|
476
476
|
const { t } = useLocale();
|
|
477
477
|
const { pinnedFiles, removePin } = usePinnedFiles();
|
|
478
478
|
|
|
479
|
-
if (pinnedFiles.length === 0)
|
|
479
|
+
if (pinnedFiles.length === 0) {
|
|
480
|
+
return (
|
|
481
|
+
<section className="mb-12">
|
|
482
|
+
<SectionTitle icon={<Star size={14} />}>
|
|
483
|
+
{t.pinnedFiles.title}
|
|
484
|
+
</SectionTitle>
|
|
485
|
+
<div className="py-6 px-4 rounded-lg border border-dashed border-border/50 text-center">
|
|
486
|
+
<Star size={20} className="mx-auto mb-2 text-muted-foreground/40" />
|
|
487
|
+
<p className="text-sm font-medium text-muted-foreground mb-1">
|
|
488
|
+
{t.pinnedFiles.empty ?? 'No pinned files'}
|
|
489
|
+
</p>
|
|
490
|
+
<p className="text-xs text-muted-foreground/60">
|
|
491
|
+
{t.pinnedFiles.emptyHint ?? 'Click the star icon on any file to pin it here'}
|
|
492
|
+
</p>
|
|
493
|
+
</div>
|
|
494
|
+
</section>
|
|
495
|
+
);
|
|
496
|
+
}
|
|
480
497
|
|
|
481
498
|
return (
|
|
482
499
|
<section className="mb-12">
|
|
483
|
-
<SectionTitle icon={<Star size={
|
|
500
|
+
<SectionTitle icon={<Star size={14} />} count={pinnedFiles.length}>
|
|
484
501
|
{t.pinnedFiles.title}
|
|
485
502
|
</SectionTitle>
|
|
486
503
|
<div className="flex flex-col gap-0.5">
|
|
@@ -492,7 +509,7 @@ function PinnedFilesSection({ formatTime }: { formatTime: (t: number) => string
|
|
|
492
509
|
<div key={filePath} className="group/pin relative">
|
|
493
510
|
<Link
|
|
494
511
|
href={`/view/${encodePath(filePath)}`}
|
|
495
|
-
className="flex items-center gap-3 px-3 py-2 rounded-lg transition-all duration-100 hover:translate-x-0.5 hover:bg-muted"
|
|
512
|
+
className="flex items-center gap-3 px-3 py-2 rounded-lg transition-all duration-100 hover:translate-x-0.5 hover:bg-muted overflow-hidden"
|
|
496
513
|
>
|
|
497
514
|
<Star size={12} className="shrink-0 fill-[var(--amber)] text-[var(--amber)]" />
|
|
498
515
|
{isCSV
|
|
@@ -581,7 +598,7 @@ function ExampleCleanupBanner() {
|
|
|
581
598
|
disabled={cleaning}
|
|
582
599
|
className="flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors shrink-0 disabled:opacity-50 bg-[var(--amber-dim)] text-[var(--amber-text)] hover:opacity-80"
|
|
583
600
|
>
|
|
584
|
-
{cleaning ? <Loader2 size={
|
|
601
|
+
{cleaning ? <Loader2 size={12} className="animate-spin" /> : <Trash2 size={12} />}
|
|
585
602
|
{t.home.cleanupExamplesButton}
|
|
586
603
|
</button>
|
|
587
604
|
<button
|
package/app/components/Panel.tsx
CHANGED
|
@@ -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
|
|
|
@@ -45,7 +45,7 @@ export default function TrashPageClient({ initialItems }: { initialItems: TrashM
|
|
|
45
45
|
} else if (result.conflict) {
|
|
46
46
|
setConflictItem(item);
|
|
47
47
|
} else {
|
|
48
|
-
toast.error(result.error ??
|
|
48
|
+
toast.error(result.error ?? t.trash.restoreFailed);
|
|
49
49
|
}
|
|
50
50
|
} finally {
|
|
51
51
|
setBusyId(null);
|
|
@@ -61,7 +61,7 @@ export default function TrashPageClient({ initialItems }: { initialItems: TrashM
|
|
|
61
61
|
setConflictItem(null);
|
|
62
62
|
router.refresh();
|
|
63
63
|
} else {
|
|
64
|
-
toast.error(result.error ??
|
|
64
|
+
toast.error(result.error ?? t.trash.restoreFailed);
|
|
65
65
|
}
|
|
66
66
|
}, [conflictItem, t, router]);
|
|
67
67
|
|
|
@@ -72,7 +72,7 @@ export default function TrashPageClient({ initialItems }: { initialItems: TrashM
|
|
|
72
72
|
setItems(prev => prev.filter(i => i.id !== confirmDelete.id));
|
|
73
73
|
toast.success(t.trash.deleted);
|
|
74
74
|
} else {
|
|
75
|
-
toast.error(result.error ??
|
|
75
|
+
toast.error(result.error ?? t.trash.deleteFailed);
|
|
76
76
|
}
|
|
77
77
|
setConfirmDelete(null);
|
|
78
78
|
}, [confirmDelete, t]);
|
|
@@ -84,7 +84,7 @@ export default function TrashPageClient({ initialItems }: { initialItems: TrashM
|
|
|
84
84
|
setItems([]);
|
|
85
85
|
toast.success(t.trash.emptied(result.count ?? 0));
|
|
86
86
|
} else {
|
|
87
|
-
toast.error(result.error ??
|
|
87
|
+
toast.error(result.error ?? t.trash.emptyFailed);
|
|
88
88
|
}
|
|
89
89
|
setConfirmEmpty(false);
|
|
90
90
|
});
|
|
@@ -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
|
}
|
|
@@ -16,7 +16,7 @@ export default function Toaster() {
|
|
|
16
16
|
if (toasts.length === 0) return null;
|
|
17
17
|
|
|
18
18
|
return (
|
|
19
|
-
<div className="fixed bottom-4 right-4 z-50 flex flex-col-reverse gap-2 pointer-events-none" aria-live="polite">
|
|
19
|
+
<div className="fixed bottom-4 right-4 z-50 flex flex-col-reverse gap-2 pointer-events-none" role="status" aria-live="polite" aria-atomic="false">
|
|
20
20
|
{toasts.map((t) => (
|
|
21
21
|
<div
|
|
22
22
|
key={t.id}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useEffect, useCallback, useId } from 'react';
|
|
4
4
|
import { useLocale } from '@/lib/stores/locale-store';
|
|
5
|
-
import { useWalkthrough } from '@/lib/stores/walkthrough-store';
|
|
5
|
+
import { useWalkthrough, useWalkthroughStore } from '@/lib/stores/walkthrough-store';
|
|
6
6
|
import { walkthroughSteps } from './steps';
|
|
7
7
|
import WalkthroughTooltip from './WalkthroughTooltip';
|
|
8
8
|
|
|
@@ -68,16 +68,31 @@ export default function WalkthroughOverlay() {
|
|
|
68
68
|
return () => window.removeEventListener('keydown', handler, true);
|
|
69
69
|
}, [skipFn]);
|
|
70
70
|
|
|
71
|
-
// If target element doesn't exist (e.g.
|
|
71
|
+
// If target element doesn't exist (e.g. panel not enabled), auto-skip
|
|
72
|
+
// after a grace period. Use stable store ref to avoid re-triggering on
|
|
73
|
+
// every store change (which caused spurious skips during step transitions).
|
|
74
|
+
const currentStep = wt?.currentStep ?? 0;
|
|
72
75
|
useEffect(() => {
|
|
73
76
|
if (!step) return;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
// Wait 500ms for DOM to settle (sidebar animations, lazy rendering)
|
|
78
|
+
const timer = setTimeout(() => {
|
|
79
|
+
const el = document.querySelector(`[data-walkthrough="${step.anchor}"]`);
|
|
80
|
+
if (!el) {
|
|
81
|
+
useWalkthroughStore.getState().next();
|
|
82
|
+
}
|
|
83
|
+
}, 500);
|
|
84
|
+
return () => clearTimeout(timer);
|
|
85
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
86
|
+
}, [currentStep]); // Only re-run when step index changes, not on every store update
|
|
87
|
+
|
|
88
|
+
// Safety timeout: if overlay stays for 60s without user interaction, auto-dismiss.
|
|
89
|
+
// Prevents permanently stuck overlay from any unforeseen edge case.
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
const timer = setTimeout(() => {
|
|
92
|
+
useWalkthroughStore.getState().skip();
|
|
93
|
+
}, 60_000);
|
|
94
|
+
return () => clearTimeout(timer);
|
|
95
|
+
}, [currentStep]); // Reset on each step change
|
|
81
96
|
|
|
82
97
|
if (!wt || !step) return null;
|
|
83
98
|
|
|
@@ -138,7 +153,7 @@ export default function WalkthroughOverlay() {
|
|
|
138
153
|
/>
|
|
139
154
|
</svg>
|
|
140
155
|
|
|
141
|
-
{/* Tooltip */}
|
|
156
|
+
{/* Tooltip — shown when target element found */}
|
|
142
157
|
{targetRect && (
|
|
143
158
|
<WalkthroughTooltip
|
|
144
159
|
stepIndex={wt.currentStep}
|
|
@@ -146,6 +161,20 @@ export default function WalkthroughOverlay() {
|
|
|
146
161
|
position={step.position}
|
|
147
162
|
/>
|
|
148
163
|
)}
|
|
164
|
+
|
|
165
|
+
{/* Fallback dismiss button — shown when target element NOT found.
|
|
166
|
+
Without this, user sees dark overlay but no visible UI to dismiss it. */}
|
|
167
|
+
{!targetRect && (
|
|
168
|
+
<div className="fixed inset-0 z-[101] flex items-center justify-center pointer-events-none">
|
|
169
|
+
<button
|
|
170
|
+
onClick={wt.skip}
|
|
171
|
+
className="pointer-events-auto px-4 py-2 text-sm rounded-lg font-medium transition-all hover:opacity-90"
|
|
172
|
+
style={{ background: 'var(--amber)', color: 'var(--amber-foreground)' }}
|
|
173
|
+
>
|
|
174
|
+
{wt.currentStep === wt.totalSteps - 1 ? '✓' : '→'}
|
|
175
|
+
</button>
|
|
176
|
+
</div>
|
|
177
|
+
)}
|
|
149
178
|
</>
|
|
150
179
|
);
|
|
151
180
|
}
|
package/app/instrumentation.ts
CHANGED
|
@@ -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 {
|
package/app/lib/agent/model.ts
CHANGED
|
@@ -32,6 +32,7 @@ export function getModelConfig(options?: ModelConfigOverrides): {
|
|
|
32
32
|
modelName: string;
|
|
33
33
|
apiKey: string;
|
|
34
34
|
provider: ProviderId;
|
|
35
|
+
baseUrl: string;
|
|
35
36
|
} {
|
|
36
37
|
const saved = effectiveAiConfig(options?.provider);
|
|
37
38
|
|
|
@@ -49,7 +50,7 @@ export function getModelConfig(options?: ModelConfigOverrides): {
|
|
|
49
50
|
model = ensureVisionCapable(model);
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
return { model, modelName, apiKey: cfg.apiKey, provider: cfg.provider };
|
|
53
|
+
return { model, modelName, apiKey: cfg.apiKey, provider: cfg.provider, baseUrl: cfg.baseUrl };
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
/**
|
|
@@ -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
|
+
*/
|