@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
package/app/app/api/ask/route.ts
CHANGED
|
@@ -26,7 +26,8 @@ import { AGENT_SYSTEM_PROMPT, ORGANIZE_SYSTEM_PROMPT, CHAT_SYSTEM_PROMPT } from
|
|
|
26
26
|
import type { AskModeApi } from '@/lib/types';
|
|
27
27
|
import { toAgentMessages } from '@/lib/agent/to-agent-messages';
|
|
28
28
|
import { logAgentOp } from '@/lib/agent/log';
|
|
29
|
-
import { readSettings } from '@/lib/settings';
|
|
29
|
+
import { readSettings, readBaseUrlCompat, writeBaseUrlCompat } from '@/lib/settings';
|
|
30
|
+
import { en as i18nEn, zh as i18nZh } from '@/lib/i18n';
|
|
30
31
|
import { MindOSError, apiError, ErrorCodes } from '@/lib/errors';
|
|
31
32
|
import { metrics } from '@/lib/metrics';
|
|
32
33
|
import { assertNotProtected } from '@/lib/core';
|
|
@@ -400,6 +401,134 @@ function toPiCustomToolDefinitions(tools: AgentTool<any>[]): ToolDefinition<any,
|
|
|
400
401
|
}));
|
|
401
402
|
}
|
|
402
403
|
|
|
404
|
+
// ---------------------------------------------------------------------------
|
|
405
|
+
// Non-streaming fallback for proxies that don't support stream + tools
|
|
406
|
+
// ---------------------------------------------------------------------------
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Mini agent loop using non-streaming OpenAI-compatible API.
|
|
410
|
+
* Used when a proxy silently breaks stream+tools by returning plain text.
|
|
411
|
+
* Emits SSE events identical to the streaming path so the frontend is unaffected.
|
|
412
|
+
*/
|
|
413
|
+
async function runNonStreamingFallback(opts: {
|
|
414
|
+
baseUrl: string;
|
|
415
|
+
apiKey: string;
|
|
416
|
+
model: string;
|
|
417
|
+
systemPrompt: string;
|
|
418
|
+
historyMessages: { role: string; content: unknown }[];
|
|
419
|
+
userContent: string;
|
|
420
|
+
tools: AgentTool<any>[];
|
|
421
|
+
send: (event: MindOSSSEvent) => void;
|
|
422
|
+
signal: AbortSignal;
|
|
423
|
+
maxSteps: number;
|
|
424
|
+
}): Promise<void> {
|
|
425
|
+
const { baseUrl, apiKey, model, systemPrompt, historyMessages, userContent, tools, send, signal, maxSteps } = opts;
|
|
426
|
+
|
|
427
|
+
const openaiTools = tools.map(t => ({
|
|
428
|
+
type: 'function' as const,
|
|
429
|
+
function: {
|
|
430
|
+
name: t.name,
|
|
431
|
+
description: t.description ?? '',
|
|
432
|
+
parameters: (t as any).parameters ?? { type: 'object', properties: {} },
|
|
433
|
+
},
|
|
434
|
+
}));
|
|
435
|
+
|
|
436
|
+
const messages: { role: string; content: unknown; tool_calls?: unknown; tool_call_id?: string }[] = [
|
|
437
|
+
{ role: 'system', content: systemPrompt },
|
|
438
|
+
...historyMessages,
|
|
439
|
+
{ role: 'user', content: userContent },
|
|
440
|
+
];
|
|
441
|
+
|
|
442
|
+
const toolMap = new Map(tools.map(t => [t.name, t]));
|
|
443
|
+
const endpoint = `${baseUrl.replace(/\/$/, '')}/chat/completions`;
|
|
444
|
+
let step = 0;
|
|
445
|
+
|
|
446
|
+
while (step < maxSteps) {
|
|
447
|
+
if (signal.aborted) throw new Error('Request aborted');
|
|
448
|
+
step++;
|
|
449
|
+
|
|
450
|
+
const resp = await fetch(endpoint, {
|
|
451
|
+
method: 'POST',
|
|
452
|
+
headers: {
|
|
453
|
+
'Content-Type': 'application/json',
|
|
454
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
455
|
+
},
|
|
456
|
+
body: JSON.stringify({
|
|
457
|
+
model,
|
|
458
|
+
messages,
|
|
459
|
+
tools: openaiTools.length > 0 ? openaiTools : undefined,
|
|
460
|
+
tool_choice: openaiTools.length > 0 ? 'auto' : undefined,
|
|
461
|
+
stream: false,
|
|
462
|
+
}),
|
|
463
|
+
signal,
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
if (!resp.ok) {
|
|
467
|
+
const errText = await resp.text().catch(() => '');
|
|
468
|
+
throw new Error(`Non-streaming API error ${resp.status}: ${errText.slice(0, 200)}`);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
const data = await resp.json() as any;
|
|
472
|
+
const choice = data?.choices?.[0];
|
|
473
|
+
if (!choice) throw new Error('Empty response from API');
|
|
474
|
+
|
|
475
|
+
const msg = choice.message;
|
|
476
|
+
const finishReason: string = choice.finish_reason ?? 'stop';
|
|
477
|
+
|
|
478
|
+
// Emit text content in chunks to simulate streaming appearance
|
|
479
|
+
if (msg.content) {
|
|
480
|
+
const text: string = typeof msg.content === 'string' ? msg.content : '';
|
|
481
|
+
if (text) {
|
|
482
|
+
const chunkSize = 40;
|
|
483
|
+
for (let i = 0; i < text.length; i += chunkSize) {
|
|
484
|
+
send({ type: 'text_delta', delta: text.slice(i, i + chunkSize) });
|
|
485
|
+
await new Promise(r => setTimeout(r, 8));
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// No tool calls or naturally stopped → done
|
|
491
|
+
if (finishReason === 'stop' || !msg.tool_calls?.length) break;
|
|
492
|
+
|
|
493
|
+
// Execute each tool call
|
|
494
|
+
const toolResultMessages: { role: string; tool_call_id: string; content: string }[] = [];
|
|
495
|
+
for (const tc of msg.tool_calls) {
|
|
496
|
+
const toolName = tc.function?.name ?? '';
|
|
497
|
+
const toolCallId = tc.id ?? `call_${Date.now()}`;
|
|
498
|
+
let parsedArgs: Record<string, unknown> = {};
|
|
499
|
+
try { parsedArgs = JSON.parse(tc.function?.arguments ?? '{}'); } catch { /* ignore */ }
|
|
500
|
+
|
|
501
|
+
const tool = toolMap.get(toolName);
|
|
502
|
+
send({ type: 'tool_start', toolCallId, toolName, args: parsedArgs });
|
|
503
|
+
|
|
504
|
+
let resultText = '';
|
|
505
|
+
let isError = false;
|
|
506
|
+
if (tool) {
|
|
507
|
+
try {
|
|
508
|
+
const result = await tool.execute(toolCallId, parsedArgs, signal);
|
|
509
|
+
resultText = result.content
|
|
510
|
+
.filter((c: any) => c.type === 'text')
|
|
511
|
+
.map((c: any) => c.text)
|
|
512
|
+
.join('\n');
|
|
513
|
+
} catch (err) {
|
|
514
|
+
resultText = err instanceof Error ? err.message : String(err);
|
|
515
|
+
isError = true;
|
|
516
|
+
}
|
|
517
|
+
} else {
|
|
518
|
+
resultText = `Tool "${toolName}" not found`;
|
|
519
|
+
isError = true;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
send({ type: 'tool_end', toolCallId, output: resultText, isError });
|
|
523
|
+
toolResultMessages.push({ role: 'tool', tool_call_id: toolCallId, content: resultText });
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Append assistant turn + tool results for next iteration
|
|
527
|
+
messages.push({ role: 'assistant', content: msg.content ?? null, tool_calls: msg.tool_calls });
|
|
528
|
+
messages.push(...toolResultMessages);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
403
532
|
// ---------------------------------------------------------------------------
|
|
404
533
|
// POST /api/ask
|
|
405
534
|
// ---------------------------------------------------------------------------
|
|
@@ -433,6 +562,10 @@ export async function POST(req: NextRequest) {
|
|
|
433
562
|
// Read agent config from settings
|
|
434
563
|
const serverSettings = readSettings();
|
|
435
564
|
const agentConfig = serverSettings.agent ?? {};
|
|
565
|
+
|
|
566
|
+
// Detect locale from Accept-Language header for i18n status messages
|
|
567
|
+
const acceptLang = req.headers.get('accept-language') ?? '';
|
|
568
|
+
const t = acceptLang.startsWith('zh') ? i18nZh.ask : i18nEn.ask;
|
|
436
569
|
const defaultMaxSteps = askMode === 'chat' ? 8 : (agentConfig.maxSteps ?? 20);
|
|
437
570
|
const stepLimit = Number.isFinite(body.maxSteps)
|
|
438
571
|
? Math.min(30, Math.max(1, Number(body.maxSteps)))
|
|
@@ -689,7 +822,7 @@ export async function POST(req: NextRequest) {
|
|
|
689
822
|
const provOverride = body.providerOverride && isProviderId(body.providerOverride)
|
|
690
823
|
? body.providerOverride as ProviderId
|
|
691
824
|
: undefined;
|
|
692
|
-
const { model, modelName, apiKey, provider } = getModelConfig({
|
|
825
|
+
const { model, modelName, apiKey, provider, baseUrl } = getModelConfig({
|
|
693
826
|
provider: provOverride,
|
|
694
827
|
hasImages: hasImages(messages),
|
|
695
828
|
});
|
|
@@ -788,6 +921,7 @@ export async function POST(req: NextRequest) {
|
|
|
788
921
|
|
|
789
922
|
let hasContent = false;
|
|
790
923
|
let lastModelError = '';
|
|
924
|
+
const effectiveBaseUrlKey = baseUrl || 'default';
|
|
791
925
|
|
|
792
926
|
session.subscribe((event: AgentEvent) => {
|
|
793
927
|
if (isTextDeltaEvent(event)) {
|
|
@@ -993,6 +1127,36 @@ export async function POST(req: NextRequest) {
|
|
|
993
1127
|
safeClose();
|
|
994
1128
|
} else {
|
|
995
1129
|
// Route to MindOS agent (existing logic)
|
|
1130
|
+
|
|
1131
|
+
// ── Proxy compatibility check ──
|
|
1132
|
+
// If this baseUrl is known to reject stream+tools, skip session.prompt() entirely
|
|
1133
|
+
// and go straight to the non-streaming fallback path.
|
|
1134
|
+
const compatCache = readBaseUrlCompat();
|
|
1135
|
+
if (compatCache[effectiveBaseUrlKey] === 'non-streaming' && baseUrl && provider === 'openai') {
|
|
1136
|
+
send({ type: 'status', message: t.proxyCompatMode });
|
|
1137
|
+
try {
|
|
1138
|
+
await runNonStreamingFallback({
|
|
1139
|
+
baseUrl,
|
|
1140
|
+
apiKey,
|
|
1141
|
+
model: modelName,
|
|
1142
|
+
systemPrompt,
|
|
1143
|
+
historyMessages: llmHistoryMessages,
|
|
1144
|
+
userContent: typeof lastUserContent === 'string' ? lastUserContent : JSON.stringify(lastUserContent),
|
|
1145
|
+
tools: requestTools,
|
|
1146
|
+
send,
|
|
1147
|
+
signal: req.signal,
|
|
1148
|
+
maxSteps: stepLimit,
|
|
1149
|
+
});
|
|
1150
|
+
metrics.recordRequest(Date.now() - requestStartTime);
|
|
1151
|
+
send({ type: 'done' });
|
|
1152
|
+
} catch (fallbackErr) {
|
|
1153
|
+
metrics.recordRequest(Date.now() - requestStartTime);
|
|
1154
|
+
send({ type: 'error', message: t.proxyCompatFailed(fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)) });
|
|
1155
|
+
}
|
|
1156
|
+
safeClose();
|
|
1157
|
+
return;
|
|
1158
|
+
}
|
|
1159
|
+
|
|
996
1160
|
// Retry with exponential backoff for transient failures (timeout, rate limit, 5xx).
|
|
997
1161
|
// Only retry if no content has been streamed yet — once the user sees partial
|
|
998
1162
|
// output, retrying would produce duplicate/garbled content.
|
|
@@ -1022,7 +1186,33 @@ export async function POST(req: NextRequest) {
|
|
|
1022
1186
|
|
|
1023
1187
|
metrics.recordRequest(Date.now() - requestStartTime);
|
|
1024
1188
|
if (!hasContent && lastModelError) {
|
|
1025
|
-
|
|
1189
|
+
// No content received — check if this looks like a proxy stream+tools incompatibility.
|
|
1190
|
+
// Only attempt fallback for OpenAI-compatible endpoints with a custom baseUrl.
|
|
1191
|
+
if (baseUrl && provider === 'openai') {
|
|
1192
|
+
send({ type: 'status', message: t.proxyCompatDetecting });
|
|
1193
|
+
try {
|
|
1194
|
+
await runNonStreamingFallback({
|
|
1195
|
+
baseUrl,
|
|
1196
|
+
apiKey,
|
|
1197
|
+
model: modelName,
|
|
1198
|
+
systemPrompt,
|
|
1199
|
+
historyMessages: llmHistoryMessages,
|
|
1200
|
+
userContent: typeof lastUserContent === 'string' ? lastUserContent : JSON.stringify(lastUserContent),
|
|
1201
|
+
tools: requestTools,
|
|
1202
|
+
send,
|
|
1203
|
+
signal: req.signal,
|
|
1204
|
+
maxSteps: stepLimit,
|
|
1205
|
+
});
|
|
1206
|
+
// Success → cache this endpoint as non-streaming so future requests skip the probe
|
|
1207
|
+
writeBaseUrlCompat(effectiveBaseUrlKey, 'non-streaming');
|
|
1208
|
+
console.log(`[ask] Proxy compat detected: ${effectiveBaseUrlKey} → non-streaming (cached)`);
|
|
1209
|
+
send({ type: 'done' });
|
|
1210
|
+
} catch (fallbackErr) {
|
|
1211
|
+
send({ type: 'error', message: t.proxyCompatAlsoFailed(fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)) });
|
|
1212
|
+
}
|
|
1213
|
+
} else {
|
|
1214
|
+
send({ type: 'error', message: lastModelError });
|
|
1215
|
+
}
|
|
1026
1216
|
} else {
|
|
1027
1217
|
send({ type: 'done' });
|
|
1028
1218
|
}
|
|
@@ -3,31 +3,36 @@ import { NextResponse } from 'next/server';
|
|
|
3
3
|
import { spawn } from 'node:child_process';
|
|
4
4
|
import { resolve } from 'node:path';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Strip ALL MINDOS_ and MIND_ prefixed env vars so the restart child
|
|
8
|
+
* process re-derives paths from its own installation root.
|
|
9
|
+
* Preserves old port values via MINDOS_OLD_ for cleanup.
|
|
10
|
+
*/
|
|
11
|
+
function cleanEnvForRestart(): { env: NodeJS.ProcessEnv; oldWebPort?: string; oldMcpPort?: string } {
|
|
12
|
+
const cleaned = { ...process.env };
|
|
13
|
+
const oldWebPort = cleaned.MINDOS_WEB_PORT;
|
|
14
|
+
const oldMcpPort = cleaned.MINDOS_MCP_PORT;
|
|
15
|
+
for (const key of Object.keys(cleaned)) {
|
|
16
|
+
if (key.startsWith('MINDOS_') || key.startsWith('MIND_')) {
|
|
17
|
+
delete cleaned[key];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
delete cleaned.AUTH_TOKEN;
|
|
21
|
+
delete cleaned.WEB_PASSWORD;
|
|
22
|
+
delete cleaned.NODE_OPTIONS;
|
|
23
|
+
// Pass old ports so restart command can clean up stale listeners
|
|
24
|
+
if (oldWebPort) cleaned.MINDOS_OLD_WEB_PORT = oldWebPort;
|
|
25
|
+
if (oldMcpPort) cleaned.MINDOS_OLD_MCP_PORT = oldMcpPort;
|
|
26
|
+
return { env: cleaned, oldWebPort, oldMcpPort };
|
|
27
|
+
}
|
|
28
|
+
|
|
6
29
|
export async function POST() {
|
|
7
30
|
try {
|
|
31
|
+
// Resolve CLI path BEFORE cleaning env (we still need current vars)
|
|
8
32
|
const cliPath = process.env.MINDOS_CLI_PATH || resolve(process.env.MINDOS_PROJECT_ROOT || process.cwd(), '..', 'bin', 'cli.js');
|
|
9
33
|
const nodeBin = process.env.MINDOS_NODE_BIN || process.execPath;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
// its MCP child are still holding the ports.
|
|
13
|
-
//
|
|
14
|
-
// IMPORTANT: Strip MINDOS_* env vars so the child's loadConfig() reads
|
|
15
|
-
// the *updated* config file instead of inheriting stale values from this
|
|
16
|
-
// process. Without this, changing ports in the GUI has no effect on the
|
|
17
|
-
// restarted server — it would start on the old ports.
|
|
18
|
-
//
|
|
19
|
-
// Pass the current (old) ports via MINDOS_OLD_* so the restart command
|
|
20
|
-
// can clean up processes still listening on the previous ports.
|
|
21
|
-
const childEnv = { ...process.env };
|
|
22
|
-
const oldWebPort = childEnv.MINDOS_WEB_PORT;
|
|
23
|
-
const oldMcpPort = childEnv.MINDOS_MCP_PORT;
|
|
24
|
-
delete childEnv.MINDOS_WEB_PORT;
|
|
25
|
-
delete childEnv.MINDOS_MCP_PORT;
|
|
26
|
-
delete childEnv.MIND_ROOT;
|
|
27
|
-
delete childEnv.AUTH_TOKEN;
|
|
28
|
-
delete childEnv.WEB_PASSWORD;
|
|
29
|
-
if (oldWebPort) childEnv.MINDOS_OLD_WEB_PORT = oldWebPort;
|
|
30
|
-
if (oldMcpPort) childEnv.MINDOS_OLD_MCP_PORT = oldMcpPort;
|
|
34
|
+
|
|
35
|
+
const { env: childEnv } = cleanEnvForRestart();
|
|
31
36
|
const child = spawn(nodeBin, [cliPath, 'restart'], {
|
|
32
37
|
detached: true,
|
|
33
38
|
stdio: 'ignore',
|
|
@@ -3,25 +3,39 @@ import { NextResponse } from 'next/server';
|
|
|
3
3
|
import { spawn } from 'node:child_process';
|
|
4
4
|
import { resolve } from 'node:path';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Strip ALL MINDOS_ and MIND_ prefixed env vars so the update child
|
|
8
|
+
* process re-derives paths from its own installation root after npm install.
|
|
9
|
+
* This prevents the "fake update" bug where the new process inherits
|
|
10
|
+
* stale MINDOS_PROJECT_ROOT / MINDOS_CLI_PATH pointing to old code.
|
|
11
|
+
*/
|
|
12
|
+
function cleanEnvForUpdate(): NodeJS.ProcessEnv {
|
|
13
|
+
const cleaned = { ...process.env };
|
|
14
|
+
for (const key of Object.keys(cleaned)) {
|
|
15
|
+
if (key.startsWith('MINDOS_') || key.startsWith('MIND_')) {
|
|
16
|
+
delete cleaned[key];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
delete cleaned.AUTH_TOKEN;
|
|
20
|
+
delete cleaned.WEB_PASSWORD;
|
|
21
|
+
delete cleaned.NODE_OPTIONS;
|
|
22
|
+
return cleaned;
|
|
23
|
+
}
|
|
24
|
+
|
|
6
25
|
/**
|
|
7
26
|
* POST /api/update — trigger `mindos update` as a detached child process.
|
|
8
27
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
28
|
+
* Spawns the CLI command and returns immediately. The update process will
|
|
29
|
+
* npm install, remove build stamp, and restart the server.
|
|
30
|
+
* The current process will be killed during restart.
|
|
12
31
|
*/
|
|
13
32
|
export async function POST() {
|
|
14
33
|
try {
|
|
34
|
+
// Resolve CLI path BEFORE cleaning env (we still need current vars)
|
|
15
35
|
const cliPath = process.env.MINDOS_CLI_PATH || resolve(process.env.MINDOS_PROJECT_ROOT || process.cwd(), '..', 'bin', 'cli.js');
|
|
16
36
|
const nodeBin = process.env.MINDOS_NODE_BIN || process.execPath;
|
|
17
37
|
|
|
18
|
-
|
|
19
|
-
const childEnv = { ...process.env };
|
|
20
|
-
delete childEnv.MINDOS_WEB_PORT;
|
|
21
|
-
delete childEnv.MINDOS_MCP_PORT;
|
|
22
|
-
delete childEnv.MIND_ROOT;
|
|
23
|
-
delete childEnv.AUTH_TOKEN;
|
|
24
|
-
delete childEnv.WEB_PASSWORD;
|
|
38
|
+
const childEnv = cleanEnvForUpdate();
|
|
25
39
|
|
|
26
40
|
const child = spawn(nodeBin, [cliPath, 'update'], {
|
|
27
41
|
detached: true,
|
package/app/app/globals.css
CHANGED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Home page skeleton — shown while server components load.
|
|
3
|
+
* Matches the HomeContent layout: hero → spaces grid → recent files.
|
|
4
|
+
*/
|
|
5
|
+
export default function Loading() {
|
|
6
|
+
return (
|
|
7
|
+
<div className="content-width px-4 md:px-6 py-10 md:py-14 animate-pulse" aria-busy="true" aria-label="Loading">
|
|
8
|
+
{/* Hero skeleton */}
|
|
9
|
+
<div className="mb-10">
|
|
10
|
+
<div className="flex items-center gap-3 mb-2">
|
|
11
|
+
<div className="w-1 h-7 rounded-full bg-muted" />
|
|
12
|
+
<div className="h-6 w-28 bg-muted rounded" />
|
|
13
|
+
</div>
|
|
14
|
+
<div className="h-4 w-64 bg-muted rounded ml-4 mb-6" />
|
|
15
|
+
|
|
16
|
+
{/* Command bar skeleton */}
|
|
17
|
+
<div className="w-full max-w-xl flex flex-col sm:flex-row items-stretch sm:items-center gap-2 ml-4">
|
|
18
|
+
<div className="flex-1 h-12 rounded-xl bg-muted" />
|
|
19
|
+
<div className="h-12 w-16 rounded-xl bg-muted shrink-0" />
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
{/* Quick actions skeleton */}
|
|
23
|
+
<div className="flex items-center gap-3 mt-4 ml-4">
|
|
24
|
+
<div className="h-9 w-28 rounded-lg bg-muted" />
|
|
25
|
+
<div className="h-9 w-40 rounded-lg bg-muted" />
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
{/* Spaces grid skeleton */}
|
|
30
|
+
<div className="mb-10">
|
|
31
|
+
<div className="flex items-center gap-2 mb-4">
|
|
32
|
+
<div className="w-4 h-4 rounded bg-muted" />
|
|
33
|
+
<div className="h-4 w-16 bg-muted rounded" />
|
|
34
|
+
</div>
|
|
35
|
+
<div className="grid grid-cols-2 sm:grid-cols-3 gap-2">
|
|
36
|
+
{Array.from({ length: 6 }).map((_, i) => (
|
|
37
|
+
<div key={i} className="flex items-start gap-3 px-3.5 py-3 rounded-xl border border-border">
|
|
38
|
+
<div className="w-5 h-5 rounded bg-muted shrink-0 mt-0.5" />
|
|
39
|
+
<div className="flex-1 space-y-1.5">
|
|
40
|
+
<div className="h-4 w-20 bg-muted rounded" />
|
|
41
|
+
<div className="h-3 w-full bg-muted rounded" />
|
|
42
|
+
<div className="h-3 w-12 bg-muted rounded" />
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
))}
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
{/* Recent files skeleton */}
|
|
50
|
+
<div className="mb-10">
|
|
51
|
+
<div className="flex items-center gap-2 mb-4">
|
|
52
|
+
<div className="w-4 h-4 rounded bg-muted" />
|
|
53
|
+
<div className="h-4 w-24 bg-muted rounded" />
|
|
54
|
+
</div>
|
|
55
|
+
<div className="flex flex-col gap-3">
|
|
56
|
+
{Array.from({ length: 3 }).map((_, i) => (
|
|
57
|
+
<div key={i}>
|
|
58
|
+
<div className="flex items-center gap-2 px-1 py-1.5">
|
|
59
|
+
<div className="w-4 h-4 rounded bg-muted" />
|
|
60
|
+
<div className="h-3 w-24 bg-muted rounded" />
|
|
61
|
+
</div>
|
|
62
|
+
<div className="flex flex-col gap-0.5 ml-2 border-l border-border/40 pl-3">
|
|
63
|
+
{Array.from({ length: 2 }).map((_, j) => (
|
|
64
|
+
<div key={j} className="flex items-center gap-3 px-3 py-2">
|
|
65
|
+
<div className="w-3 h-3 rounded bg-muted shrink-0" />
|
|
66
|
+
<div className="flex-1 space-y-1">
|
|
67
|
+
<div className="h-4 w-40 bg-muted rounded" />
|
|
68
|
+
<div className="h-3 w-24 bg-muted rounded" />
|
|
69
|
+
</div>
|
|
70
|
+
<div className="h-3 w-12 bg-muted rounded shrink-0" />
|
|
71
|
+
</div>
|
|
72
|
+
))}
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
))}
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
@@ -1,14 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File viewer skeleton — shown while file content loads.
|
|
3
|
+
* Matches the prose layout with heading + paragraph blocks.
|
|
4
|
+
*/
|
|
1
5
|
export default function Loading() {
|
|
2
6
|
return (
|
|
3
|
-
<div className="
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
<div className="content-width px-4 md:px-6 py-10 md:py-14 animate-pulse" aria-busy="true" aria-label="Loading">
|
|
8
|
+
{/* Title skeleton */}
|
|
9
|
+
<div className="h-8 w-64 bg-muted rounded mb-3" />
|
|
10
|
+
<div className="h-px w-full bg-border mb-8" />
|
|
11
|
+
|
|
12
|
+
{/* Paragraph skeletons */}
|
|
13
|
+
<div className="space-y-6">
|
|
14
|
+
{Array.from({ length: 4 }).map((_, i) => (
|
|
15
|
+
<div key={i} className="space-y-2">
|
|
16
|
+
{i % 2 === 0 && <div className="h-5 w-40 bg-muted rounded mb-3" />}
|
|
17
|
+
<div className="h-3.5 w-full bg-muted rounded" />
|
|
18
|
+
<div className="h-3.5 w-full bg-muted rounded" />
|
|
19
|
+
<div className="h-3.5 w-3/4 bg-muted rounded" />
|
|
20
|
+
</div>
|
|
21
|
+
))}
|
|
22
|
+
|
|
23
|
+
{/* Code block skeleton */}
|
|
24
|
+
<div className="rounded-lg border border-border p-4 space-y-2">
|
|
25
|
+
<div className="h-3 w-48 bg-muted rounded" />
|
|
26
|
+
<div className="h-3 w-64 bg-muted rounded" />
|
|
27
|
+
<div className="h-3 w-36 bg-muted rounded" />
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
{/* More paragraphs */}
|
|
31
|
+
<div className="space-y-2">
|
|
32
|
+
<div className="h-3.5 w-full bg-muted rounded" />
|
|
33
|
+
<div className="h-3.5 w-5/6 bg-muted rounded" />
|
|
34
|
+
</div>
|
|
12
35
|
</div>
|
|
13
36
|
</div>
|
|
14
37
|
);
|
|
@@ -48,7 +48,7 @@ function RailButton({ icon, label, shortcut, active = false, expanded, onClick,
|
|
|
48
48
|
onClick={onClick}
|
|
49
49
|
aria-pressed={active}
|
|
50
50
|
aria-label={label}
|
|
51
|
-
title={
|
|
51
|
+
title={shortcut ? `${label} (${shortcut})` : label}
|
|
52
52
|
data-walkthrough={walkthroughId}
|
|
53
53
|
className={`
|
|
54
54
|
relative flex items-center ${expanded ? 'justify-start px-3 w-full' : 'justify-center w-10'} h-10 rounded-md transition-colors
|
|
@@ -22,16 +22,16 @@ export default function AskFab({ onToggle, askPanelOpen }: AskFabProps) {
|
|
|
22
22
|
fixed z-40 bottom-5 right-5
|
|
23
23
|
items-center justify-center
|
|
24
24
|
gap-0 hover:gap-2
|
|
25
|
-
p-
|
|
25
|
+
p-3 rounded-xl
|
|
26
26
|
text-white font-medium text-[13px]
|
|
27
|
-
shadow-
|
|
27
|
+
shadow-sm shadow-amber-900/10
|
|
28
28
|
transition-all duration-200 ease-out
|
|
29
|
-
hover:shadow-
|
|
29
|
+
hover:shadow-md hover:shadow-amber-900/15
|
|
30
30
|
active:scale-95 cursor-pointer overflow-hidden font-display
|
|
31
31
|
${askPanelOpen ? 'opacity-0 pointer-events-none translate-y-2' : 'opacity-100 translate-y-0'}
|
|
32
32
|
`}
|
|
33
33
|
style={{
|
|
34
|
-
background: '
|
|
34
|
+
background: 'var(--amber)',
|
|
35
35
|
}}
|
|
36
36
|
title={label}
|
|
37
37
|
aria-label={label}
|
|
@@ -104,13 +104,16 @@ export default function ExportModal({ open, onClose, filePath, isDirectory, file
|
|
|
104
104
|
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 backdrop-blur-sm" onClick={state === 'exporting' ? undefined : handleClose}>
|
|
105
105
|
<div
|
|
106
106
|
className="bg-card border border-border rounded-xl shadow-xl max-w-md w-full mx-4 animate-in fade-in-0 zoom-in-95 duration-200"
|
|
107
|
+
role="dialog"
|
|
108
|
+
aria-modal="true"
|
|
109
|
+
aria-labelledby="export-modal-title"
|
|
107
110
|
onClick={e => e.stopPropagation()}
|
|
108
111
|
>
|
|
109
112
|
{/* Header */}
|
|
110
113
|
<div className="flex items-center justify-between px-5 py-4 border-b border-border">
|
|
111
114
|
<div className="flex items-center gap-2">
|
|
112
115
|
<Download size={15} className="text-[var(--amber)]" />
|
|
113
|
-
<h3 className="text-sm font-semibold font-display">
|
|
116
|
+
<h3 id="export-modal-title" className="text-sm font-semibold font-display">
|
|
114
117
|
{isDirectory ? (t.export?.exportSpace ?? 'Export Space') : (t.export?.exportFile ?? 'Export File')}
|
|
115
118
|
</h3>
|
|
116
119
|
</div>
|
|
@@ -4,6 +4,7 @@ import { useState, useCallback, useRef, useTransition, useEffect, useSyncExterna
|
|
|
4
4
|
import { useRouter, usePathname } from 'next/navigation';
|
|
5
5
|
import { FileNode, SYSTEM_FILES, UNDELETABLE_FILES } from '@/lib/types';
|
|
6
6
|
import { encodePath } from '@/lib/utils';
|
|
7
|
+
import { ICON_SIZES } from '@/lib/config/icon-scale';
|
|
7
8
|
import {
|
|
8
9
|
ChevronDown, FileText, Table, Folder, FolderOpen, Plus, Loader2,
|
|
9
10
|
Trash2, Pencil, Layers, ScrollText, FolderInput, Copy, MoreHorizontal, Star, Inbox,
|
|
@@ -61,8 +62,8 @@ interface FileTreeProps {
|
|
|
61
62
|
|
|
62
63
|
function getIcon(node: FileNode) {
|
|
63
64
|
if (node.type === 'directory') return null;
|
|
64
|
-
if (node.extension === '.csv') return <Table size={
|
|
65
|
-
return <FileText size={
|
|
65
|
+
if (node.extension === '.csv') return <Table size={ICON_SIZES.md} className="text-success shrink-0" />;
|
|
66
|
+
return <FileText size={ICON_SIZES.md} className="text-muted-foreground shrink-0" />;
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
function getCurrentFilePath(pathname: string): string {
|
|
@@ -428,9 +429,10 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
|
|
|
428
429
|
className="shrink-0 p-1 rounded hover:bg-muted text-muted-foreground transition-colors"
|
|
429
430
|
style={{ marginLeft: `${depth * 12 + 4}px` }}
|
|
430
431
|
aria-label={open ? `Collapse ${node.name}` : `Expand ${node.name}`}
|
|
432
|
+
aria-expanded={open}
|
|
431
433
|
>
|
|
432
434
|
<span className="block transition-transform duration-150" style={{ transform: open ? 'rotate(0deg)' : 'rotate(-90deg)' }}>
|
|
433
|
-
<ChevronDown size={
|
|
435
|
+
<ChevronDown size={ICON_SIZES.xs} />
|
|
434
436
|
</span>
|
|
435
437
|
</button>
|
|
436
438
|
<button
|
|
@@ -446,7 +448,7 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
|
|
|
446
448
|
className={`
|
|
447
449
|
flex-1 flex items-center gap-1.5 px-1 py-1 rounded text-left min-w-0 pr-16
|
|
448
450
|
text-sm transition-colors duration-100
|
|
449
|
-
hover:bg-muted
|
|
451
|
+
hover:bg-muted cursor-text
|
|
450
452
|
${isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'}
|
|
451
453
|
`}
|
|
452
454
|
>
|
|
@@ -459,6 +461,9 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
|
|
|
459
461
|
: <Folder size={14} className="text-yellow-400 shrink-0" />
|
|
460
462
|
}
|
|
461
463
|
<span className="truncate leading-5" suppressHydrationWarning>{node.name}</span>
|
|
464
|
+
<span className="ml-auto text-xs text-muted-foreground/30 group-hover/dir:text-muted-foreground/60 transition-colors shrink-0 hidden group-hover/dir:inline-flex items-center gap-1">
|
|
465
|
+
<Pencil size={10} />
|
|
466
|
+
</span>
|
|
462
467
|
{isSpace && !open && (
|
|
463
468
|
<span className="ml-auto text-xs text-muted-foreground shrink-0 tabular-nums pr-1">{contentCount}</span>
|
|
464
469
|
)}
|
|
@@ -659,7 +664,7 @@ function FileNodeItem({ node, depth, currentPath, onNavigate }: {
|
|
|
659
664
|
data-filepath={node.path}
|
|
660
665
|
className={`
|
|
661
666
|
w-full flex items-center gap-1.5 px-2 py-1 rounded text-left
|
|
662
|
-
text-sm transition-colors duration-100 cursor-
|
|
667
|
+
text-sm transition-colors duration-100 cursor-text pr-16
|
|
663
668
|
${isActive
|
|
664
669
|
? 'bg-accent text-foreground'
|
|
665
670
|
: 'hover:bg-muted text-muted-foreground hover:text-foreground'
|
|
@@ -669,6 +674,9 @@ function FileNodeItem({ node, depth, currentPath, onNavigate }: {
|
|
|
669
674
|
>
|
|
670
675
|
{getIcon(node)}
|
|
671
676
|
<span className="truncate leading-5" suppressHydrationWarning>{node.name}</span>
|
|
677
|
+
<span className="ml-auto text-xs text-muted-foreground/30 group-hover/file:text-muted-foreground/60 transition-colors shrink-0 hidden group-hover/file:inline-flex items-center gap-1">
|
|
678
|
+
<Pencil size={10} />
|
|
679
|
+
</span>
|
|
672
680
|
{pinned && <Star size={10} className="shrink-0 fill-[var(--amber)] text-[var(--amber)] opacity-60" />}
|
|
673
681
|
</button>
|
|
674
682
|
<div className="absolute right-1 top-1/2 -translate-y-1/2 hidden group-hover/file:flex items-center gap-0.5">
|