@geminilight/mindos 0.6.38 → 0.6.40
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/README.md +37 -9
- package/README_zh.md +37 -9
- package/_standalone/.mindos-build-version +1 -1
- package/_standalone/.next/BUILD_ID +1 -1
- package/_standalone/.next/app-path-routes-manifest.json +21 -20
- 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 +68 -6
- package/_standalone/.next/routes-manifest.json +6 -0
- package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error.html +2 -2
- package/_standalone/.next/server/app/_global-error.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/_standalone/.next/server/app/_not-found/page.js +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.js +1 -1
- package/_standalone/.next/server/app/api/acp/config/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/detect/route.js +1 -1
- package/_standalone/.next/server/app/api/acp/detect/route.js.nft.json +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.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +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.js +1 -1
- package/_standalone/.next/server/app/api/agent-activity/route.js.nft.json +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 +133 -95
- 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 +3 -3
- 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 +2 -19
- 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 -18
- 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 -0
- package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -0
- package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -0
- 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.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install/route.js.nft.json +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.js +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/search/route.js +1 -1
- package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route.js.nft.json +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.js +1 -1
- package/_standalone/.next/server/app/api/settings/reset-token/route.js.nft.json +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.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/route.js +1 -1
- package/_standalone/.next/server/app/api/setup/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/skills/route.js +2 -2
- package/_standalone/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/sync/route.js +1 -1
- package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/tree-version/route.js +1 -1
- package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-check/route.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 +2 -2
- 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 +6 -6
- 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 +3 -3
- 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 +3 -3
- 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 +4 -4
- 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 +21 -20
- package/_standalone/.next/server/chunks/1550.js +1 -1
- package/_standalone/.next/server/chunks/1750.js +1 -0
- package/_standalone/.next/server/chunks/1955.js +11 -0
- package/_standalone/.next/server/chunks/3680.js +1 -0
- package/_standalone/.next/server/chunks/4497.js +219 -0
- package/_standalone/.next/server/chunks/5560.js +2 -0
- package/_standalone/.next/server/chunks/6365.js +52 -0
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/8388.js +15 -0
- package/_standalone/.next/server/chunks/953.js +42 -2
- package/_standalone/.next/server/functions-config-manifest.json +2 -1
- 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/next-font-manifest.js +1 -1
- package/_standalone/.next/server/next-font-manifest.json +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-0adaccc98a752a58.js +29 -0
- package/_standalone/.next/static/chunks/1239.10a0710c2772ab34.js +1 -0
- package/_standalone/.next/static/chunks/{1814.e2da5460ded71d71.js → 1814.2ee1d03297c0bccd.js} +1 -1
- package/_standalone/.next/static/chunks/{1a258343-030e4d6735874dd4.js → 1a258343-9803591e4aaee1f6.js} +1 -1
- package/_standalone/.next/static/chunks/2631.dc56e83472bde281.js +1 -0
- package/_standalone/.next/static/chunks/2872.045858d00bd8307f.js +8 -0
- package/_standalone/.next/static/chunks/2968.f10ccee9e7e2324d.js +2 -0
- package/_standalone/.next/static/chunks/3160-83a7e0b94414b3ac.js +1 -0
- package/_standalone/.next/static/chunks/{3637.4bcd01a4db78b894.js → 3637.f9a42cca59fd5bb5.js} +1 -1
- package/_standalone/.next/static/chunks/4033.6666700547b20141.js +1 -0
- package/_standalone/.next/static/chunks/4563-c2afaeacb241d1d0.js +6 -0
- package/_standalone/.next/static/chunks/516.24ee058b1d4b1fed.js +8 -0
- package/_standalone/.next/static/chunks/5627.c4337d7289acb31f.js +1 -0
- package/_standalone/.next/static/chunks/5956.b445072b35915129.js +1 -0
- package/_standalone/.next/static/chunks/6090-c98268ca726a68d3.js +1 -0
- package/_standalone/.next/static/chunks/6357-c645842834c0d4cd.js +1 -0
- package/_standalone/.next/static/chunks/6826.7b7d94dd0fd83812.js +1 -0
- package/_standalone/.next/static/chunks/{8409-de5726a4a278d28f.js → 6926-4af497b83952fa87.js} +1 -1
- package/_standalone/.next/static/chunks/7266-bb7be1128eccd48e.js +13 -0
- package/_standalone/.next/static/chunks/7753.63831cfc54a55fbb.js +1 -0
- package/_standalone/.next/static/chunks/862.9f526e964489e2e5.js +1 -0
- package/_standalone/.next/static/chunks/{1384-55276d40a9da4e88.js → 8663-de911d2d395622be.js} +2 -2
- package/_standalone/.next/static/chunks/9300.118b8c840634383f.js +28 -0
- package/_standalone/.next/static/chunks/9371-575600301da5d6bb.js +1 -0
- package/_standalone/.next/static/chunks/95247769.3b5caae1c1a76ce1.js +4 -0
- package/_standalone/.next/static/chunks/9602-423291fdb36396d1.js +1 -0
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/_global-error/page-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-3e08abb495ecd5fd.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/page-e7e0f87ad3d765ac.js +5 -0
- package/_standalone/.next/static/chunks/app/api/a2a/agents/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/changes/page-350992cf5091bc5b.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-addf014fcf23fad5.js +11 -0
- package/_standalone/.next/static/chunks/app/echo/page-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/explore/page-5eb2835e9e3ab4bb.js +4 -0
- package/_standalone/.next/static/chunks/app/help/page-3d0e1ceaa4abc243.js +1 -0
- package/_standalone/.next/static/chunks/app/layout-9378c1c8d3e5761b.js +186 -0
- package/_standalone/.next/static/chunks/app/login/page-24236460fa7c11d0.js +1 -0
- package/_standalone/.next/static/chunks/app/page-9bae420fbbdc5fff.js +7 -0
- package/_standalone/.next/static/chunks/app/setup/page-99ed3d1bb6b8f4ef.js +1 -0
- package/_standalone/.next/static/chunks/app/trash/page-b61ef2d5cd4f8d73.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/not-found-61474670d6bb6116.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/page-44fa78cbea613a78.js +12 -0
- package/_standalone/.next/static/chunks/e71f6c19-4df85185bf989b49.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-400c3c09b1540c14.js +1 -0
- package/_standalone/.next/static/chunks/webpack-c28c55d0a6021a6b.js +1 -0
- package/_standalone/.next/static/css/d300701f384db50d.css +1 -0
- package/_standalone/.next/static/rZLs1krFuduixvcVNe6q3/_buildManifest.js +1 -0
- package/_standalone/.next/trace +63 -53
- package/_standalone/.next/types/routes.d.ts +2 -1
- package/_standalone/.next/types/validator.ts +9 -0
- package/_standalone/__tests__/agent/chat-mode.test.ts +103 -0
- package/_standalone/__tests__/agents/agents-content-dashboard.test.tsx +4 -3
- package/_standalone/__tests__/api/bootstrap.test.ts +0 -2
- package/_standalone/__tests__/api/file.test.ts +22 -1
- package/_standalone/__tests__/api/install-skill.test.ts +2 -2
- package/_standalone/__tests__/api/mcp-install.test.ts +9 -10
- package/_standalone/__tests__/api/setup.test.ts +2 -2
- package/_standalone/__tests__/api/test-key.test.ts +73 -147
- package/_standalone/__tests__/ask/ask-content-input-during-run.test.tsx +1 -1
- package/_standalone/__tests__/ask/mode-capsule.test.ts +95 -0
- package/_standalone/__tests__/core/inbox.test.ts +250 -0
- package/_standalone/__tests__/core/skill-install-logic.test.ts +3 -3
- package/_standalone/__tests__/core/sync-status.test.ts +1 -1
- package/_standalone/__tests__/core/tools.test.ts +11 -6
- package/_standalone/__tests__/lib/echo-pages-visual-i18n.test.ts +2 -2
- package/_standalone/__tests__/lib/i18n-new-keys.test.ts +2 -2
- package/_standalone/__tests__/panels/agents-panel-hub.test.tsx +2 -2
- package/_standalone/__tests__/settings/activity-bar-update-badge.test.tsx +1 -1
- package/_standalone/__tests__/settings/settings-update-badge.test.tsx +1 -1
- package/_standalone/__tests__/settings/update-tab-availability-sync.test.tsx +1 -1
- package/_standalone/__tests__/settings/update-tab-browser.test.tsx +1 -1
- package/_standalone/__tests__/settings/update-tab-desktop.test.tsx +1 -1
- package/_standalone/__tests__/setup.ts +3 -5
- package/_standalone/app/globals.css +11 -1
- package/_standalone/components/ActivityBar.tsx +26 -10
- package/_standalone/components/AskFab.tsx +1 -1
- package/_standalone/components/AskModal.tsx +1 -1
- package/_standalone/components/Backlinks.tsx +1 -1
- package/_standalone/components/CreateSpaceModal.tsx +7 -55
- package/_standalone/components/EchoSpotlight.tsx +1 -1
- package/_standalone/components/ExportModal.tsx +1 -1
- package/_standalone/components/FileTree.tsx +64 -79
- package/_standalone/components/FindInPage.tsx +1 -1
- package/_standalone/components/GuideCard.tsx +1 -1
- package/_standalone/components/ImportModal.tsx +1 -1
- package/_standalone/components/KeyboardShortcuts.tsx +1 -1
- package/_standalone/components/MarkdownView.tsx +11 -1
- package/_standalone/components/OnboardingView.tsx +1 -1
- package/_standalone/components/OrganizeToast.tsx +1 -1
- package/_standalone/components/Panel.tsx +82 -4
- package/_standalone/components/QuickSuggestion.tsx +1 -1
- package/_standalone/components/RightAgentDetailPanel.tsx +2 -2
- package/_standalone/components/RightAskPanel.tsx +58 -22
- package/_standalone/components/SearchModal.tsx +1 -1
- package/_standalone/components/Sidebar.tsx +1 -1
- package/_standalone/components/SidebarLayout.tsx +52 -16
- package/_standalone/components/SpaceInitToast.tsx +1 -1
- package/_standalone/components/SyncStatusBar.tsx +2 -2
- package/_standalone/components/SystemPulse.tsx +12 -6
- package/_standalone/components/TableOfContents.tsx +86 -39
- package/_standalone/components/agents/AgentActivitySection.tsx +225 -0
- package/_standalone/components/agents/AgentsMcpSection.tsx +7 -16
- package/_standalone/components/agents/AgentsOverviewSection.tsx +28 -27
- package/_standalone/components/agents/AgentsPanelA2aTab.tsx +1 -1
- package/_standalone/components/agents/AgentsPanelSessionsTab.tsx +6 -1
- package/_standalone/components/agents/AgentsSkillsSection.tsx +1 -1
- package/_standalone/components/agents/DiscoverAgentModal.tsx +1 -1
- package/_standalone/components/agents/RecentActivityFeed.tsx +49 -88
- package/_standalone/components/agents/agent-activity-shared.tsx +110 -0
- package/_standalone/components/ask/AgentSelectorCapsule.tsx +1 -1
- package/_standalone/components/ask/AskContent.tsx +332 -486
- package/_standalone/components/ask/AskHeader.tsx +61 -0
- package/_standalone/components/ask/FileChip.tsx +9 -5
- package/_standalone/components/ask/MessageList.tsx +88 -21
- package/_standalone/components/ask/ModeCapsule.tsx +180 -0
- package/_standalone/components/ask/ProviderModelCapsule.tsx +284 -0
- package/_standalone/components/ask/SessionHistory.tsx +63 -10
- package/_standalone/components/ask/SessionTabBar.tsx +1 -1
- package/_standalone/components/ask/ThinkingBlock.tsx +1 -1
- package/_standalone/components/ask/ToolCallBlock.tsx +28 -24
- package/_standalone/components/changes/ChangesBanner.tsx +1 -1
- package/_standalone/components/echo/EchoInsightCollapsible.tsx +1 -1
- package/_standalone/components/echo/EchoSegmentNav.tsx +1 -1
- package/_standalone/components/home/InboxSection.tsx +268 -0
- package/_standalone/components/panels/AgentsPanel.tsx +3 -2
- package/_standalone/components/panels/AgentsPanelHubNav.tsx +2 -6
- package/_standalone/components/panels/DiscoverPanel.tsx +1 -1
- package/_standalone/components/panels/EchoPanel.tsx +1 -1
- package/_standalone/components/panels/EchoSidebarStats.tsx +1 -1
- package/_standalone/components/panels/ImportHistoryPanel.tsx +1 -1
- package/_standalone/components/panels/PanelHeader.tsx +1 -1
- package/_standalone/components/panels/PluginsPanel.tsx +1 -1
- package/_standalone/components/panels/SearchPanel.tsx +5 -2
- package/_standalone/components/panels/SyncPopover.tsx +1 -1
- package/_standalone/components/panels/WorkflowsPanel.tsx +1 -1
- package/_standalone/components/renderers/agent-inspector/AgentInspectorRenderer.tsx +18 -0
- package/_standalone/components/renderers/agent-inspector/manifest.ts +16 -0
- package/_standalone/components/renderers/todo/TodoRenderer.tsx +489 -75
- package/_standalone/components/settings/AiTab.tsx +198 -127
- package/_standalone/components/settings/AppearanceTab.tsx +48 -50
- package/_standalone/components/settings/KnowledgeTab.tsx +92 -27
- package/_standalone/components/settings/McpAgentInstall.tsx +1 -1
- package/_standalone/components/settings/McpSkillsSection.tsx +1 -1
- package/_standalone/components/settings/McpTab.tsx +145 -7
- package/_standalone/components/settings/PluginsTab.tsx +1 -1
- package/_standalone/components/settings/SettingsContent.tsx +5 -2
- package/_standalone/components/settings/SyncTab.tsx +615 -230
- package/_standalone/components/settings/UninstallTab.tsx +1 -1
- package/_standalone/components/settings/UpdateTab.tsx +373 -109
- package/_standalone/components/settings/types.ts +4 -5
- package/_standalone/components/setup/StepAI.tsx +70 -49
- package/_standalone/components/setup/StepDots.tsx +1 -1
- package/_standalone/components/setup/StepReview.tsx +176 -8
- package/_standalone/components/setup/types.ts +11 -8
- package/_standalone/components/shared/ProviderSelect.tsx +134 -0
- package/_standalone/components/walkthrough/WalkthroughOverlay.tsx +2 -2
- package/_standalone/components/walkthrough/WalkthroughTooltip.tsx +2 -2
- package/_standalone/components/walkthrough/index.ts +1 -1
- package/_standalone/data/skills/mindos/SKILL.md +27 -12
- package/_standalone/data/skills/mindos-zh/SKILL.md +27 -12
- package/_standalone/hooks/useAcpDetection.ts +1 -1
- package/_standalone/hooks/useAskChat.ts +248 -0
- package/_standalone/hooks/useAskPanel.ts +24 -4
- package/_standalone/hooks/useAskSession.ts +15 -0
- package/_standalone/lib/acp/types.ts +1 -1
- package/_standalone/lib/api.ts +3 -1
- package/_standalone/lib/core/types.ts +2 -0
- package/_standalone/lib/i18n/modules/ai-chat.ts +35 -13
- package/_standalone/lib/i18n/modules/features.ts +2 -2
- package/_standalone/lib/i18n/modules/knowledge.ts +82 -2
- package/_standalone/lib/i18n/modules/navigation.ts +6 -2
- package/_standalone/lib/i18n/modules/onboarding.ts +39 -9
- package/_standalone/lib/i18n/modules/panels.ts +78 -29
- package/_standalone/lib/i18n/modules/settings.ts +236 -20
- package/_standalone/lib/inbox-upload.ts +93 -0
- package/_standalone/lib/settings-ai-client.ts +13 -12
- package/_standalone/lib/space-ai-init.ts +66 -0
- package/_standalone/lib/stores/McpStoreInit.tsx +18 -0
- package/_standalone/lib/stores/WalkthroughInit.tsx +20 -0
- package/_standalone/lib/stores/locale-store.ts +55 -0
- package/_standalone/lib/stores/mcp-store.ts +156 -0
- package/_standalone/lib/stores/walkthrough-store.ts +118 -0
- package/_standalone/package-lock.json +40 -8
- package/_standalone/package.json +3 -1
- package/_standalone/tsconfig.json +1 -1
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/api/acp/detect/route.ts +29 -20
- package/app/app/api/agent-activity/route.ts +1 -1
- package/app/app/api/ask/route.ts +115 -31
- package/app/app/api/ask-sessions/route.ts +1 -0
- package/app/app/api/bootstrap/route.ts +1 -3
- package/app/app/api/file/route.ts +34 -4
- package/app/app/api/inbox/route.ts +61 -0
- package/app/app/api/settings/list-models/route.ts +73 -53
- package/app/app/api/settings/route.ts +46 -55
- package/app/app/api/settings/test-key/route.ts +57 -114
- package/app/app/api/setup/route.ts +31 -21
- package/app/app/api/sync/route.ts +122 -12
- package/app/app/api/update-check/route.ts +2 -2
- package/app/app/globals.css +11 -1
- package/app/app/layout.tsx +2 -3
- package/app/app/login/page.tsx +1 -1
- package/app/app/view/[...path]/ViewPageClient.tsx +10 -10
- package/app/app/view/[...path]/not-found.tsx +1 -1
- package/app/components/ActivityBar.tsx +26 -10
- package/app/components/AskFab.tsx +1 -1
- package/app/components/AskModal.tsx +1 -1
- package/app/components/Backlinks.tsx +1 -1
- package/app/components/CreateSpaceModal.tsx +7 -55
- package/app/components/DirView.tsx +93 -11
- package/app/components/EchoSpotlight.tsx +1 -1
- package/app/components/ExportModal.tsx +1 -1
- package/app/components/FileTree.tsx +64 -79
- package/app/components/FindInPage.tsx +1 -1
- package/app/components/GuideCard.tsx +1 -1
- package/app/components/HomeContent.tsx +21 -14
- package/app/components/ImportModal.tsx +1 -1
- package/app/components/KeyboardShortcuts.tsx +1 -1
- package/app/components/MarkdownView.tsx +11 -1
- package/app/components/OnboardingView.tsx +1 -1
- package/app/components/OrganizeToast.tsx +1 -1
- package/app/components/Panel.tsx +82 -4
- package/app/components/QuickSuggestion.tsx +1 -1
- package/app/components/RightAgentDetailPanel.tsx +2 -2
- package/app/components/RightAskPanel.tsx +58 -22
- package/app/components/SearchModal.tsx +1 -1
- package/app/components/Sidebar.tsx +1 -1
- package/app/components/SidebarLayout.tsx +52 -16
- package/app/components/SpaceInitToast.tsx +1 -1
- package/app/components/SyncStatusBar.tsx +2 -2
- package/app/components/SystemPulse.tsx +12 -6
- package/app/components/TableOfContents.tsx +86 -39
- package/app/components/TrashPageClient.tsx +1 -1
- package/app/components/UpdateOverlay.tsx +2 -2
- package/app/components/agents/AgentActivitySection.tsx +225 -0
- package/app/components/agents/AgentDetailContent.tsx +234 -3
- package/app/components/agents/AgentsContentPage.tsx +13 -2
- package/app/components/agents/AgentsMcpSection.tsx +7 -16
- package/app/components/agents/AgentsOverviewSection.tsx +28 -27
- package/app/components/agents/AgentsPanelA2aTab.tsx +1 -1
- package/app/components/agents/AgentsPanelSessionsTab.tsx +6 -1
- package/app/components/agents/AgentsSkillsSection.tsx +1 -1
- package/app/components/agents/DiscoverAgentModal.tsx +1 -1
- package/app/components/agents/RecentActivityFeed.tsx +49 -88
- package/app/components/agents/agent-activity-shared.tsx +110 -0
- package/app/components/agents/agents-content-model.ts +2 -2
- package/app/components/ask/AgentSelectorCapsule.tsx +1 -1
- package/app/components/ask/AskContent.tsx +332 -486
- package/app/components/ask/AskHeader.tsx +61 -0
- package/app/components/ask/FileChip.tsx +9 -5
- package/app/components/ask/MessageList.tsx +88 -21
- package/app/components/ask/ModeCapsule.tsx +180 -0
- package/app/components/ask/ProviderModelCapsule.tsx +284 -0
- package/app/components/ask/SessionHistory.tsx +63 -10
- package/app/components/ask/SessionTabBar.tsx +1 -1
- package/app/components/ask/ThinkingBlock.tsx +1 -1
- package/app/components/ask/ToolCallBlock.tsx +28 -24
- package/app/components/changes/ChangesBanner.tsx +1 -1
- package/app/components/changes/ChangesContentPage.tsx +1 -1
- package/app/components/echo/EchoInsightCollapsible.tsx +1 -1
- package/app/components/echo/EchoSegmentNav.tsx +1 -1
- package/app/components/echo/EchoSegmentPageClient.tsx +1 -1
- package/app/components/explore/ExploreContent.tsx +1 -1
- package/app/components/help/HelpContent.tsx +1 -1
- package/app/components/home/InboxSection.tsx +268 -0
- package/app/components/panels/AgentsPanel.tsx +3 -2
- package/app/components/panels/AgentsPanelHubNav.tsx +2 -6
- package/app/components/panels/DiscoverPanel.tsx +1 -1
- package/app/components/panels/EchoPanel.tsx +1 -1
- package/app/components/panels/EchoSidebarStats.tsx +1 -1
- package/app/components/panels/ImportHistoryPanel.tsx +1 -1
- package/app/components/panels/PanelHeader.tsx +1 -1
- package/app/components/panels/PluginsPanel.tsx +1 -1
- package/app/components/panels/SearchPanel.tsx +5 -2
- package/app/components/panels/SyncPopover.tsx +1 -1
- package/app/components/panels/WorkflowsPanel.tsx +1 -1
- package/app/components/renderers/agent-inspector/AgentInspectorRenderer.tsx +18 -0
- package/app/components/renderers/todo/TodoRenderer.tsx +489 -75
- package/app/components/settings/AiTab.tsx +198 -127
- package/app/components/settings/AppearanceTab.tsx +48 -50
- package/app/components/settings/KnowledgeTab.tsx +92 -27
- package/app/components/settings/McpAgentInstall.tsx +1 -1
- package/app/components/settings/McpSkillsSection.tsx +1 -1
- package/app/components/settings/McpTab.tsx +145 -7
- package/app/components/settings/PluginsTab.tsx +1 -1
- package/app/components/settings/SettingsContent.tsx +5 -2
- package/app/components/settings/SyncTab.tsx +615 -230
- package/app/components/settings/UninstallTab.tsx +1 -1
- package/app/components/settings/UpdateTab.tsx +373 -109
- package/app/components/settings/types.ts +4 -5
- package/app/components/setup/StepAI.tsx +70 -49
- package/app/components/setup/StepDots.tsx +1 -1
- package/app/components/setup/StepReview.tsx +176 -8
- package/app/components/setup/index.tsx +73 -39
- package/app/components/setup/types.ts +11 -8
- package/app/components/shared/ProviderSelect.tsx +134 -0
- package/app/components/walkthrough/WalkthroughOverlay.tsx +2 -2
- package/app/components/walkthrough/WalkthroughTooltip.tsx +2 -2
- package/app/components/walkthrough/index.ts +1 -1
- package/app/data/skills/mindos/SKILL.md +27 -12
- package/app/data/skills/mindos-zh/SKILL.md +27 -12
- package/app/hooks/useAcpDetection.ts +1 -1
- package/app/hooks/useAskChat.ts +248 -0
- package/app/hooks/useAskPanel.ts +24 -4
- package/app/hooks/useAskSession.ts +15 -0
- package/app/lib/acp/types.ts +1 -1
- package/app/lib/actions.ts +13 -0
- package/app/lib/agent/log.ts +2 -0
- package/app/lib/agent/model.ts +69 -81
- package/app/lib/agent/prompt.ts +27 -0
- package/app/lib/agent/providers.ts +299 -0
- package/app/lib/agent/tools.ts +26 -4
- package/app/lib/api.ts +3 -1
- package/app/lib/core/agent-audit-log.ts +7 -0
- package/app/lib/core/fs-ops.ts +9 -4
- package/app/lib/core/inbox.ts +181 -0
- package/app/lib/core/index.ts +4 -0
- package/app/lib/core/tree.ts +3 -0
- package/app/lib/core/types.ts +2 -0
- package/app/lib/fs.ts +26 -2
- package/app/lib/i18n/modules/ai-chat.ts +35 -13
- package/app/lib/i18n/modules/features.ts +2 -2
- package/app/lib/i18n/modules/knowledge.ts +82 -2
- package/app/lib/i18n/modules/navigation.ts +6 -2
- package/app/lib/i18n/modules/onboarding.ts +39 -9
- package/app/lib/i18n/modules/panels.ts +78 -29
- package/app/lib/i18n/modules/settings.ts +236 -20
- package/app/lib/inbox-upload.ts +93 -0
- package/app/lib/mcp-agents.ts +6 -7
- package/app/lib/renderers/index.ts +1 -2
- package/app/lib/settings-ai-client.ts +13 -12
- package/app/lib/settings.ts +48 -33
- package/app/lib/space-ai-init.ts +66 -0
- package/app/lib/stores/LocaleStoreInit.tsx +18 -0
- package/app/lib/stores/McpStoreInit.tsx +18 -0
- package/app/lib/stores/WalkthroughInit.tsx +20 -0
- package/app/lib/stores/locale-store.ts +55 -0
- package/app/lib/stores/mcp-store.ts +156 -0
- package/app/lib/stores/walkthrough-store.ts +118 -0
- package/app/lib/types.ts +20 -0
- package/app/package.json +3 -1
- package/app/tsconfig.json +1 -1
- package/bin/cli.js +46 -27
- package/bin/commands/file.js +7 -4
- package/bin/commands/space.js +4 -0
- package/bin/lib/mcp-agents.js +26 -2
- package/bin/lib/mcp-install.js +11 -3
- package/bin/lib/sync.js +140 -34
- package/mcp/README.md +2 -2
- package/mcp/dist/index.cjs +43 -43
- package/mcp/package.json +1 -1
- package/mcp/src/index.ts +77 -61
- package/package.json +1 -1
- package/scripts/build-runtime-archive.sh +113 -0
- package/scripts/setup.js +1 -1
- package/skills/mindos/SKILL.md +27 -12
- package/skills/mindos/references/preference-capture.md +4 -4
- package/skills/mindos/references/write-supplement.md +46 -4
- package/skills/mindos-zh/SKILL.md +27 -12
- package/skills/mindos-zh/references/preference-capture.md +4 -4
- package/skills/mindos-zh/references/write-supplement.md +47 -5
- package/templates/empty/INSTRUCTION.md +0 -1
- package/templates/en/INSTRUCTION.md +0 -1
- package/templates/template-generation-skill.md +0 -1
- package/templates/zh/INSTRUCTION.md +0 -1
- package/_standalone/.next/server/chunks/248.js +0 -15
- package/_standalone/.next/server/chunks/359.js +0 -2
- package/_standalone/.next/server/chunks/4931.js +0 -202
- package/_standalone/.next/server/chunks/7670.js +0 -1
- package/_standalone/.next/server/chunks/8407.js +0 -52
- package/_standalone/.next/server/chunks/9414.js +0 -11
- package/_standalone/.next/static/VAb8MoUUpoXjVJalRJogO/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/1038-ed04d6651ec92312.js +0 -1
- package/_standalone/.next/static/chunks/1263-79beb8734dee7bbd.js +0 -25
- package/_standalone/.next/static/chunks/275-ebcaaedabe706903.js +0 -1
- package/_standalone/.next/static/chunks/5637-b97c869adf70c82e.js +0 -1
- package/_standalone/.next/static/chunks/5681-a53362a1cd629dc6.js +0 -1
- package/_standalone/.next/static/chunks/9602-35ca17b688f1a4fe.js +0 -1
- package/_standalone/.next/static/chunks/9670-d59e4d45ed705f58.js +0 -6
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/_global-error/page-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-519d4da1142db5ef.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/page-b709cf3103321609.js +0 -5
- package/_standalone/.next/static/chunks/app/api/a2a/agents/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/changes/page-def5210095f8698d.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-be28eff31b1a186e.js +0 -11
- package/_standalone/.next/static/chunks/app/echo/page-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/explore/page-e4b8098dca200389.js +0 -4
- package/_standalone/.next/static/chunks/app/help/page-d5e57d73d94bad19.js +0 -1
- package/_standalone/.next/static/chunks/app/layout-aab90c2b4faf8d57.js +0 -173
- package/_standalone/.next/static/chunks/app/login/page-321875768b70938a.js +0 -1
- package/_standalone/.next/static/chunks/app/page-9a15cf85f0962c59.js +0 -7
- package/_standalone/.next/static/chunks/app/setup/page-01ab1f549d636057.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-7df0139c6b0f87e0.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/not-found-f22c513bbc348cc8.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-35811d7e49e08157.js +0 -12
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d4762cc48529e566.js +0 -1
- package/_standalone/.next/static/chunks/webpack-3489a2b6c2882b0c.js +0 -1
- package/_standalone/.next/static/css/f16595bc58a16d5d.css +0 -1
- package/_standalone/components/walkthrough/WalkthroughProvider.tsx +0 -133
- package/_standalone/hooks/useMcpData.tsx +0 -169
- package/_standalone/lib/i18n-en.ts +0 -2
- package/_standalone/lib/i18n-zh.ts +0 -2
- package/_standalone/lib/types.ts +0 -70
- package/app/components/walkthrough/WalkthroughProvider.tsx +0 -133
- package/app/hooks/useMcpData.tsx +0 -169
- package/app/lib/LocaleContext.tsx +0 -60
- package/app/lib/i18n-en.ts +0 -2
- package/app/lib/i18n-zh.ts +0 -2
- /package/_standalone/.next/static/{VAb8MoUUpoXjVJalRJogO → rZLs1krFuduixvcVNe6q3}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
4
|
-
import { AlertCircle, ChevronDown, Loader2, Sparkles, Bot, Monitor } from 'lucide-react';
|
|
3
|
+
import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
|
|
4
|
+
import { AlertCircle, ChevronDown, Loader2, Sparkles, Bot, Monitor, ExternalLink } from 'lucide-react';
|
|
5
5
|
import type { AiSettings, AgentSettings, ProviderConfig, SettingsData, AiTabProps } from './types';
|
|
6
6
|
import { Field, Select, Input, EnvBadge, ApiKeyInput, Toggle, SettingCard, SettingRow } from './Primitives';
|
|
7
|
-
import { useLocale } from '@/lib/
|
|
7
|
+
import { useLocale } from '@/lib/stores/locale-store';
|
|
8
|
+
import { type ProviderId, PROVIDER_PRESETS, isProviderId, getApiKeyEnvVar, getDefaultBaseUrl } from '@/lib/agent/providers';
|
|
9
|
+
import ProviderSelect from '@/components/shared/ProviderSelect';
|
|
8
10
|
|
|
9
11
|
type TestState = 'idle' | 'testing' | 'ok' | 'error';
|
|
10
12
|
type ErrorCode = 'auth_error' | 'model_not_found' | 'rate_limited' | 'network_error' | 'unknown';
|
|
@@ -27,16 +29,16 @@ function errorMessage(t: AiTabProps['t'], code?: ErrorCode): string {
|
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
|
|
32
|
+
const { locale } = useLocale();
|
|
30
33
|
const env = data.envOverrides ?? {};
|
|
31
34
|
const envVal = data.envValues ?? {};
|
|
32
35
|
const provider = data.ai.provider;
|
|
36
|
+
const preset = isProviderId(provider) ? PROVIDER_PRESETS[provider] : null;
|
|
33
37
|
|
|
34
|
-
// --- Test key state ---
|
|
35
38
|
const [testResult, setTestResult] = useState<Record<string, TestResult>>({});
|
|
36
39
|
const okTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);
|
|
37
40
|
const prevProviderRef = useRef(provider);
|
|
38
41
|
|
|
39
|
-
// Reset test result when provider changes
|
|
40
42
|
useEffect(() => {
|
|
41
43
|
if (prevProviderRef.current !== provider) {
|
|
42
44
|
prevProviderRef.current = provider;
|
|
@@ -45,16 +47,14 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
|
|
|
45
47
|
}
|
|
46
48
|
}, [provider]);
|
|
47
49
|
|
|
48
|
-
// Cleanup ok timer
|
|
49
50
|
useEffect(() => () => { if (okTimerRef.current) clearTimeout(okTimerRef.current); }, []);
|
|
50
51
|
|
|
51
|
-
// Sync reconnectRetries to localStorage so AskContent can read it without fetching settings
|
|
52
52
|
useEffect(() => {
|
|
53
53
|
const v = data.agent?.reconnectRetries ?? 3;
|
|
54
54
|
try { localStorage.setItem('mindos-reconnect-retries', String(v)); } catch (err) { console.warn("[AiTab] localStorage setItem reconnectRetries failed:", err); }
|
|
55
55
|
}, [data.agent?.reconnectRetries]);
|
|
56
56
|
|
|
57
|
-
const handleTestKey = useCallback(async (providerName:
|
|
57
|
+
const handleTestKey = useCallback(async (providerName: ProviderId) => {
|
|
58
58
|
const prov = data.ai.providers?.[providerName] ?? {} as ProviderConfig;
|
|
59
59
|
setTestResult(prev => ({ ...prev, [providerName]: { state: 'testing' } }));
|
|
60
60
|
|
|
@@ -62,7 +62,7 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
|
|
|
62
62
|
const body: Record<string, string> = { provider: providerName };
|
|
63
63
|
if (prov.apiKey) body.apiKey = prov.apiKey;
|
|
64
64
|
if (prov.model) body.model = prov.model;
|
|
65
|
-
if (
|
|
65
|
+
if (prov.baseUrl) body.baseUrl = prov.baseUrl;
|
|
66
66
|
|
|
67
67
|
const res = await fetch('/api/settings/test-key', {
|
|
68
68
|
method: 'POST',
|
|
@@ -91,8 +91,7 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
|
|
|
91
91
|
}
|
|
92
92
|
}, [data.ai.providers]);
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
const patchProviderWithReset = useCallback((name: 'anthropic' | 'openai', patch: Partial<ProviderConfig>) => {
|
|
94
|
+
const patchProvider = useCallback((name: ProviderId, patch: Partial<ProviderConfig>) => {
|
|
96
95
|
if ('apiKey' in patch) {
|
|
97
96
|
setTestResult(prev => ({ ...prev, [name]: { state: 'idle' } }));
|
|
98
97
|
}
|
|
@@ -104,21 +103,23 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
|
|
|
104
103
|
});
|
|
105
104
|
}, [data.ai.providers, updateAi]);
|
|
106
105
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
106
|
+
const currentConfig = data.ai.providers?.[provider] ?? { apiKey: '', model: '', baseUrl: '' };
|
|
107
|
+
const envKeyName = preset ? getApiKeyEnvVar(provider) : undefined;
|
|
108
|
+
const activeApiKey = currentConfig.apiKey;
|
|
109
|
+
const activeEnvKey = envKeyName ? env[envKeyName] : false;
|
|
110
|
+
const hasFallbackKey = !!preset?.apiKeyFallback;
|
|
111
|
+
const missingApiKey = !activeApiKey && !activeEnvKey && !hasFallbackKey;
|
|
112
|
+
|
|
113
|
+
const configuredProviders = new Set(
|
|
114
|
+
Object.entries(data.ai.providers ?? {})
|
|
115
|
+
.filter(([id, cfg]) => (cfg && cfg.apiKey) || PROVIDER_PRESETS[id as ProviderId]?.apiKeyFallback)
|
|
116
|
+
.map(([id]) => id as ProviderId),
|
|
117
|
+
);
|
|
117
118
|
|
|
118
|
-
|
|
119
|
-
const renderTestButton = (providerName: 'anthropic' | 'openai', hasKey: boolean, hasEnv: boolean) => {
|
|
119
|
+
const renderTestButton = (providerName: ProviderId, hasKey: boolean, hasEnv: boolean) => {
|
|
120
120
|
const result = testResult[providerName] ?? { state: 'idle' as TestState };
|
|
121
|
-
const
|
|
121
|
+
const hasFallback = !!PROVIDER_PRESETS[providerName]?.apiKeyFallback;
|
|
122
|
+
const disabled = result.state === 'testing' || (!hasKey && !hasEnv && !hasFallback);
|
|
122
123
|
|
|
123
124
|
return (
|
|
124
125
|
<div className="flex items-center gap-2 mt-1.5">
|
|
@@ -150,95 +151,83 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
|
|
|
150
151
|
);
|
|
151
152
|
};
|
|
152
153
|
|
|
154
|
+
const displayName = preset ? (locale === 'zh' ? preset.nameZh : preset.name) : provider;
|
|
155
|
+
|
|
153
156
|
return (
|
|
154
157
|
<div className="space-y-4">
|
|
155
158
|
{/* ── Card 1: AI Provider ── */}
|
|
156
159
|
<SettingCard
|
|
157
160
|
icon={<Sparkles size={15} />}
|
|
158
161
|
title={t.settings.ai.provider}
|
|
159
|
-
description={
|
|
162
|
+
description={displayName}
|
|
160
163
|
>
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
{(
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
onClick={() => updateAi({ provider: p })}
|
|
168
|
-
className={`flex-1 flex items-center gap-2.5 px-3.5 py-2.5 rounded-lg border transition-all ${
|
|
169
|
-
provider === p
|
|
170
|
-
? 'border-[var(--amber)] bg-[var(--amber-subtle)] shadow-sm'
|
|
171
|
-
: 'border-border/50 hover:border-border hover:bg-muted/30'
|
|
172
|
-
}`}
|
|
173
|
-
>
|
|
174
|
-
<span className={`text-sm font-medium ${provider === p ? 'text-foreground' : 'text-muted-foreground'}`}>
|
|
175
|
-
{p === 'anthropic' ? 'Anthropic' : 'OpenAI'}
|
|
176
|
-
</span>
|
|
177
|
-
<EnvBadge overridden={env.AI_PROVIDER} />
|
|
178
|
-
</button>
|
|
179
|
-
))}
|
|
180
|
-
</div>
|
|
164
|
+
<ProviderSelect
|
|
165
|
+
value={provider}
|
|
166
|
+
onChange={id => { if (id !== 'skip') updateAi({ provider: id }); }}
|
|
167
|
+
compact
|
|
168
|
+
configuredProviders={configuredProviders}
|
|
169
|
+
/>
|
|
181
170
|
|
|
182
|
-
{/*
|
|
183
|
-
{
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
<ModelInput
|
|
187
|
-
value={anthropic.model}
|
|
188
|
-
onChange={v => patchProvider('anthropic', { model: v })}
|
|
189
|
-
placeholder={envVal.ANTHROPIC_MODEL || 'claude-sonnet-4-6'}
|
|
190
|
-
provider="anthropic"
|
|
191
|
-
apiKey={anthropic.apiKey}
|
|
192
|
-
envKey={env.ANTHROPIC_API_KEY}
|
|
193
|
-
t={t}
|
|
194
|
-
/>
|
|
195
|
-
</Field>
|
|
171
|
+
{/* Provider configuration fields */}
|
|
172
|
+
{preset && (
|
|
173
|
+
<div className="space-y-3 pt-3" style={{ borderTop: '1px solid var(--border)' }}>
|
|
174
|
+
{/* 1. API Key — most essential, enter first */}
|
|
196
175
|
<Field
|
|
197
|
-
label={<>{t.settings.ai.apiKey} <EnvBadge overridden={env
|
|
198
|
-
hint={
|
|
176
|
+
label={<>{t.settings.ai.apiKey} {envKeyName && <EnvBadge overridden={env[envKeyName]} />}</>}
|
|
177
|
+
hint={activeEnvKey ? t.settings.ai.envFieldNote(envKeyName!) : hasFallbackKey ? t.settings.ai.keyOptionalHint : t.settings.ai.keyHint}
|
|
199
178
|
>
|
|
200
179
|
<ApiKeyInput
|
|
201
|
-
value={
|
|
202
|
-
onChange={v => patchProvider(
|
|
180
|
+
value={currentConfig.apiKey}
|
|
181
|
+
onChange={v => patchProvider(provider, { apiKey: v })}
|
|
203
182
|
/>
|
|
204
|
-
{
|
|
183
|
+
{preset.signupUrl && !currentConfig.apiKey && !activeEnvKey && (
|
|
184
|
+
<a
|
|
185
|
+
href={preset.signupUrl}
|
|
186
|
+
target="_blank"
|
|
187
|
+
rel="noopener noreferrer"
|
|
188
|
+
className="inline-flex items-center gap-1 text-xs mt-1.5 hover:underline"
|
|
189
|
+
style={{ color: 'var(--amber)' }}
|
|
190
|
+
>
|
|
191
|
+
<ExternalLink size={10} />
|
|
192
|
+
{hasFallbackKey
|
|
193
|
+
? (locale === 'zh' ? `下载 ${preset.nameZh}` : `Download ${preset.name}`)
|
|
194
|
+
: (locale === 'zh' ? `获取 ${preset.nameZh} API Key` : `Get ${preset.name} API Key`)}
|
|
195
|
+
</a>
|
|
196
|
+
)}
|
|
205
197
|
</Field>
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
198
|
+
|
|
199
|
+
{/* 2. Base URL — before Model so "List Models" uses the correct endpoint */}
|
|
200
|
+
{preset.supportsBaseUrl && (
|
|
201
|
+
<Field
|
|
202
|
+
label={t.settings.ai.baseUrl}
|
|
203
|
+
hint={t.settings.ai.baseUrlHint}
|
|
204
|
+
>
|
|
205
|
+
<Input
|
|
206
|
+
value={currentConfig.baseUrl ?? ''}
|
|
207
|
+
onChange={e => patchProvider(provider, { baseUrl: e.target.value })}
|
|
208
|
+
placeholder={preset.fixedBaseUrl || getDefaultBaseUrl(provider) || 'https://api.openai.com/v1'}
|
|
209
|
+
/>
|
|
210
|
+
</Field>
|
|
211
|
+
)}
|
|
212
|
+
|
|
213
|
+
{/* 3. Model — after Base URL so "List Models" queries the right endpoint */}
|
|
214
|
+
<Field label={t.settings.ai.model}>
|
|
210
215
|
<ModelInput
|
|
211
|
-
value={
|
|
212
|
-
onChange={v => patchProvider(
|
|
213
|
-
placeholder={
|
|
214
|
-
provider=
|
|
215
|
-
apiKey={
|
|
216
|
-
envKey={
|
|
217
|
-
baseUrl={
|
|
216
|
+
value={currentConfig.model}
|
|
217
|
+
onChange={v => patchProvider(provider, { model: v })}
|
|
218
|
+
placeholder={preset.defaultModel}
|
|
219
|
+
provider={provider}
|
|
220
|
+
apiKey={currentConfig.apiKey}
|
|
221
|
+
envKey={!!activeEnvKey}
|
|
222
|
+
baseUrl={currentConfig.baseUrl}
|
|
223
|
+
supportsListModels={preset.supportsListModels}
|
|
218
224
|
t={t}
|
|
219
225
|
/>
|
|
220
226
|
</Field>
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
<ApiKeyInput
|
|
226
|
-
value={openai.apiKey}
|
|
227
|
-
onChange={v => patchProvider('openai', { apiKey: v })}
|
|
228
|
-
/>
|
|
229
|
-
{renderTestButton('openai', !!openai.apiKey, !!env.OPENAI_API_KEY)}
|
|
230
|
-
</Field>
|
|
231
|
-
<Field
|
|
232
|
-
label={<>{t.settings.ai.baseUrl} <EnvBadge overridden={env.OPENAI_BASE_URL} /></>}
|
|
233
|
-
hint={t.settings.ai.baseUrlHint}
|
|
234
|
-
>
|
|
235
|
-
<Input
|
|
236
|
-
value={openai.baseUrl ?? ''}
|
|
237
|
-
onChange={e => patchProvider('openai', { baseUrl: e.target.value })}
|
|
238
|
-
placeholder={envVal.OPENAI_BASE_URL || 'https://api.openai.com/v1'}
|
|
239
|
-
/>
|
|
240
|
-
</Field>
|
|
241
|
-
</>
|
|
227
|
+
|
|
228
|
+
{/* 4. Test — after all fields, tests the complete configuration */}
|
|
229
|
+
{renderTestButton(provider, !!currentConfig.apiKey, !!activeEnvKey)}
|
|
230
|
+
</div>
|
|
242
231
|
)}
|
|
243
232
|
|
|
244
233
|
{/* Inline warnings */}
|
|
@@ -307,7 +296,8 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
|
|
|
307
296
|
</Select>
|
|
308
297
|
</SettingRow>
|
|
309
298
|
|
|
310
|
-
{
|
|
299
|
+
{/* Thinking — show for providers that support it */}
|
|
300
|
+
{preset?.supportsThinking && (
|
|
311
301
|
<>
|
|
312
302
|
<SettingRow label={t.settings.agent.thinking} hint={t.settings.agent.thinkingHint}>
|
|
313
303
|
<Toggle checked={data.agent?.enableThinking ?? false} onChange={() => updateAgent({ enableThinking: !(data.agent?.enableThinking ?? false) })} />
|
|
@@ -341,29 +331,45 @@ export function AiTab({ data, updateAi, updateAgent, t }: AiTabProps) {
|
|
|
341
331
|
/* ── Model Input with "List models" picker ── */
|
|
342
332
|
|
|
343
333
|
function ModelInput({
|
|
344
|
-
value, onChange, placeholder, provider, apiKey, envKey, baseUrl, t,
|
|
334
|
+
value, onChange, placeholder, provider, apiKey, envKey, baseUrl, supportsListModels, t,
|
|
345
335
|
}: {
|
|
346
336
|
value: string;
|
|
347
337
|
onChange: (v: string) => void;
|
|
348
338
|
placeholder: string;
|
|
349
|
-
provider:
|
|
339
|
+
provider: ProviderId;
|
|
350
340
|
apiKey: string;
|
|
351
341
|
envKey?: boolean;
|
|
352
342
|
baseUrl?: string;
|
|
343
|
+
supportsListModels: boolean;
|
|
353
344
|
t: AiTabProps['t'];
|
|
354
345
|
}) {
|
|
355
346
|
const [models, setModels] = useState<string[] | null>(null);
|
|
356
347
|
const [loading, setLoading] = useState(false);
|
|
357
348
|
const [open, setOpen] = useState(false);
|
|
358
349
|
const [error, setError] = useState('');
|
|
350
|
+
const [focused, setFocused] = useState(false);
|
|
351
|
+
const [highlightIdx, setHighlightIdx] = useState(-1);
|
|
359
352
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
353
|
+
const listRef = useRef<HTMLDivElement>(null);
|
|
354
|
+
const fetchedRef = useRef(false);
|
|
355
|
+
const fetchVersionRef = useRef(0);
|
|
356
|
+
const loadingRef = useRef(false);
|
|
360
357
|
|
|
361
|
-
const hasKey = !!apiKey || !!envKey;
|
|
358
|
+
const hasKey = !!apiKey || !!envKey || !!PROVIDER_PRESETS[provider]?.apiKeyFallback;
|
|
362
359
|
|
|
363
|
-
|
|
364
|
-
|
|
360
|
+
// Reset fetched cache when provider/key/baseUrl changes
|
|
361
|
+
useEffect(() => {
|
|
362
|
+
fetchedRef.current = false;
|
|
363
|
+
fetchVersionRef.current++;
|
|
364
|
+
setModels(null);
|
|
365
|
+
}, [provider, apiKey, baseUrl]);
|
|
366
|
+
|
|
367
|
+
const fetchModels = useCallback(async (silent = false) => {
|
|
368
|
+
if (loadingRef.current) return;
|
|
369
|
+
loadingRef.current = true;
|
|
365
370
|
setLoading(true);
|
|
366
|
-
setError('');
|
|
371
|
+
if (!silent) setError('');
|
|
372
|
+
const version = fetchVersionRef.current;
|
|
367
373
|
try {
|
|
368
374
|
const body: Record<string, string> = { provider };
|
|
369
375
|
if (apiKey) body.apiKey = apiKey;
|
|
@@ -374,67 +380,133 @@ function ModelInput({
|
|
|
374
380
|
headers: { 'Content-Type': 'application/json' },
|
|
375
381
|
body: JSON.stringify(body),
|
|
376
382
|
});
|
|
383
|
+
if (version !== fetchVersionRef.current) return;
|
|
377
384
|
const json = await res.json();
|
|
385
|
+
if (version !== fetchVersionRef.current) return;
|
|
378
386
|
if (json.ok && Array.isArray(json.models)) {
|
|
379
387
|
setModels(json.models);
|
|
380
|
-
|
|
381
|
-
|
|
388
|
+
fetchedRef.current = true;
|
|
389
|
+
if (!silent) setOpen(true);
|
|
390
|
+
} else if (!silent) {
|
|
382
391
|
setError(json.error || 'Failed to fetch models');
|
|
383
392
|
}
|
|
384
393
|
} catch {
|
|
385
|
-
|
|
394
|
+
if (version !== fetchVersionRef.current) return;
|
|
395
|
+
if (!silent) setError('Network error');
|
|
386
396
|
} finally {
|
|
397
|
+
loadingRef.current = false;
|
|
387
398
|
setLoading(false);
|
|
388
399
|
}
|
|
389
|
-
}, [provider, apiKey, baseUrl
|
|
400
|
+
}, [provider, apiKey, baseUrl]);
|
|
401
|
+
|
|
402
|
+
const handleFocus = useCallback(() => {
|
|
403
|
+
setFocused(true);
|
|
404
|
+
if (!fetchedRef.current && supportsListModels && hasKey && !loadingRef.current) {
|
|
405
|
+
fetchModels(true);
|
|
406
|
+
}
|
|
407
|
+
}, [supportsListModels, hasKey, fetchModels]);
|
|
390
408
|
|
|
409
|
+
// Filtered models for typeahead
|
|
410
|
+
const filtered = useMemo(() => {
|
|
411
|
+
if (!models || !value.trim()) return models ?? [];
|
|
412
|
+
const q = value.toLowerCase();
|
|
413
|
+
return models.filter(m => m.toLowerCase().includes(q));
|
|
414
|
+
}, [models, value]);
|
|
415
|
+
|
|
416
|
+
// Show typeahead when focused + models loaded + user is typing (or Browse was clicked)
|
|
417
|
+
const showDropdown = open || (focused && models !== null && value.trim().length > 0 && filtered.length > 0);
|
|
418
|
+
|
|
419
|
+
// Reset highlight when filtered list changes
|
|
420
|
+
useEffect(() => { setHighlightIdx(-1); }, [filtered]);
|
|
421
|
+
|
|
422
|
+
// Scroll highlighted item into view
|
|
391
423
|
useEffect(() => {
|
|
392
|
-
if (!
|
|
424
|
+
if (highlightIdx < 0 || !listRef.current) return;
|
|
425
|
+
const items = listRef.current.querySelectorAll('[data-model-item]');
|
|
426
|
+
items[highlightIdx]?.scrollIntoView({ block: 'nearest' });
|
|
427
|
+
}, [highlightIdx]);
|
|
428
|
+
|
|
429
|
+
const handleKeyDown = useCallback((e: React.KeyboardEvent) => {
|
|
430
|
+
const items = showDropdown ? filtered : [];
|
|
431
|
+
if (!items.length) return;
|
|
432
|
+
|
|
433
|
+
if (e.key === 'ArrowDown') {
|
|
434
|
+
e.preventDefault();
|
|
435
|
+
setHighlightIdx(i => (i + 1) % items.length);
|
|
436
|
+
} else if (e.key === 'ArrowUp') {
|
|
437
|
+
e.preventDefault();
|
|
438
|
+
setHighlightIdx(i => (i - 1 + items.length) % items.length);
|
|
439
|
+
} else if (e.key === 'Enter' && highlightIdx >= 0 && highlightIdx < items.length) {
|
|
440
|
+
e.preventDefault();
|
|
441
|
+
onChange(items[highlightIdx]);
|
|
442
|
+
setOpen(false);
|
|
443
|
+
setFocused(false);
|
|
444
|
+
} else if (e.key === 'Escape') {
|
|
445
|
+
setOpen(false);
|
|
446
|
+
setFocused(false);
|
|
447
|
+
}
|
|
448
|
+
}, [showDropdown, filtered, highlightIdx, onChange]);
|
|
449
|
+
|
|
450
|
+
useEffect(() => {
|
|
451
|
+
if (!showDropdown) return;
|
|
393
452
|
function handleClickOutside(e: MouseEvent) {
|
|
394
453
|
if (containerRef.current && !containerRef.current.contains(e.target as Node)) {
|
|
395
454
|
setOpen(false);
|
|
455
|
+
setFocused(false);
|
|
396
456
|
}
|
|
397
457
|
}
|
|
398
458
|
document.addEventListener('mousedown', handleClickOutside);
|
|
399
459
|
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
400
|
-
}, [
|
|
460
|
+
}, [showDropdown]);
|
|
461
|
+
|
|
462
|
+
const displayList = filtered;
|
|
401
463
|
|
|
402
464
|
return (
|
|
403
465
|
<div ref={containerRef} className="relative">
|
|
404
466
|
<div className="flex gap-1.5">
|
|
405
467
|
<Input
|
|
406
468
|
value={value}
|
|
407
|
-
onChange={e => onChange(e.target.value)}
|
|
469
|
+
onChange={e => { onChange(e.target.value); if (!open) setFocused(true); }}
|
|
470
|
+
onFocus={handleFocus}
|
|
471
|
+
onKeyDown={handleKeyDown}
|
|
408
472
|
placeholder={placeholder}
|
|
409
473
|
className="flex-1"
|
|
474
|
+
autoComplete="off"
|
|
410
475
|
/>
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
476
|
+
{supportsListModels && (
|
|
477
|
+
<button
|
|
478
|
+
type="button"
|
|
479
|
+
disabled={!hasKey || loading}
|
|
480
|
+
onClick={() => fetchModels(false)}
|
|
481
|
+
title={t.settings.ai.listModels}
|
|
482
|
+
className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-lg border border-border text-muted-foreground hover:text-foreground hover:border-foreground/20 transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0"
|
|
483
|
+
>
|
|
484
|
+
{loading ? <Loader2 size={12} className="animate-spin" /> : <ChevronDown size={12} />}
|
|
485
|
+
{t.settings.ai.listModels}
|
|
486
|
+
</button>
|
|
487
|
+
)}
|
|
421
488
|
</div>
|
|
422
489
|
{error && <p className="text-xs text-error mt-1">{error}</p>}
|
|
423
|
-
{
|
|
424
|
-
<div className="absolute z-50 mt-1 w-full max-h-48 overflow-y-auto rounded-lg border border-border bg-popover shadow-lg">
|
|
425
|
-
{
|
|
490
|
+
{showDropdown && displayList.length > 0 && (
|
|
491
|
+
<div ref={listRef} className="absolute z-50 mt-1 w-full max-h-48 overflow-y-auto rounded-lg border border-border bg-popover shadow-lg">
|
|
492
|
+
{displayList.map((m, i) => (
|
|
426
493
|
<button
|
|
427
494
|
key={m}
|
|
428
495
|
type="button"
|
|
429
|
-
|
|
430
|
-
|
|
496
|
+
data-model-item
|
|
497
|
+
className={`w-full text-left px-3 py-1.5 text-sm transition-colors ${
|
|
498
|
+
m === value ? 'bg-accent/60 font-medium'
|
|
499
|
+
: i === highlightIdx ? 'bg-accent'
|
|
500
|
+
: 'hover:bg-accent'
|
|
501
|
+
}`}
|
|
502
|
+
onClick={() => { onChange(m); setOpen(false); setFocused(false); }}
|
|
431
503
|
>
|
|
432
504
|
{m}
|
|
433
505
|
</button>
|
|
434
506
|
))}
|
|
435
507
|
</div>
|
|
436
508
|
)}
|
|
437
|
-
{open &&
|
|
509
|
+
{open && displayList.length === 0 && (
|
|
438
510
|
<div className="absolute z-50 mt-1 w-full rounded-lg border border-border bg-popover shadow-lg px-3 py-2 text-xs text-muted-foreground">
|
|
439
511
|
{t.settings.ai.noModelsFound}
|
|
440
512
|
</div>
|
|
@@ -460,7 +532,6 @@ function AskDisplayMode() {
|
|
|
460
532
|
const next = value as 'panel' | 'popup';
|
|
461
533
|
setMode(next);
|
|
462
534
|
try { localStorage.setItem('ask-mode', next); } catch (err) { console.warn("[AiTab] localStorage setItem ask-mode failed:", err); }
|
|
463
|
-
// Notify SidebarLayout to pick up the change
|
|
464
535
|
window.dispatchEvent(new StorageEvent('storage', { key: 'ask-mode', newValue: next }));
|
|
465
536
|
};
|
|
466
537
|
|
|
@@ -59,10 +59,55 @@ export function AppearanceTab({ font, setFont, fontSize, setFontSize, contentWid
|
|
|
59
59
|
return (
|
|
60
60
|
<div className="space-y-4">
|
|
61
61
|
|
|
62
|
-
{/* ── Card 1:
|
|
63
|
-
<SettingCard icon={<
|
|
62
|
+
{/* ── Card 1: Preferences — theme, language ── */}
|
|
63
|
+
<SettingCard icon={<Palette size={15} />} title={a.preferencesTitle ?? 'Preferences'}>
|
|
64
|
+
|
|
65
|
+
{/* ── Theme — amber pills ── */}
|
|
66
|
+
<SettingGroup icon={<Sun size={14} />} label={a.colorTheme}>
|
|
67
|
+
<PillSelector
|
|
68
|
+
options={[
|
|
69
|
+
{ value: 'system', label: a.system, icon: <Monitor size={14} /> },
|
|
70
|
+
{ value: 'dark', label: a.dark, icon: <Moon size={14} /> },
|
|
71
|
+
{ value: 'light', label: a.light, icon: <Sun size={14} /> },
|
|
72
|
+
]}
|
|
73
|
+
value={themePref}
|
|
74
|
+
onChange={v => {
|
|
75
|
+
setThemePref(v);
|
|
76
|
+
localStorage.setItem('theme', v);
|
|
77
|
+
const isDark = v === 'system'
|
|
78
|
+
? window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
79
|
+
: v === 'dark';
|
|
80
|
+
setDark(isDark);
|
|
81
|
+
document.documentElement.classList.toggle('dark', isDark);
|
|
82
|
+
}}
|
|
83
|
+
/>
|
|
84
|
+
</SettingGroup>
|
|
64
85
|
|
|
65
|
-
{/* ──
|
|
86
|
+
{/* ── Language — amber pills ── */}
|
|
87
|
+
<SettingGroup icon={<Globe size={14} />} label={a.language}>
|
|
88
|
+
<PillSelector
|
|
89
|
+
options={[
|
|
90
|
+
{ value: 'system', label: a.system, icon: <Monitor size={14} /> },
|
|
91
|
+
{ value: 'en', label: 'EN' },
|
|
92
|
+
{ value: 'zh', label: '中文' },
|
|
93
|
+
]}
|
|
94
|
+
value={localePref}
|
|
95
|
+
onChange={v => {
|
|
96
|
+
setLocalePref(v);
|
|
97
|
+
localStorage.setItem('locale', v);
|
|
98
|
+
const resolved: Locale = v === 'system'
|
|
99
|
+
? (navigator.language.startsWith('zh') ? 'zh' : 'en')
|
|
100
|
+
: v as Locale;
|
|
101
|
+
setLocale(resolved);
|
|
102
|
+
document.cookie = `locale=${resolved};path=/;max-age=31536000;SameSite=Lax`;
|
|
103
|
+
}}
|
|
104
|
+
/>
|
|
105
|
+
</SettingGroup>
|
|
106
|
+
|
|
107
|
+
</SettingCard>
|
|
108
|
+
|
|
109
|
+
{/* ── Card 2: Reading — font, size, width ── */}
|
|
110
|
+
<SettingCard icon={<BookOpen size={15} />} title={a.readingTitle ?? 'Reading'} description={a.readingDesc ?? 'Customize how your notes look'}>
|
|
66
111
|
<SettingGroup icon={<Type size={14} />} label={a.readingFont}>
|
|
67
112
|
<div className="space-y-0.5">
|
|
68
113
|
{FONTS.map(f => {
|
|
@@ -191,53 +236,6 @@ export function AppearanceTab({ font, setFont, fontSize, setFontSize, contentWid
|
|
|
191
236
|
|
|
192
237
|
</SettingCard>
|
|
193
238
|
|
|
194
|
-
{/* ── Card 2: Preferences — theme, language ── */}
|
|
195
|
-
<SettingCard icon={<Palette size={15} />} title={a.preferencesTitle ?? 'Preferences'}>
|
|
196
|
-
|
|
197
|
-
{/* ── Theme — amber pills ── */}
|
|
198
|
-
<SettingGroup icon={<Sun size={14} />} label={a.colorTheme}>
|
|
199
|
-
<PillSelector
|
|
200
|
-
options={[
|
|
201
|
-
{ value: 'system', label: a.system, icon: <Monitor size={14} /> },
|
|
202
|
-
{ value: 'dark', label: a.dark, icon: <Moon size={14} /> },
|
|
203
|
-
{ value: 'light', label: a.light, icon: <Sun size={14} /> },
|
|
204
|
-
]}
|
|
205
|
-
value={themePref}
|
|
206
|
-
onChange={v => {
|
|
207
|
-
setThemePref(v);
|
|
208
|
-
localStorage.setItem('theme', v);
|
|
209
|
-
const isDark = v === 'system'
|
|
210
|
-
? window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
211
|
-
: v === 'dark';
|
|
212
|
-
setDark(isDark);
|
|
213
|
-
document.documentElement.classList.toggle('dark', isDark);
|
|
214
|
-
}}
|
|
215
|
-
/>
|
|
216
|
-
</SettingGroup>
|
|
217
|
-
|
|
218
|
-
{/* ── Language — amber pills ── */}
|
|
219
|
-
<SettingGroup icon={<Globe size={14} />} label={a.language}>
|
|
220
|
-
<PillSelector
|
|
221
|
-
options={[
|
|
222
|
-
{ value: 'system', label: a.system, icon: <Monitor size={14} /> },
|
|
223
|
-
{ value: 'en', label: 'EN' },
|
|
224
|
-
{ value: 'zh', label: '中文' },
|
|
225
|
-
]}
|
|
226
|
-
value={localePref}
|
|
227
|
-
onChange={v => {
|
|
228
|
-
setLocalePref(v);
|
|
229
|
-
localStorage.setItem('locale', v);
|
|
230
|
-
const resolved: Locale = v === 'system'
|
|
231
|
-
? (navigator.language.startsWith('zh') ? 'zh' : 'en')
|
|
232
|
-
: v as Locale;
|
|
233
|
-
setLocale(resolved);
|
|
234
|
-
document.cookie = `locale=${resolved};path=/;max-age=31536000;SameSite=Lax`;
|
|
235
|
-
}}
|
|
236
|
-
/>
|
|
237
|
-
</SettingGroup>
|
|
238
|
-
|
|
239
|
-
</SettingCard>
|
|
240
|
-
|
|
241
239
|
<p className="text-xs text-muted-foreground/40 px-0.5">{a.browserNote}</p>
|
|
242
240
|
|
|
243
241
|
{/* ── Keyboard Shortcuts ── */}
|