@geminilight/mindos 0.6.58 → 0.6.60
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 +23 -22
- 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/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 +1 -1
- 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 +1 -1
- 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 +2 -2
- 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/agents/copy-skill/route.js +1 -0
- package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -0
- package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -0
- package/_standalone/.next/server/app/api/agents/custom/detect/route.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/route.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask/route.js +18 -7
- 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_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +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.js +2 -2
- package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_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_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/workflows/route_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 +3 -3
- 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 +1 -1
- 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/inbox/history/page.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/inbox/history/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 -8
- 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 +3 -3
- 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/wiki/page.js +2 -2
- package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app-paths-manifest.json +23 -22
- package/_standalone/.next/server/chunks/1550.js +1 -1
- package/_standalone/.next/server/chunks/3484.js +1 -1
- package/_standalone/.next/server/chunks/530.js +70 -71
- package/_standalone/.next/server/chunks/{6793.js → 9753.js} +2 -2
- package/_standalone/.next/server/chunks/9787.js +2 -0
- 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/K3wZNf5bj_AFYwtqcRXIf/_buildManifest.js +1 -0
- package/_standalone/.next/static/chunks/1369-7d0ac5d1564eed1e.js +1 -0
- package/_standalone/.next/static/chunks/{1814.a7c127b2c73d1f70.js → 1814.a79b84d37df75c43.js} +1 -1
- package/_standalone/.next/static/chunks/3427-2e61a5df1f5e55fb.js +1 -0
- package/_standalone/.next/static/chunks/{1053-fe009233cff06e72.js → 5581-974dfb26d1d1b38f.js} +3 -3
- package/_standalone/.next/static/chunks/6297-085daa21037d5f81.js +1 -0
- package/_standalone/.next/static/chunks/7249-b0a9c77b9a84b11c.js +11 -0
- package/_standalone/.next/static/chunks/7637-904b0a381dc3ec02.js +1 -0
- package/_standalone/.next/static/chunks/8520-76d1b05072178b43.js +22 -0
- package/_standalone/.next/static/chunks/9186-ead47513192f658b.js +1 -0
- package/_standalone/.next/static/chunks/9905-a19d379cb225246e.js +1 -0
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-2f4705aa66819b86.js → route-2ceea6eabf25b1f2.js} +1 -1
- package/_standalone/.next/static/chunks/app/_global-error/{page-2f4705aa66819b86.js → page-2ceea6eabf25b1f2.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-0ea3571c8fbae823.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/page-66858acbcd1d4bf8.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-2f4705aa66819b86.js → route-2ceea6eabf25b1f2.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-2f4705aa66819b86.js → route-2ceea6eabf25b1f2.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/raw/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/changes/page-dd0b00a7b81f74e2.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-bf5c290fa3ccff09.js +11 -0
- package/_standalone/.next/static/chunks/app/echo/page-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/explore/{page-d3d99308146c2240.js → page-d9f58000bc445360.js} +2 -2
- package/_standalone/.next/static/chunks/app/help/{page-222df603080b5fab.js → page-f8cb806371b3175f.js} +1 -1
- package/_standalone/.next/static/chunks/app/inbox/history/{page-07819cf95cb0805f.js → page-3279585360df132c.js} +1 -1
- package/_standalone/.next/static/chunks/app/layout-6a0169582db11a08.js +164 -0
- package/_standalone/.next/static/chunks/app/loading-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/login/{page-0eeef685052869a6.js → page-18fb00d568cd1f0e.js} +1 -1
- package/_standalone/.next/static/chunks/app/page-6a1f8d21c12b829e.js +1 -0
- package/_standalone/.next/static/chunks/app/setup/{page-99fcfc460fa29733.js → page-821714e7477be46c.js} +1 -1
- package/_standalone/.next/static/chunks/app/trash/page-ed7ba3b0b50223a6.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/{not-found-fc04c2bd4f35bc6f.js → not-found-6e0c75ad26ce8572.js} +1 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-678139779971cfcb.js +12 -0
- package/_standalone/.next/static/chunks/app/wiki/page-194ae9af2d461481.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/{webpack-2c19436659aa657b.js → webpack-72e8d9e9073fd1f9.js} +1 -1
- package/_standalone/.next/static/css/9c558c42831fae58.css +1 -0
- package/_standalone/.next/trace +65 -64
- package/_standalone/.next/types/routes.d.ts +2 -1
- package/_standalone/.next/types/validator.ts +9 -0
- package/_standalone/__tests__/api/mcp-install.test.ts +4 -2
- package/_standalone/app/globals.css +2 -1
- package/_standalone/components/AskFab.tsx +11 -5
- package/_standalone/components/AskModal.tsx +1 -1
- package/_standalone/components/FileTree.tsx +83 -1
- package/_standalone/components/GuideCard.tsx +101 -152
- package/_standalone/components/Panel.tsx +6 -1
- package/_standalone/components/RightAskPanel.tsx +2 -2
- package/_standalone/components/agents/AgentsOverviewSection.tsx +13 -11
- package/_standalone/components/agents/CustomAgentModal.tsx +72 -18
- package/_standalone/components/ask/AskContent.tsx +109 -54
- package/_standalone/components/ask/AskHeader.tsx +218 -18
- package/_standalone/components/ask/FileChip.tsx +93 -12
- package/_standalone/components/ask/MessageList.tsx +66 -47
- package/_standalone/components/ask/SessionHistory.tsx +86 -60
- package/_standalone/components/ask/SessionTabBar.tsx +29 -21
- package/_standalone/components/ask/ThinkingBlock.tsx +6 -5
- package/_standalone/components/ask/ToolCallBlock.tsx +10 -9
- package/_standalone/components/changes/ChangesBanner.tsx +1 -1
- package/_standalone/components/settings/SettingsContent.tsx +1 -1
- package/_standalone/components/walkthrough/WalkthroughTooltip.tsx +3 -1
- package/_standalone/components/walkthrough/steps.ts +1 -1
- package/_standalone/data/skills/mindos/SKILL.md +67 -15
- package/_standalone/data/skills/mindos-zh/SKILL.md +67 -11
- package/_standalone/hooks/useAskChat.ts +10 -8
- package/_standalone/hooks/useAskSession.ts +23 -1
- package/_standalone/hooks/useFileUpload.ts +97 -43
- package/_standalone/hooks/useImageUpload.ts +1 -1
- package/_standalone/lib/inbox-upload.ts +86 -0
- package/_standalone/lib/stores/locale-store.ts +20 -6
- package/_standalone/package-lock.json +2 -2
- package/_standalone/package.json +1 -1
- package/_standalone/scripts/extract-pdf.cjs +110 -3
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/api/agents/copy-skill/route.ts +110 -0
- package/app/app/api/agents/custom/detect/route.ts +16 -1
- package/app/app/api/ask/route.ts +7 -1
- package/app/app/api/extract-pdf/route.ts +12 -5
- package/app/app/api/mcp/agents/route.ts +64 -2
- package/app/app/globals.css +2 -1
- package/app/app/layout.tsx +16 -4
- package/app/components/AskFab.tsx +11 -5
- package/app/components/AskModal.tsx +1 -1
- package/app/components/FileTree.tsx +83 -1
- package/app/components/GuideCard.tsx +101 -152
- package/app/components/HomeContent.tsx +123 -574
- package/app/components/Panel.tsx +6 -1
- package/app/components/RightAskPanel.tsx +2 -2
- package/app/components/WikiHomeContent.tsx +151 -3
- package/app/components/agents/AgentDetailContent.tsx +58 -1
- package/app/components/agents/AgentsOverviewSection.tsx +13 -11
- package/app/components/agents/CustomAgentModal.tsx +72 -18
- package/app/components/ask/AskContent.tsx +109 -54
- package/app/components/ask/AskHeader.tsx +218 -18
- package/app/components/ask/FileChip.tsx +93 -12
- package/app/components/ask/MessageList.tsx +66 -47
- package/app/components/ask/SessionHistory.tsx +86 -60
- package/app/components/ask/SessionTabBar.tsx +29 -21
- package/app/components/ask/ThinkingBlock.tsx +6 -5
- package/app/components/ask/ToolCallBlock.tsx +10 -9
- package/app/components/changes/ChangesBanner.tsx +1 -1
- package/app/components/changes/ChangesContentPage.tsx +368 -168
- package/app/components/settings/SettingsContent.tsx +1 -1
- package/app/components/walkthrough/WalkthroughTooltip.tsx +3 -1
- package/app/components/walkthrough/steps.ts +1 -1
- package/app/data/skills/mindos/SKILL.md +67 -15
- package/app/data/skills/mindos-zh/SKILL.md +67 -11
- package/app/hooks/useAskChat.ts +10 -8
- package/app/hooks/useAskSession.ts +23 -1
- package/app/hooks/useFileUpload.ts +97 -43
- package/app/hooks/useImageUpload.ts +1 -1
- package/app/lib/agent/prompt.ts +15 -4
- package/app/lib/custom-agents.ts +109 -1
- package/app/lib/file-ops.ts +58 -0
- package/app/lib/i18n/modules/ai-chat.ts +134 -10
- package/app/lib/i18n/modules/knowledge.ts +2 -0
- package/app/lib/i18n/modules/onboarding.ts +12 -12
- package/app/lib/inbox-upload.ts +86 -0
- package/app/lib/mcp-agents.ts +21 -1
- package/app/lib/stores/LocaleStoreInit.tsx +24 -1
- package/app/lib/stores/locale-store.ts +20 -6
- package/app/lib/types.ts +13 -0
- package/app/package.json +1 -1
- package/app/scripts/extract-pdf.cjs +110 -3
- package/package.json +1 -1
- package/skills/mindos/SKILL.md +67 -15
- package/skills/mindos/references/knowledge-health.md +120 -0
- package/skills/mindos-max/SKILL.md +52 -5
- package/skills/mindos-max-zh/SKILL.md +55 -6
- package/skills/mindos-zh/SKILL.md +67 -11
- package/_standalone/.next/server/chunks/2364.js +0 -2
- package/_standalone/.next/server/chunks/357.js +0 -1
- package/_standalone/.next/static/2ksXveDzEcnCMRIElDkLq/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/178-105779afb62d36d9.js +0 -1
- package/_standalone/.next/static/chunks/2218-d54538000574ffef.js +0 -1
- package/_standalone/.next/static/chunks/2549-e63cf57fa927a41d.js +0 -1
- package/_standalone/.next/static/chunks/4237-ffc6e7c15d4007b6.js +0 -1
- package/_standalone/.next/static/chunks/6878-e2c5459e1c608f89.js +0 -1
- package/_standalone/.next/static/chunks/7249-fa98ca10e9a10f39.js +0 -11
- package/_standalone/.next/static/chunks/9274-296ab35f9f09e42e.js +0 -1
- package/_standalone/.next/static/chunks/9286-5b09baa5200318c2.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-7bdeab5af8e4f5f2.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/page-5d1446665ddb3801.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/raw/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/changes/page-5a72144d1080a699.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-b0103509ce34444b.js +0 -11
- package/_standalone/.next/static/chunks/app/echo/page-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/layout-7e02ddf4144b01f1.js +0 -186
- package/_standalone/.next/static/chunks/app/loading-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/page-6a6a12bd6d6812d0.js +0 -7
- package/_standalone/.next/static/chunks/app/trash/page-54cbd5c98d9de69b.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-ca7bdcbf27f88a46.js +0 -12
- package/_standalone/.next/static/chunks/app/wiki/page-d492256a93f0b8bc.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/css/fd84c8316ead16eb.css +0 -1
- /package/_standalone/.next/static/{2ksXveDzEcnCMRIElDkLq → K3wZNf5bj_AFYwtqcRXIf}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export const dynamic = 'force-dynamic';
|
|
2
|
+
|
|
3
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import os from 'os';
|
|
6
|
+
import { copyDir, dirExists } from '@/lib/file-ops';
|
|
7
|
+
import { getMindRoot } from '@/lib/fs';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Find the source path of a skill from the standard search directories.
|
|
11
|
+
*/
|
|
12
|
+
function findSkillSourcePath(skillName: string): string | null {
|
|
13
|
+
const mindRoot = getMindRoot();
|
|
14
|
+
const projectRoot = process.env.MINDOS_PROJECT_ROOT || path.resolve(process.cwd(), '..');
|
|
15
|
+
|
|
16
|
+
// Search in order of priority
|
|
17
|
+
const searchDirs = [
|
|
18
|
+
path.join(projectRoot, 'app', 'data', 'skills', skillName),
|
|
19
|
+
path.join(projectRoot, 'skills', skillName),
|
|
20
|
+
path.join(mindRoot, '.skills', skillName),
|
|
21
|
+
path.join(os.homedir(), '.mindos', 'skills', skillName),
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
for (const dir of searchDirs) {
|
|
25
|
+
if (dirExists(dir)) {
|
|
26
|
+
return dir;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* POST — Copy a skill to a target agent's skill directory.
|
|
35
|
+
*
|
|
36
|
+
* Request body:
|
|
37
|
+
* {
|
|
38
|
+
* skillName: string; // Name of the skill to copy
|
|
39
|
+
* targetPath: string; // Target directory (e.g., "~/.qclaw/skills/")
|
|
40
|
+
* }
|
|
41
|
+
*/
|
|
42
|
+
export async function POST(req: NextRequest) {
|
|
43
|
+
try {
|
|
44
|
+
const body = await req.json();
|
|
45
|
+
const { skillName, targetPath } = body as { skillName?: string; targetPath?: string };
|
|
46
|
+
|
|
47
|
+
if (!skillName?.trim()) {
|
|
48
|
+
return NextResponse.json({ error: 'skillName is required' }, { status: 400 });
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!targetPath?.trim()) {
|
|
52
|
+
return NextResponse.json({ error: 'targetPath is required' }, { status: 400 });
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Validate skill name (prevent path traversal)
|
|
56
|
+
if (skillName.includes('/') || skillName.includes('\\') || skillName.includes('..')) {
|
|
57
|
+
return NextResponse.json({ error: 'Invalid skill name' }, { status: 400 });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Validate target path (must be absolute or ~/ and no path traversal)
|
|
61
|
+
const trimmedTarget = targetPath.trim();
|
|
62
|
+
if (trimmedTarget.includes('..')) {
|
|
63
|
+
return NextResponse.json({ error: 'Invalid target path' }, { status: 400 });
|
|
64
|
+
}
|
|
65
|
+
if (!trimmedTarget.startsWith('~/') && !trimmedTarget.startsWith('/')) {
|
|
66
|
+
return NextResponse.json(
|
|
67
|
+
{ error: 'Target path must be absolute (starting with / or ~/)' },
|
|
68
|
+
{ status: 400 },
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Find source skill
|
|
73
|
+
const sourcePath = findSkillSourcePath(skillName);
|
|
74
|
+
if (!sourcePath) {
|
|
75
|
+
return NextResponse.json(
|
|
76
|
+
{ error: `Skill "${skillName}" not found` },
|
|
77
|
+
{ status: 404 },
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Expand target path (support ~/)
|
|
82
|
+
let expandedTargetPath = trimmedTarget.startsWith('~/')
|
|
83
|
+
? path.join(os.homedir(), trimmedTarget.slice(2))
|
|
84
|
+
: trimmedTarget;
|
|
85
|
+
|
|
86
|
+
// Ensure trailing slash stripped for joining
|
|
87
|
+
expandedTargetPath = expandedTargetPath.replace(/\/$/, '');
|
|
88
|
+
const targetSkillPath = path.join(expandedTargetPath, skillName);
|
|
89
|
+
|
|
90
|
+
// Check target doesn't already exist
|
|
91
|
+
if (dirExists(targetSkillPath)) {
|
|
92
|
+
return NextResponse.json(
|
|
93
|
+
{ error: `Skill "${skillName}" already exists in target directory` },
|
|
94
|
+
{ status: 409 },
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Copy skill
|
|
99
|
+
await copyDir(sourcePath, targetSkillPath);
|
|
100
|
+
|
|
101
|
+
return NextResponse.json({
|
|
102
|
+
success: true,
|
|
103
|
+
skillName,
|
|
104
|
+
targetPath: targetSkillPath,
|
|
105
|
+
});
|
|
106
|
+
} catch (err) {
|
|
107
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
108
|
+
return NextResponse.json({ error: message }, { status: 500 });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const dynamic = 'force-dynamic';
|
|
2
2
|
|
|
3
3
|
import { NextRequest, NextResponse } from 'next/server';
|
|
4
|
-
import { detectBaseDir } from '@/lib/custom-agents';
|
|
4
|
+
import { detectBaseDir, detectCustomAgentProfile } from '@/lib/custom-agents';
|
|
5
5
|
|
|
6
6
|
/** POST — Auto-detect config files in a baseDir. */
|
|
7
7
|
export async function POST(req: NextRequest) {
|
|
@@ -24,6 +24,21 @@ export async function POST(req: NextRequest) {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
const result = detectBaseDir(dir);
|
|
27
|
+
|
|
28
|
+
// Enhanced detection: if we detected a config, read detailed MCP and skill info
|
|
29
|
+
if (result.detectedConfig && result.detectedConfigKey) {
|
|
30
|
+
const profile = detectCustomAgentProfile(
|
|
31
|
+
dir,
|
|
32
|
+
result.detectedConfig,
|
|
33
|
+
result.detectedConfigKey
|
|
34
|
+
);
|
|
35
|
+
result.mcpServers = profile.mcpServers;
|
|
36
|
+
result.skillNames = profile.skillNames;
|
|
37
|
+
if (profile.parseError) {
|
|
38
|
+
result.mcpParseError = profile.parseError;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
27
42
|
return NextResponse.json(result);
|
|
28
43
|
} catch (err) {
|
|
29
44
|
return NextResponse.json({ error: String(err) }, { status: 500 });
|
package/app/app/api/ask/route.ts
CHANGED
|
@@ -735,11 +735,17 @@ export async function POST(req: NextRequest) {
|
|
|
735
735
|
const contextStrategy = agentConfig.contextStrategy ?? 'auto';
|
|
736
736
|
|
|
737
737
|
// Uploaded files — shared by all modes
|
|
738
|
+
// These are already truncated client-side (80K limit), so only apply a generous
|
|
739
|
+
// server-side cap to guard against malformed requests.
|
|
740
|
+
const UPLOADED_FILE_MAX = 100_000;
|
|
738
741
|
const uploadedParts: string[] = [];
|
|
739
742
|
if (Array.isArray(uploadedFiles) && uploadedFiles.length > 0) {
|
|
740
743
|
for (const f of uploadedFiles.slice(0, 8)) {
|
|
741
744
|
if (!f || typeof f.name !== 'string' || typeof f.content !== 'string') continue;
|
|
742
|
-
|
|
745
|
+
const content = f.content.length > UPLOADED_FILE_MAX
|
|
746
|
+
? f.content.slice(0, UPLOADED_FILE_MAX) + '\n\n[...truncated]'
|
|
747
|
+
: f.content;
|
|
748
|
+
uploadedParts.push(`### ${f.name}\n\n${content}`);
|
|
743
749
|
}
|
|
744
750
|
}
|
|
745
751
|
|
|
@@ -7,12 +7,15 @@ import os from 'os';
|
|
|
7
7
|
|
|
8
8
|
export const runtime = 'nodejs';
|
|
9
9
|
|
|
10
|
-
const MAX_TEXT_CHARS =
|
|
10
|
+
const MAX_TEXT_CHARS = 100_000;
|
|
11
11
|
const MAX_BYTES = 12 * 1024 * 1024; // 12MB
|
|
12
12
|
|
|
13
|
-
function truncateText(text: string): string {
|
|
14
|
-
if (text.length <= MAX_TEXT_CHARS) return text;
|
|
15
|
-
return
|
|
13
|
+
function truncateText(text: string): { result: string; truncated: boolean } {
|
|
14
|
+
if (text.length <= MAX_TEXT_CHARS) return { result: text, truncated: false };
|
|
15
|
+
return {
|
|
16
|
+
result: `${text.slice(0, MAX_TEXT_CHARS)}\n\n[...content truncated — only first ~${Math.round(MAX_TEXT_CHARS / 1000)}K characters included]`,
|
|
17
|
+
truncated: true,
|
|
18
|
+
};
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
/**
|
|
@@ -67,11 +70,15 @@ export async function POST(req: NextRequest) {
|
|
|
67
70
|
|
|
68
71
|
const { text: rawText, pages } = extractPdf(raw);
|
|
69
72
|
const text = rawText.replace(/\u0000/g, '').trim();
|
|
73
|
+
const totalChars = text.length;
|
|
74
|
+
const { result: finalText, truncated } = truncateText(text);
|
|
70
75
|
|
|
71
76
|
return NextResponse.json({
|
|
72
77
|
name,
|
|
73
|
-
text:
|
|
78
|
+
text: finalText,
|
|
74
79
|
extracted: text.length > 0,
|
|
80
|
+
truncated,
|
|
81
|
+
totalChars,
|
|
75
82
|
pagesParsed: pages,
|
|
76
83
|
});
|
|
77
84
|
} catch (err) {
|
|
@@ -13,8 +13,9 @@ import {
|
|
|
13
13
|
detectAgentConfiguredMcpServers,
|
|
14
14
|
detectAgentInstalledSkills,
|
|
15
15
|
resolveSkillWorkspaceProfile,
|
|
16
|
+
parseJsonc,
|
|
16
17
|
} from '@/lib/mcp-agents';
|
|
17
|
-
import { getAllAgents, loadCustomAgents, scanCustomAgentSkills } from '@/lib/custom-agents';
|
|
18
|
+
import { getAllAgents, loadCustomAgents, scanCustomAgentSkills, toAgentDef } from '@/lib/custom-agents';
|
|
18
19
|
import { readSettings } from '@/lib/settings';
|
|
19
20
|
import { scanSkillDirs } from '@/lib/pi-integration/skills';
|
|
20
21
|
import { getMindRoot } from '@/lib/fs';
|
|
@@ -60,6 +61,67 @@ function enrichMindOsAgent(agent: Record<string, unknown>) {
|
|
|
60
61
|
agent.hiddenRootPresent = true;
|
|
61
62
|
}
|
|
62
63
|
|
|
64
|
+
/**
|
|
65
|
+
* Detect configured MCP servers for a custom agent.
|
|
66
|
+
*/
|
|
67
|
+
function detectCustomAgentConfiguredMcp(
|
|
68
|
+
customDef: Parameters<typeof toAgentDef>[0],
|
|
69
|
+
): { servers: string[]; sources: string[] } {
|
|
70
|
+
const globalPath = expandHome(customDef.global);
|
|
71
|
+
if (!fs.existsSync(globalPath)) {
|
|
72
|
+
return { servers: [], sources: [] };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
const content = fs.readFileSync(globalPath, 'utf-8');
|
|
77
|
+
const config = customDef.format === 'toml'
|
|
78
|
+
? parseTomlForServers(content, customDef.configKey)
|
|
79
|
+
: parseJsonForServers(content, customDef.configKey);
|
|
80
|
+
return {
|
|
81
|
+
servers: config,
|
|
82
|
+
sources: config.length > 0 ? [`local:${globalPath}`] : [],
|
|
83
|
+
};
|
|
84
|
+
} catch {
|
|
85
|
+
return { servers: [], sources: [] };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Parse JSON config for MCP servers.
|
|
91
|
+
*/
|
|
92
|
+
function parseJsonForServers(content: string, key: string): string[] {
|
|
93
|
+
try {
|
|
94
|
+
const config = parseJsonc(content);
|
|
95
|
+
const servers = config[key];
|
|
96
|
+
if (servers && typeof servers === 'object') {
|
|
97
|
+
return Object.keys(servers).sort();
|
|
98
|
+
}
|
|
99
|
+
} catch {}
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Parse TOML config for MCP servers.
|
|
105
|
+
*/
|
|
106
|
+
function parseTomlForServers(content: string, sectionKey: string): string[] {
|
|
107
|
+
const names = new Set<string>();
|
|
108
|
+
const lines = content.split('\n');
|
|
109
|
+
const sectionPrefix = `${sectionKey}.`;
|
|
110
|
+
|
|
111
|
+
for (const line of lines) {
|
|
112
|
+
const trimmed = line.trim();
|
|
113
|
+
if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
|
|
114
|
+
const section = trimmed.slice(1, -1).trim();
|
|
115
|
+
if (section.startsWith(sectionPrefix)) {
|
|
116
|
+
const name = section.slice(sectionPrefix.length).split('.')[0];
|
|
117
|
+
if (name) names.add(name);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return [...names].sort();
|
|
123
|
+
}
|
|
124
|
+
|
|
63
125
|
export async function GET() {
|
|
64
126
|
try {
|
|
65
127
|
const allAgents = getAllAgents();
|
|
@@ -112,7 +174,7 @@ export async function GET() {
|
|
|
112
174
|
? { hiddenRootPath: '', hiddenRootPresent: false, conversationSignal: false, usageSignal: false, lastActivityAt: undefined }
|
|
113
175
|
: detectAgentRuntimeSignals(key);
|
|
114
176
|
const configuredMcp = isCustom
|
|
115
|
-
?
|
|
177
|
+
? detectCustomAgentConfiguredMcp(customByKey[key])
|
|
116
178
|
: detectAgentConfiguredMcpServers(key);
|
|
117
179
|
const installedSkills = isCustom
|
|
118
180
|
? scanCustomAgentSkills(customByKey[key])
|
package/app/app/globals.css
CHANGED
|
@@ -180,7 +180,7 @@ body {
|
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
.prose {
|
|
183
|
-
font-family: var(--prose-font-override, '
|
|
183
|
+
font-family: var(--prose-font-override, 'IBM Plex Sans', system-ui, sans-serif);
|
|
184
184
|
color: var(--prose-body);
|
|
185
185
|
line-height: 1.85;
|
|
186
186
|
font-size: var(--prose-font-size-override, 0.95rem);
|
|
@@ -238,6 +238,7 @@ body {
|
|
|
238
238
|
|
|
239
239
|
/* Ask Panel — compact prose for side panel chat bubbles */
|
|
240
240
|
.prose.prose-panel {
|
|
241
|
+
font-family: 'IBM Plex Sans', system-ui, sans-serif;
|
|
241
242
|
font-size: 0.8125rem !important;
|
|
242
243
|
line-height: 1.6;
|
|
243
244
|
}
|
package/app/app/layout.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import ErrorBoundary from '@/components/ErrorBoundary';
|
|
|
9
9
|
import Toaster from '@/components/ui/Toaster';
|
|
10
10
|
import RegisterSW from './register-sw';
|
|
11
11
|
import UpdateOverlay from '@/components/UpdateOverlay';
|
|
12
|
-
import { cookies } from 'next/headers';
|
|
12
|
+
import { cookies, headers } from 'next/headers';
|
|
13
13
|
import type { Locale } from '@/lib/i18n';
|
|
14
14
|
import '@/lib/renderers/index'; // globally register built-in renderers once
|
|
15
15
|
|
|
@@ -67,9 +67,21 @@ export default async function RootLayout({
|
|
|
67
67
|
console.error('[RootLayout] Failed to load file tree:', err);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
// Read locale from cookie
|
|
70
|
+
// Read locale from cookie, or infer from Accept-Language header
|
|
71
|
+
// This matches the client pre-hydration script logic:
|
|
72
|
+
// localStorage > system language preference (via Accept-Language)
|
|
71
73
|
const cookieStore = await cookies();
|
|
72
|
-
const
|
|
74
|
+
const cookieLocale = cookieStore.get('locale')?.value;
|
|
75
|
+
let ssrLocale: Locale = 'en';
|
|
76
|
+
if (cookieLocale === 'zh') {
|
|
77
|
+
ssrLocale = 'zh';
|
|
78
|
+
} else if (cookieLocale !== 'en') {
|
|
79
|
+
// Cookie not set or invalid — infer from Accept-Language header
|
|
80
|
+
// (matches client: navigator.language.startsWith('zh') ? 'zh' : 'en')
|
|
81
|
+
const headerStore = await headers();
|
|
82
|
+
const acceptLanguage = headerStore.get('Accept-Language') || '';
|
|
83
|
+
ssrLocale = acceptLanguage.includes('zh') ? 'zh' : 'en';
|
|
84
|
+
}
|
|
73
85
|
|
|
74
86
|
return (
|
|
75
87
|
<html lang={ssrLocale} suppressHydrationWarning>
|
|
@@ -92,7 +104,7 @@ export default async function RootLayout({
|
|
|
92
104
|
{/* Apply user appearance settings before first paint, preventing flash */}
|
|
93
105
|
<script
|
|
94
106
|
dangerouslySetInnerHTML={{
|
|
95
|
-
__html: `(function(){try{var s=localStorage.getItem('theme');var dark=s&&s!=='system'?s==='dark':window.matchMedia('(prefers-color-scheme: dark)').matches;document.documentElement.classList.toggle('dark',dark);var cw=localStorage.getItem('content-width');if(cw)document.documentElement.style.setProperty('--content-width-override',cw);var pf=localStorage.getItem('prose-font');if(pf==='geist'){pf='inter';localStorage.setItem('prose-font','inter')}var fm={lora:'"Lora", Georgia, serif','ibm-plex-sans':'"IBM Plex Sans", sans-serif',inter:'var(--font-inter), sans-serif','ibm-plex-mono':'"IBM Plex Mono", monospace'};if(pf&&fm[pf])document.documentElement.style.setProperty('--prose-font-override',fm[pf]);var loc=localStorage.getItem('locale')||'system';var rl=loc==='system'?(navigator.language.startsWith('zh')?'zh':'en'):loc;document.documentElement.lang=rl==='zh'?'zh':'en';document.cookie='locale='+rl+';path=/;max-age=31536000;SameSite=Lax'}catch(e){}})();`,
|
|
107
|
+
__html: `(function(){try{var s=localStorage.getItem('theme');var dark=s&&s!=='system'?s==='dark':window.matchMedia('(prefers-color-scheme: dark)').matches;document.documentElement.classList.toggle('dark',dark);var cw=localStorage.getItem('content-width');if(cw)document.documentElement.style.setProperty('--content-width-override',cw);var pf=localStorage.getItem('prose-font');if(pf==='geist'){pf='inter';localStorage.setItem('prose-font','inter')}var fm={lora:'"Lora", Georgia, serif','ibm-plex-sans':'"IBM Plex Sans", sans-serif',inter:'var(--font-inter), sans-serif','ibm-plex-mono':'"IBM Plex Mono", monospace'};if(pf&&fm[pf])document.documentElement.style.setProperty('--prose-font-override',fm[pf]);var loc=localStorage.getItem('locale')||'system';var rl=loc==='system'?(navigator.language.startsWith('zh')?'zh':'en'):loc;window.__mindos_locale__=rl;document.documentElement.lang=rl==='zh'?'zh':'en';document.cookie='locale='+rl+';path=/;max-age=31536000;SameSite=Lax'}catch(e){}})();`,
|
|
96
108
|
}}
|
|
97
109
|
/>
|
|
98
110
|
</head>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { Sparkles } from 'lucide-react';
|
|
4
4
|
import { useLocale } from '@/lib/stores/locale-store';
|
|
5
|
+
import { usePathname } from 'next/navigation';
|
|
5
6
|
|
|
6
7
|
interface AskFabProps {
|
|
7
8
|
/** Toggle the right-side Ask AI panel */
|
|
@@ -12,8 +13,13 @@ interface AskFabProps {
|
|
|
12
13
|
|
|
13
14
|
export default function AskFab({ onToggle, askPanelOpen }: AskFabProps) {
|
|
14
15
|
const { t } = useLocale();
|
|
16
|
+
const pathname = usePathname();
|
|
15
17
|
const label = `${t.ask?.fabLabel ?? 'Ask AI'} (⌘/)`;
|
|
16
18
|
|
|
19
|
+
// Hide on home page — it already has an inline chatbot
|
|
20
|
+
const isHome = pathname === '/' || pathname === '';
|
|
21
|
+
const hidden = askPanelOpen || isHome;
|
|
22
|
+
|
|
17
23
|
return (
|
|
18
24
|
<button
|
|
19
25
|
onClick={onToggle}
|
|
@@ -22,13 +28,13 @@ export default function AskFab({ onToggle, askPanelOpen }: AskFabProps) {
|
|
|
22
28
|
fixed z-40 bottom-5 right-5
|
|
23
29
|
items-center justify-center
|
|
24
30
|
gap-0 hover:gap-2
|
|
25
|
-
p-3 rounded-
|
|
26
|
-
text-
|
|
27
|
-
shadow-
|
|
31
|
+
p-3 rounded-2xl
|
|
32
|
+
text-[var(--amber-foreground)] font-medium text-[13px]
|
|
33
|
+
shadow-md shadow-[var(--amber)]/15
|
|
28
34
|
transition-all duration-200 ease-out
|
|
29
|
-
hover:shadow-
|
|
35
|
+
hover:shadow-lg hover:shadow-[var(--amber)]/20
|
|
30
36
|
active:scale-95 cursor-pointer overflow-hidden
|
|
31
|
-
${
|
|
37
|
+
${hidden ? 'opacity-0 pointer-events-none translate-y-2' : 'opacity-100 translate-y-0'}
|
|
32
38
|
`}
|
|
33
39
|
style={{
|
|
34
40
|
background: 'var(--amber)',
|
|
@@ -29,7 +29,7 @@ export default function AskModal({ open, onClose, currentFile, initialMessage, i
|
|
|
29
29
|
role="dialog"
|
|
30
30
|
aria-modal="true"
|
|
31
31
|
aria-label={t.ask.title}
|
|
32
|
-
className="w-full md:max-w-2xl md:mx-4 bg-card border-t md:border border-border rounded-t-2xl md:rounded-
|
|
32
|
+
className="w-full md:max-w-2xl md:mx-4 bg-card border-t md:border border-border/60 rounded-t-2xl md:rounded-2xl shadow-2xl flex flex-col h-[92vh] md:h-auto md:max-h-[75vh]"
|
|
33
33
|
>
|
|
34
34
|
<AskContent
|
|
35
35
|
visible={open}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
import { createFileAction, deleteFileAction, renameFileAction, renameSpaceAction, deleteSpaceAction, convertToSpaceAction, deleteFolderAction, undoDeleteAction } from '@/lib/actions';
|
|
13
13
|
import { toast } from '@/lib/toast';
|
|
14
14
|
import { useLocale } from '@/lib/stores/locale-store';
|
|
15
|
+
import { quickDropToDirectory } from '@/lib/inbox-upload';
|
|
15
16
|
import { ConfirmDialog } from '@/components/agents/AgentsPrimitives';
|
|
16
17
|
import { usePinnedFiles } from '@/lib/hooks/usePinnedFiles';
|
|
17
18
|
import { checkAiAvailable, triggerSpaceAiInit } from '@/lib/space-ai-init';
|
|
@@ -318,6 +319,81 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
|
|
|
318
319
|
const [deleteConfirm, setDeleteConfirm] = useState<null | 'space' | 'folder'>(null);
|
|
319
320
|
const [isPendingDelete, startDeleteTransition] = useTransition();
|
|
320
321
|
|
|
322
|
+
// ── External file drop target ──
|
|
323
|
+
const [isDragTarget, setIsDragTarget] = useState(false);
|
|
324
|
+
const autoExpandTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
325
|
+
const dragLeaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
326
|
+
|
|
327
|
+
const clearAutoExpand = useCallback(() => {
|
|
328
|
+
if (autoExpandTimerRef.current) {
|
|
329
|
+
clearTimeout(autoExpandTimerRef.current);
|
|
330
|
+
autoExpandTimerRef.current = null;
|
|
331
|
+
}
|
|
332
|
+
}, []);
|
|
333
|
+
|
|
334
|
+
// Use dragOver (fires continuously while hovering) for highlight.
|
|
335
|
+
// Clear highlight with a short delay on dragLeave — if dragOver fires again
|
|
336
|
+
// within the delay, the highlight stays. This avoids flicker from nested elements.
|
|
337
|
+
const handleRowDragOver = useCallback((e: React.DragEvent) => {
|
|
338
|
+
if (!e.dataTransfer.types.includes('Files')) return;
|
|
339
|
+
e.preventDefault();
|
|
340
|
+
e.stopPropagation();
|
|
341
|
+
e.dataTransfer.dropEffect = 'copy';
|
|
342
|
+
if (dragLeaveTimerRef.current) {
|
|
343
|
+
clearTimeout(dragLeaveTimerRef.current);
|
|
344
|
+
dragLeaveTimerRef.current = null;
|
|
345
|
+
}
|
|
346
|
+
if (!isDragTarget) setIsDragTarget(true);
|
|
347
|
+
}, [isDragTarget]);
|
|
348
|
+
|
|
349
|
+
const handleRowDragEnter = useCallback((e: React.DragEvent) => {
|
|
350
|
+
if (!e.dataTransfer.types.includes('Files')) return;
|
|
351
|
+
e.preventDefault();
|
|
352
|
+
e.stopPropagation();
|
|
353
|
+
setIsDragTarget(true);
|
|
354
|
+
// Auto-expand collapsed directory after 500ms hover
|
|
355
|
+
clearAutoExpand();
|
|
356
|
+
if (!open) {
|
|
357
|
+
autoExpandTimerRef.current = setTimeout(() => {
|
|
358
|
+
setOpen(true);
|
|
359
|
+
autoExpandTimerRef.current = null;
|
|
360
|
+
}, 500);
|
|
361
|
+
}
|
|
362
|
+
}, [open, clearAutoExpand]);
|
|
363
|
+
|
|
364
|
+
const handleRowDragLeave = useCallback((e: React.DragEvent) => {
|
|
365
|
+
if (!e.dataTransfer.types.includes('Files')) return;
|
|
366
|
+
e.stopPropagation();
|
|
367
|
+
// Delay clearing so dragOver on the same row can cancel it
|
|
368
|
+
dragLeaveTimerRef.current = setTimeout(() => {
|
|
369
|
+
setIsDragTarget(false);
|
|
370
|
+
clearAutoExpand();
|
|
371
|
+
dragLeaveTimerRef.current = null;
|
|
372
|
+
}, 50);
|
|
373
|
+
}, [clearAutoExpand]);
|
|
374
|
+
|
|
375
|
+
const handleRowDrop = useCallback((e: React.DragEvent) => {
|
|
376
|
+
e.preventDefault();
|
|
377
|
+
e.stopPropagation();
|
|
378
|
+
setIsDragTarget(false);
|
|
379
|
+
clearAutoExpand();
|
|
380
|
+
if (dragLeaveTimerRef.current) {
|
|
381
|
+
clearTimeout(dragLeaveTimerRef.current);
|
|
382
|
+
dragLeaveTimerRef.current = null;
|
|
383
|
+
}
|
|
384
|
+
const files = e.dataTransfer.files;
|
|
385
|
+
if (files.length > 0) {
|
|
386
|
+
void quickDropToDirectory(Array.from(files), node.path, t);
|
|
387
|
+
}
|
|
388
|
+
}, [node.path, t, clearAutoExpand]);
|
|
389
|
+
|
|
390
|
+
useEffect(() => {
|
|
391
|
+
return () => {
|
|
392
|
+
clearAutoExpand();
|
|
393
|
+
if (dragLeaveTimerRef.current) clearTimeout(dragLeaveTimerRef.current);
|
|
394
|
+
};
|
|
395
|
+
}, [clearAutoExpand]);
|
|
396
|
+
|
|
321
397
|
const toggle = useCallback(() => setOpen(v => !v), []);
|
|
322
398
|
|
|
323
399
|
const prevMaxOpenDepth = useRef<number | null | undefined>(undefined);
|
|
@@ -421,8 +497,14 @@ function DirectoryNode({ node, depth, currentPath, onNavigate, maxOpenDepth, onI
|
|
|
421
497
|
return (
|
|
422
498
|
<div>
|
|
423
499
|
<div
|
|
424
|
-
className=
|
|
500
|
+
className={`relative group/dir flex items-center transition-colors duration-100 ${
|
|
501
|
+
isDragTarget ? 'bg-[var(--amber)]/10 rounded-md' : ''
|
|
502
|
+
}`}
|
|
425
503
|
onContextMenu={handleContextMenu}
|
|
504
|
+
onDragEnter={handleRowDragEnter}
|
|
505
|
+
onDragOver={handleRowDragOver}
|
|
506
|
+
onDragLeave={handleRowDragLeave}
|
|
507
|
+
onDrop={handleRowDrop}
|
|
426
508
|
>
|
|
427
509
|
<button
|
|
428
510
|
onClick={toggle}
|