@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
|
@@ -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
|
+
}
|
|
@@ -30,6 +30,10 @@ export const aiChatEn = {
|
|
|
30
30
|
errorNoResponse: 'AI returned no content. Possible causes: model does not support streaming, proxy compatibility issue, or request exceeds context limit.',
|
|
31
31
|
reconnecting: (attempt: number, max: number) => `Connection lost. Reconnecting (${attempt}/${max})...`,
|
|
32
32
|
reconnectFailed: 'Connection failed after multiple attempts.',
|
|
33
|
+
proxyCompatMode: 'Using compatibility mode (non-streaming)...',
|
|
34
|
+
proxyCompatFailed: (err: string) => `Compatibility mode failed: ${err}. Please check your Base URL, API key, and model name.`,
|
|
35
|
+
proxyCompatDetecting: 'Detecting proxy compatibility, switching to non-streaming mode...',
|
|
36
|
+
proxyCompatAlsoFailed: (err: string) => `Compatibility mode also failed: ${err}. Please check your Base URL, API key, and model name.`,
|
|
33
37
|
retry: 'Retry',
|
|
34
38
|
suggestions: [
|
|
35
39
|
'Summarize this document',
|
|
@@ -148,6 +152,10 @@ export const aiChatZh = {
|
|
|
148
152
|
errorNoResponse: 'AI 未返回有效内容。可能原因:模型不支持流式输出、中转站兼容性问题、或请求超出上下文限制。',
|
|
149
153
|
reconnecting: (attempt: number, max: number) => `连接中断,正在重连 (${attempt}/${max})...`,
|
|
150
154
|
reconnectFailed: '多次重连失败,请检查网络后重试。',
|
|
155
|
+
proxyCompatMode: '正在以兼容模式调用...',
|
|
156
|
+
proxyCompatFailed: (err: string) => `兼容模式失败:${err}。请检查 Base URL、API Key 和模型名称。`,
|
|
157
|
+
proxyCompatDetecting: '正在检测接口兼容性,切换到兼容模式重试...',
|
|
158
|
+
proxyCompatAlsoFailed: (err: string) => `兼容模式也失败了:${err}。请检查 Base URL、API Key 和模型名称。`,
|
|
151
159
|
retry: '重试',
|
|
152
160
|
suggestions: [
|
|
153
161
|
'总结这篇文档',
|
|
@@ -110,8 +110,8 @@ export const knowledgeEn = {
|
|
|
110
110
|
dropOverlay: 'Drop to save to Capture',
|
|
111
111
|
dropOverlayFormats: 'md · txt · pdf · csv · json',
|
|
112
112
|
noMindRoot: 'Please configure your knowledge base first',
|
|
113
|
-
saveFailed: 'Failed to save files',
|
|
114
|
-
organizeFailed: 'Could not read files for organizing',
|
|
113
|
+
saveFailed: 'Failed to save files. Check disk space and permissions.',
|
|
114
|
+
organizeFailed: 'Could not read files for organizing. Check file permissions.',
|
|
115
115
|
},
|
|
116
116
|
pulse: {
|
|
117
117
|
title: 'Your Agents',
|
|
@@ -162,7 +162,8 @@ export const knowledgeEn = {
|
|
|
162
162
|
title: 'Pinned Files',
|
|
163
163
|
addedToast: 'Added to Favorites',
|
|
164
164
|
removedToast: 'Removed from Favorites',
|
|
165
|
-
empty: '
|
|
165
|
+
empty: 'No pinned files',
|
|
166
|
+
emptyHint: 'Click the star icon on any file to pin it here',
|
|
166
167
|
},
|
|
167
168
|
trash: {
|
|
168
169
|
title: 'Trash',
|
|
@@ -182,6 +183,9 @@ export const knowledgeEn = {
|
|
|
182
183
|
movedToTrash: 'Deleted',
|
|
183
184
|
undo: 'Undo',
|
|
184
185
|
undoFailed: 'Undo failed',
|
|
186
|
+
restoreFailed: 'Could not restore file. Check disk space and try again.',
|
|
187
|
+
deleteFailed: 'Could not permanently delete. Please try again.',
|
|
188
|
+
emptyFailed: 'Could not empty trash. Please try again.',
|
|
185
189
|
emptied: (count: number) => `Emptied ${count} item${count !== 1 ? 's' : ''} from Trash`,
|
|
186
190
|
restoreConflict: 'A file with this name already exists at the original location.',
|
|
187
191
|
overwrite: 'Overwrite',
|
|
@@ -218,7 +222,7 @@ export const knowledgeEn = {
|
|
|
218
222
|
downloadAgain: 'Download Again',
|
|
219
223
|
fileCount: (n: number) => `${n} file${n !== 1 ? 's' : ''}`,
|
|
220
224
|
downloaded: 'Downloaded',
|
|
221
|
-
error: 'Export failed',
|
|
225
|
+
error: 'Export failed. Please check disk space and try again.',
|
|
222
226
|
retry: 'Retry',
|
|
223
227
|
},
|
|
224
228
|
fileImport: {
|
|
@@ -469,8 +473,8 @@ export const knowledgeZh = {
|
|
|
469
473
|
dropOverlay: '拖放到暂存台快速保存',
|
|
470
474
|
dropOverlayFormats: 'md · txt · pdf · csv · json',
|
|
471
475
|
noMindRoot: '请先配置知识库路径',
|
|
472
|
-
saveFailed: '
|
|
473
|
-
organizeFailed: '
|
|
476
|
+
saveFailed: '保存文件失败,请检查磁盘空间和权限。',
|
|
477
|
+
organizeFailed: '无法读取文件进行整理,请检查文件权限。',
|
|
474
478
|
},
|
|
475
479
|
pulse: {
|
|
476
480
|
title: '你的 Agent',
|
|
@@ -521,7 +525,8 @@ export const knowledgeZh = {
|
|
|
521
525
|
title: '收藏文件',
|
|
522
526
|
addedToast: '已添加到收藏',
|
|
523
527
|
removedToast: '已取消收藏',
|
|
524
|
-
empty: '
|
|
528
|
+
empty: '还没有收藏文件',
|
|
529
|
+
emptyHint: '点击任何文件上的星标图标即可收藏',
|
|
525
530
|
},
|
|
526
531
|
trash: {
|
|
527
532
|
title: '回收站',
|
|
@@ -541,6 +546,9 @@ export const knowledgeZh = {
|
|
|
541
546
|
movedToTrash: '已删除',
|
|
542
547
|
undo: '撤销',
|
|
543
548
|
undoFailed: '撤销失败',
|
|
549
|
+
restoreFailed: '无法恢复文件,请检查磁盘空间后重试。',
|
|
550
|
+
deleteFailed: '无法彻底删除,请重试。',
|
|
551
|
+
emptyFailed: '无法清空回收站,请重试。',
|
|
544
552
|
emptied: (count: number) => `已清空 ${count} 个项目`,
|
|
545
553
|
restoreConflict: '原位置已有同名文件。',
|
|
546
554
|
overwrite: '覆盖',
|
|
@@ -577,7 +585,7 @@ export const knowledgeZh = {
|
|
|
577
585
|
downloadAgain: '再次下载',
|
|
578
586
|
fileCount: (n: number) => `${n} 个文件`,
|
|
579
587
|
downloaded: '已下载',
|
|
580
|
-
error: '
|
|
588
|
+
error: '导出失败,请检查磁盘空间后重试。',
|
|
581
589
|
retry: '重试',
|
|
582
590
|
},
|
|
583
591
|
fileImport: {
|
|
@@ -11,7 +11,7 @@ export const onboardingEn = {
|
|
|
11
11
|
importHint: 'Already have notes? Set MIND_ROOT to your existing directory in Settings.',
|
|
12
12
|
syncHint: 'Want cross-device sync? Run',
|
|
13
13
|
syncHintSuffix: 'in the terminal after setup.',
|
|
14
|
-
initError: 'Initialization failed. Please try
|
|
14
|
+
initError: 'Initialization failed. Please refresh the page or try a different template.',
|
|
15
15
|
dismiss: 'Dismiss',
|
|
16
16
|
},
|
|
17
17
|
setup: {
|
|
@@ -233,7 +233,7 @@ export const onboardingZh = {
|
|
|
233
233
|
importHint: '已有笔记?在设置中将 MIND_ROOT 指向已有目录即可。',
|
|
234
234
|
syncHint: '需要跨设备同步?完成初始化后在终端运行',
|
|
235
235
|
syncHintSuffix: '即可。',
|
|
236
|
-
initError: '
|
|
236
|
+
initError: '初始化失败。请刷新页面或尝试其他模板。',
|
|
237
237
|
dismiss: '关闭',
|
|
238
238
|
},
|
|
239
239
|
setup: {
|
|
@@ -12,6 +12,8 @@ export const settingsEn = {
|
|
|
12
12
|
baseUrlHint: 'Optional. Use for proxies or custom API endpoints.',
|
|
13
13
|
keyHint: 'Stored locally in ~/.mindos/config.json',
|
|
14
14
|
keyOptionalHint: 'Optional for local providers. Stored in ~/.mindos/config.json',
|
|
15
|
+
keyChange: 'Change',
|
|
16
|
+
keyCancel: 'Cancel',
|
|
15
17
|
envHint: 'Fields marked env have a value from environment variables. You can override them here, or restore all to env defaults.',
|
|
16
18
|
envFieldNote: (key: string) => `Env var ${key} is set. Clear this field to fall back to it.`,
|
|
17
19
|
resetToEnv: 'Reset to env value',
|
|
@@ -458,6 +460,8 @@ export const settingsZh = {
|
|
|
458
460
|
envFieldNote: (key: string) => `环境变量 ${key} 已设置。清空此字段将回退到环境变量值。`,
|
|
459
461
|
resetToEnv: '恢复为环境变量',
|
|
460
462
|
restoreFromEnv: '从环境变量恢复',
|
|
463
|
+
keyChange: '更改',
|
|
464
|
+
keyCancel: '取消',
|
|
461
465
|
noApiKey: 'API 密钥未设置,AI 功能暂不可用,请在此填写。',
|
|
462
466
|
testKey: '测试',
|
|
463
467
|
testKeyTesting: '测试中...',
|
package/app/lib/settings.ts
CHANGED
|
@@ -51,6 +51,8 @@ export interface ServerSettings {
|
|
|
51
51
|
guideState?: GuideState;
|
|
52
52
|
/** Per-agent ACP overrides (command, args, env, enabled). Keyed by agent ID. */
|
|
53
53
|
acpAgents?: Record<string, import('./acp/agent-descriptors').AcpAgentOverride>;
|
|
54
|
+
/** Proxy compatibility cache: keyed by baseUrl, value is detected mode. */
|
|
55
|
+
baseUrlCompat?: Record<string, 'streaming' | 'non-streaming'>;
|
|
54
56
|
}
|
|
55
57
|
|
|
56
58
|
const DEFAULTS: ServerSettings = {
|
|
@@ -179,6 +181,15 @@ export function readSettings(): ServerSettings {
|
|
|
179
181
|
setupPending: parsed.setupPending === true ? true : undefined,
|
|
180
182
|
disabledSkills: Array.isArray(parsed.disabledSkills) ? parsed.disabledSkills as string[] : undefined,
|
|
181
183
|
guideState: parseGuideState(parsed.guideState),
|
|
184
|
+
baseUrlCompat: (() => {
|
|
185
|
+
const raw = parsed.baseUrlCompat;
|
|
186
|
+
if (!raw || typeof raw !== 'object') return undefined;
|
|
187
|
+
const result: Record<string, 'streaming' | 'non-streaming'> = {};
|
|
188
|
+
for (const [k, v] of Object.entries(raw)) {
|
|
189
|
+
if (v === 'streaming' || v === 'non-streaming') result[k] = v;
|
|
190
|
+
}
|
|
191
|
+
return Object.keys(result).length > 0 ? result : undefined;
|
|
192
|
+
})(),
|
|
182
193
|
};
|
|
183
194
|
} catch {
|
|
184
195
|
// Config file missing or corrupt → force setup wizard
|
|
@@ -206,6 +217,7 @@ export function writeSettings(settings: ServerSettings): void {
|
|
|
206
217
|
if (settings.disabledSkills !== undefined) merged.disabledSkills = settings.disabledSkills;
|
|
207
218
|
if (settings.guideState !== undefined) merged.guideState = settings.guideState;
|
|
208
219
|
if (settings.acpAgents !== undefined) merged.acpAgents = settings.acpAgents;
|
|
220
|
+
if (settings.baseUrlCompat !== undefined) merged.baseUrlCompat = settings.baseUrlCompat;
|
|
209
221
|
// setupPending: false/undefined → remove the field (cleanup); true → set it
|
|
210
222
|
if ('setupPending' in settings) {
|
|
211
223
|
if (settings.setupPending) merged.setupPending = true;
|
|
@@ -287,3 +299,23 @@ export function effectiveSopRoot(): string {
|
|
|
287
299
|
const s = readSettings();
|
|
288
300
|
return s.mindRoot || process.env.MIND_ROOT || path.join(os.homedir(), 'MindOS', 'mind');
|
|
289
301
|
}
|
|
302
|
+
|
|
303
|
+
/** Read the baseUrl → compat mode cache from config. Never throws. */
|
|
304
|
+
export function readBaseUrlCompat(): Record<string, 'streaming' | 'non-streaming'> {
|
|
305
|
+
try {
|
|
306
|
+
const s = readSettings();
|
|
307
|
+
return s.baseUrlCompat ?? {};
|
|
308
|
+
} catch {
|
|
309
|
+
return {};
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/** Persist a baseUrl compatibility detection result. Thread-safe via merge-write. */
|
|
314
|
+
export function writeBaseUrlCompat(baseUrl: string, mode: 'streaming' | 'non-streaming'): void {
|
|
315
|
+
const s = readSettings();
|
|
316
|
+
const updated: Record<string, 'streaming' | 'non-streaming'> = {
|
|
317
|
+
...(s.baseUrlCompat ?? {}),
|
|
318
|
+
[baseUrl]: mode,
|
|
319
|
+
};
|
|
320
|
+
writeSettings({ ...s, baseUrlCompat: updated });
|
|
321
|
+
}
|
|
@@ -21,7 +21,20 @@ export interface WalkthroughStoreState {
|
|
|
21
21
|
|
|
22
22
|
/* ── Helpers ── */
|
|
23
23
|
|
|
24
|
+
const LS_KEY = 'mindos_walkthrough_done';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Persist walkthrough state to server AND localStorage.
|
|
28
|
+
* localStorage acts as a safety net: even if the server persist fails
|
|
29
|
+
* (e.g. during update restart, network blip), the completion state
|
|
30
|
+
* survives page reload and prevents the "stuck overlay" bug.
|
|
31
|
+
*/
|
|
24
32
|
function persistStep(step: number, dismissed: boolean) {
|
|
33
|
+
// Local safety net — instant, survives server outage
|
|
34
|
+
if (step >= walkthroughSteps.length || dismissed) {
|
|
35
|
+
try { localStorage.setItem(LS_KEY, '1'); } catch {}
|
|
36
|
+
}
|
|
37
|
+
// Server persist — fire-and-forget (localStorage is the safety net)
|
|
25
38
|
fetch('/api/setup', {
|
|
26
39
|
method: 'PATCH',
|
|
27
40
|
headers: { 'Content-Type': 'application/json' },
|
|
@@ -31,6 +44,11 @@ function persistStep(step: number, dismissed: boolean) {
|
|
|
31
44
|
}).catch((err) => { console.warn('[walkthrough-store] persist failed:', err); });
|
|
32
45
|
}
|
|
33
46
|
|
|
47
|
+
/** Check if walkthrough was completed/dismissed (fast, sync, local) */
|
|
48
|
+
function isLocallyDone(): boolean {
|
|
49
|
+
try { return localStorage.getItem(LS_KEY) === '1'; } catch { return false; }
|
|
50
|
+
}
|
|
51
|
+
|
|
34
52
|
/* ── Store ── */
|
|
35
53
|
|
|
36
54
|
export const useWalkthroughStore = create<WalkthroughStoreState>((set, get) => {
|
|
@@ -84,12 +102,26 @@ export const useWalkthroughStore = create<WalkthroughStoreState>((set, get) => {
|
|
|
84
102
|
// Only auto-start on desktop
|
|
85
103
|
if (window.innerWidth < 768) return () => {};
|
|
86
104
|
|
|
105
|
+
// Fast local check: if walkthrough was completed/dismissed, never reactivate.
|
|
106
|
+
// This prevents the "stuck overlay" bug where server persist failed during
|
|
107
|
+
// update restart but localStorage recorded the completion.
|
|
108
|
+
if (isLocallyDone()) return () => {};
|
|
109
|
+
|
|
87
110
|
fetch('/api/setup')
|
|
88
111
|
.then(r => r.json())
|
|
89
112
|
.then(data => {
|
|
90
113
|
const gs = data.guideState;
|
|
91
114
|
if (!gs) return;
|
|
92
|
-
if (gs.walkthroughDismissed)
|
|
115
|
+
if (gs.walkthroughDismissed) {
|
|
116
|
+
try { localStorage.setItem(LS_KEY, '1'); } catch {} // sync local
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// If server says completed (step >= totalSteps), mark locally done
|
|
121
|
+
if (typeof gs.walkthroughStep === 'number' && gs.walkthroughStep >= totalSteps) {
|
|
122
|
+
try { localStorage.setItem(LS_KEY, '1'); } catch {};
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
93
125
|
|
|
94
126
|
if (gs.active && !gs.dismissed && gs.walkthroughStep === undefined) {
|
|
95
127
|
if (isWelcome) {
|
package/bin/commands/update.js
CHANGED
|
@@ -15,6 +15,7 @@ import { EXIT } from '../lib/command.js';
|
|
|
15
15
|
import { stopMindos } from '../lib/stop.js';
|
|
16
16
|
import { getLocalIP } from '../lib/startup.js';
|
|
17
17
|
import { isPortInUse } from '../lib/port.js';
|
|
18
|
+
import { cleanEnvForRestart } from '../lib/clean-env.js';
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* Dynamically resolve the new ROOT after `npm install -g`.
|
|
@@ -180,7 +181,7 @@ export const run = async () => {
|
|
|
180
181
|
const webPort = updateConfig.port ?? 3456;
|
|
181
182
|
const mcpPort = updateConfig.mcpPort ?? 8781;
|
|
182
183
|
console.log(dim(' (Waiting for Web UI to come back up — first run after update includes a rebuild...)'));
|
|
183
|
-
const ready = await gateway.waitForHttp(Number(webPort), { retries: 450, intervalMs: 2000, label: 'Web UI', logFile: LOG_PATH });
|
|
184
|
+
const ready = await gateway.waitForHttp(Number(webPort), { retries: 450, intervalMs: 2000, label: 'Web UI', logFile: LOG_PATH, expectedVersion: newVersion });
|
|
184
185
|
if (ready) {
|
|
185
186
|
const localIP = getLocalIP();
|
|
186
187
|
console.log(`\n${'─'.repeat(53)}`);
|
|
@@ -214,13 +215,29 @@ export const run = async () => {
|
|
|
214
215
|
if (wasRunning) {
|
|
215
216
|
console.log(cyan('\n MindOS is running — restarting to apply the new version...'));
|
|
216
217
|
stopMindos();
|
|
217
|
-
// Wait for ports to free (up to
|
|
218
|
-
|
|
218
|
+
// Wait for ports to free (up to 20s) with stabilization check.
|
|
219
|
+
// After first "free" reading, wait 1s and check again to avoid
|
|
220
|
+
// false negatives from TCP TIME_WAIT flickering.
|
|
221
|
+
const deadline = Date.now() + 20_000;
|
|
222
|
+
let portsFree = false;
|
|
219
223
|
while (Date.now() < deadline) {
|
|
220
224
|
const busy = await isPortInUse(webPort) || await isPortInUse(mcpPort);
|
|
221
|
-
if (!busy)
|
|
225
|
+
if (!busy) {
|
|
226
|
+
// Stabilization: wait 1s, then double-check
|
|
227
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
228
|
+
const stillFree = !(await isPortInUse(webPort)) && !(await isPortInUse(mcpPort));
|
|
229
|
+
if (stillFree) { portsFree = true; break; }
|
|
230
|
+
}
|
|
222
231
|
await new Promise((r) => setTimeout(r, 500));
|
|
223
232
|
}
|
|
233
|
+
if (!portsFree) {
|
|
234
|
+
console.log(yellow(' ⚠ Ports not fully released, force-killing remaining processes...'));
|
|
235
|
+
// Last resort: import killByPort and SIGKILL anything on these ports
|
|
236
|
+
const stopLib = await import('../lib/stop.js');
|
|
237
|
+
stopLib.killByPort(webPort);
|
|
238
|
+
stopLib.killByPort(mcpPort);
|
|
239
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
240
|
+
}
|
|
224
241
|
|
|
225
242
|
// Stage 3: Rebuild
|
|
226
243
|
writeUpdateStatus('rebuilding', vOpts);
|
|
@@ -237,12 +254,7 @@ export const run = async () => {
|
|
|
237
254
|
// (`mindos start` has its own build-on-startup logic)
|
|
238
255
|
writeUpdateStatus('restarting', vOpts);
|
|
239
256
|
const newCliPath = resolve(updatedRoot, 'bin', 'cli.js');
|
|
240
|
-
const childEnv =
|
|
241
|
-
delete childEnv.MINDOS_WEB_PORT;
|
|
242
|
-
delete childEnv.MINDOS_MCP_PORT;
|
|
243
|
-
delete childEnv.MIND_ROOT;
|
|
244
|
-
delete childEnv.AUTH_TOKEN;
|
|
245
|
-
delete childEnv.WEB_PASSWORD;
|
|
257
|
+
const childEnv = cleanEnvForRestart();
|
|
246
258
|
const child = nodeSpawn(
|
|
247
259
|
process.execPath, [newCliPath, 'start'],
|
|
248
260
|
{ detached: true, stdio: 'ignore', env: childEnv },
|
|
@@ -250,7 +262,7 @@ export const run = async () => {
|
|
|
250
262
|
child.unref();
|
|
251
263
|
|
|
252
264
|
console.log(dim(' (Waiting for Web UI to come back up...)'));
|
|
253
|
-
const ready = await gateway.waitForHttp(webPort, { retries: 180, intervalMs: 2000, label: 'Web UI', logFile: LOG_PATH });
|
|
265
|
+
const ready = await gateway.waitForHttp(webPort, { retries: 180, intervalMs: 2000, label: 'Web UI', logFile: LOG_PATH, expectedVersion: newVersion });
|
|
254
266
|
if (ready) {
|
|
255
267
|
const localIP = getLocalIP();
|
|
256
268
|
console.log(`\n${'─'.repeat(53)}`);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a clean environment for spawning a new MindOS process.
|
|
3
|
+
*
|
|
4
|
+
* During `mindos update`, the old process inherits env vars like
|
|
5
|
+
* MINDOS_PROJECT_ROOT, MINDOS_CLI_PATH etc. that point to the OLD
|
|
6
|
+
* installation path. If these leak into the child process, the "new"
|
|
7
|
+
* server starts from the old code — the infamous "fake update" bug.
|
|
8
|
+
*
|
|
9
|
+
* This helper strips ALL MINDOS_*/MIND_* prefixed variables plus
|
|
10
|
+
* a curated denylist of other vars that can cause stale-path issues.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** Env var prefixes that must be stripped for a clean restart */
|
|
14
|
+
const STRIP_PREFIXES = ['MINDOS_', 'MIND_'];
|
|
15
|
+
|
|
16
|
+
/** Additional specific vars to strip (not prefix-matched) */
|
|
17
|
+
const STRIP_EXACT = [
|
|
18
|
+
'AUTH_TOKEN',
|
|
19
|
+
'WEB_PASSWORD',
|
|
20
|
+
'NODE_OPTIONS', // may contain --inspect or old module paths
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Return a copy of `process.env` with all MindOS-related vars removed.
|
|
25
|
+
* The new child process will re-derive paths from its own ROOT constant.
|
|
26
|
+
*/
|
|
27
|
+
export function cleanEnvForRestart(baseEnv = process.env) {
|
|
28
|
+
const cleaned = { ...baseEnv };
|
|
29
|
+
for (const key of Object.keys(cleaned)) {
|
|
30
|
+
if (STRIP_PREFIXES.some(p => key.startsWith(p))) {
|
|
31
|
+
delete cleaned[key];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
for (const key of STRIP_EXACT) {
|
|
35
|
+
delete cleaned[key];
|
|
36
|
+
}
|
|
37
|
+
return cleaned;
|
|
38
|
+
}
|
package/bin/lib/gateway.js
CHANGED
|
@@ -113,13 +113,43 @@ export function parseLogHint(line) {
|
|
|
113
113
|
return null;
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
export async function waitForHttp(port, { retries = 60, intervalMs = 2000, label = 'service', logFile = null } = {}) {
|
|
116
|
+
export async function waitForHttp(port, { retries = 60, intervalMs = 2000, label = 'service', logFile = null, expectedVersion = null } = {}) {
|
|
117
117
|
const start = Date.now();
|
|
118
118
|
const elapsed = () => {
|
|
119
119
|
const s = Math.round((Date.now() - start) / 1000);
|
|
120
120
|
return s < 60 ? `${s}s` : `${Math.floor(s / 60)}m${String(s % 60).padStart(2, '0')}s`;
|
|
121
121
|
};
|
|
122
122
|
|
|
123
|
+
/**
|
|
124
|
+
* Version-aware readiness check: after health check passes, verify the
|
|
125
|
+
* server is actually running the expected version (not an orphaned old process).
|
|
126
|
+
* Prevents the "fake update" where health check hits a stale worker.
|
|
127
|
+
*/
|
|
128
|
+
async function verifyVersion(hostname) {
|
|
129
|
+
if (!expectedVersion) return true; // no version check requested
|
|
130
|
+
try {
|
|
131
|
+
const { request } = await import('node:http');
|
|
132
|
+
return new Promise((resolve) => {
|
|
133
|
+
const req = request(
|
|
134
|
+
{ hostname, port, path: '/api/update-check', method: 'GET', timeout: 5000 },
|
|
135
|
+
(res) => {
|
|
136
|
+
let body = '';
|
|
137
|
+
res.on('data', (chunk) => { body += chunk; });
|
|
138
|
+
res.on('end', () => {
|
|
139
|
+
try {
|
|
140
|
+
const data = JSON.parse(body);
|
|
141
|
+
resolve(data.current === expectedVersion);
|
|
142
|
+
} catch { resolve(false); }
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
);
|
|
146
|
+
req.on('error', () => resolve(false));
|
|
147
|
+
req.on('timeout', () => { req.destroy(); resolve(false); });
|
|
148
|
+
req.end();
|
|
149
|
+
});
|
|
150
|
+
} catch { return false; }
|
|
151
|
+
}
|
|
152
|
+
|
|
123
153
|
// Track log file position for incremental reads
|
|
124
154
|
let logOffset = 0;
|
|
125
155
|
let lastHint = 'starting…';
|
|
@@ -169,9 +199,16 @@ export async function waitForHttp(port, { retries = 60, intervalMs = 2000, label
|
|
|
169
199
|
});
|
|
170
200
|
const ok = await tryHost('127.0.0.1') || await tryHost('localhost');
|
|
171
201
|
if (ok) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
202
|
+
// If expectedVersion is set, verify the server is running the right version
|
|
203
|
+
const versionOk = await verifyVersion('127.0.0.1') || await verifyVersion('localhost');
|
|
204
|
+
if (!versionOk && expectedVersion) {
|
|
205
|
+
// Health check passed but wrong version — old process still serving
|
|
206
|
+
// Continue waiting for the new process to take over
|
|
207
|
+
} else {
|
|
208
|
+
process.stdout.write(`\r\x1b[K`);
|
|
209
|
+
process.stdout.write(` ${green('\u2714')} ${label} ready ${dim(`(${elapsed()})`)}\n`);
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
175
212
|
}
|
|
176
213
|
} catch { /* not ready yet */ }
|
|
177
214
|
|
package/bin/lib/stop.js
CHANGED
|
@@ -4,6 +4,19 @@ import { green, yellow, dim } from './colors.js';
|
|
|
4
4
|
import { loadPids, clearPids } from './pid.js';
|
|
5
5
|
import { CONFIG_PATH } from './constants.js';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Portable synchronous sleep using SharedArrayBuffer + Atomics.wait.
|
|
9
|
+
* Falls back to execSync('sleep N') on platforms without SharedArrayBuffer.
|
|
10
|
+
*/
|
|
11
|
+
function syncSleep(ms) {
|
|
12
|
+
try {
|
|
13
|
+
const sab = new SharedArrayBuffer(4);
|
|
14
|
+
Atomics.wait(new Int32Array(sab), 0, 0, ms);
|
|
15
|
+
} catch {
|
|
16
|
+
try { execSync(`sleep ${Math.ceil(ms / 1000)}`, { stdio: 'ignore' }); } catch {}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
7
20
|
/**
|
|
8
21
|
* Kill processes listening on the given port.
|
|
9
22
|
* Tries lsof first, then falls back to parsing `ss` output.
|
|
@@ -52,6 +65,19 @@ export function killByPort(port) {
|
|
|
52
65
|
for (const pid of pidsToKill) {
|
|
53
66
|
try { process.kill(pid, 'SIGTERM'); killed++; } catch {}
|
|
54
67
|
}
|
|
68
|
+
|
|
69
|
+
// SIGKILL fallback: if processes survive SIGTERM, force-kill after 2s.
|
|
70
|
+
// Next.js workers can ignore SIGTERM during request handling.
|
|
71
|
+
if (killed > 0) {
|
|
72
|
+
syncSleep(2000);
|
|
73
|
+
for (const pid of pidsToKill) {
|
|
74
|
+
try {
|
|
75
|
+
process.kill(pid, 0); // check if still alive
|
|
76
|
+
process.kill(pid, 'SIGKILL'); // force kill
|
|
77
|
+
} catch { /* already dead, good */ }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
55
81
|
return killed;
|
|
56
82
|
}
|
|
57
83
|
|
|
@@ -60,10 +86,20 @@ export function killByPort(port) {
|
|
|
60
86
|
*/
|
|
61
87
|
function killTree(pid) {
|
|
62
88
|
// Try to kill the entire process group first
|
|
63
|
-
try { process.kill(-pid, 'SIGTERM');
|
|
64
|
-
//
|
|
65
|
-
try { process.kill(pid, 'SIGTERM');
|
|
66
|
-
|
|
89
|
+
try { process.kill(-pid, 'SIGTERM'); } catch {}
|
|
90
|
+
// Also kill individual process
|
|
91
|
+
try { process.kill(pid, 'SIGTERM'); } catch {}
|
|
92
|
+
|
|
93
|
+
// Wait briefly then SIGKILL if still alive
|
|
94
|
+
syncSleep(2000);
|
|
95
|
+
|
|
96
|
+
let alive = false;
|
|
97
|
+
try { process.kill(pid, 0); alive = true; } catch {}
|
|
98
|
+
if (alive) {
|
|
99
|
+
try { process.kill(-pid, 'SIGKILL'); } catch {}
|
|
100
|
+
try { process.kill(pid, 'SIGKILL'); } catch {}
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
67
103
|
}
|
|
68
104
|
|
|
69
105
|
/**
|
package/package.json
CHANGED