@geminilight/mindos 0.6.53 → 0.6.54
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 +27 -5
- package/README_zh.md +27 -5
- package/_standalone/.mindos-build-version +1 -1
- package/_standalone/.next/BUILD_ID +1 -1
- package/_standalone/.next/app-path-routes-manifest.json +23 -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 +18 -2
- package/_standalone/.next/routes-manifest.json +18 -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.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 +2 -2
- package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- 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 +3 -3
- package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask/route.js +5 -5
- 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.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.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.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 +2 -2
- 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.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/raw/route.js +1 -0
- package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -0
- package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -0
- package/_standalone/.next/server/app/api/file/route.js +1 -1
- package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/files/route.js.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.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.nft.json +1 -1
- package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/route.js +1 -1
- package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/init/route.js.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.nft.json +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js.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.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.nft.json +1 -1
- package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route_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_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.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.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_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.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 +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 +2 -0
- package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -0
- package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -0
- 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 +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 -0
- package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -0
- package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -0
- package/_standalone/.next/server/app-paths-manifest.json +23 -20
- package/_standalone/.next/server/chunks/2190.js +2 -2
- package/_standalone/.next/server/chunks/2364.js +2 -0
- package/_standalone/.next/server/chunks/357.js +1 -0
- package/_standalone/.next/server/chunks/530.js +219 -0
- package/_standalone/.next/server/chunks/6054.js +52 -0
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/8388.js +2 -2
- package/_standalone/.next/server/chunks/953.js +4 -4
- 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/2hrwFOLEOZhHQHfrIt-Dw/_buildManifest.js +1 -0
- package/_standalone/.next/static/chunks/1053-2874859f7caefa0f.js +29 -0
- package/_standalone/.next/static/chunks/178-105779afb62d36d9.js +1 -0
- package/_standalone/.next/static/chunks/1814.b08e9fb85dd3b13c.js +1 -0
- package/_standalone/.next/static/chunks/{1880-3ec02adc80531825.js → 1880-7abf971bcfd2389b.js} +2 -2
- package/_standalone/.next/static/chunks/{3160-83a7e0b94414b3ac.js → 2218-d54538000574ffef.js} +1 -1
- package/_standalone/.next/static/chunks/254-32719a9bea2e74f0.js +1 -0
- package/_standalone/.next/static/chunks/362.a77be2f206db7b19.js +1 -0
- package/_standalone/.next/static/chunks/4237-ffc6e7c15d4007b6.js +1 -0
- package/_standalone/.next/static/chunks/7035-2af69391c7b1ad95.js +1 -0
- package/_standalone/.next/static/chunks/7322-d67d05067544864c.js +1 -0
- package/_standalone/.next/static/chunks/{6926-4af497b83952fa87.js → 8409-de5726a4a278d28f.js} +1 -1
- package/_standalone/.next/static/chunks/8753-ea9db680b0f70f25.js +1 -0
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-b07a5983e85bc5e3.js → route-e240db6d5049d336.js} +1 -1
- package/_standalone/.next/static/chunks/app/_global-error/{page-b07a5983e85bc5e3.js → page-e240db6d5049d336.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-f006a70f6889eb56.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/page-bd522e428e3acb78.js +5 -0
- package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-b07a5983e85bc5e3.js → route-e240db6d5049d336.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-b07a5983e85bc5e3.js → route-e240db6d5049d336.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/raw/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/changes/page-5a72144d1080a699.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/[segment]/{page-88df174dd64b2c76.js → page-6710da1f581b2854.js} +2 -2
- package/_standalone/.next/static/chunks/app/echo/page-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/explore/{page-5eb2835e9e3ab4bb.js → page-d3d99308146c2240.js} +1 -1
- package/_standalone/.next/static/chunks/app/global-error-c37d50db6128ec01.js +1 -0
- package/_standalone/.next/static/chunks/app/help/page-222df603080b5fab.js +1 -0
- package/_standalone/.next/static/chunks/app/inbox/history/page-07819cf95cb0805f.js +1 -0
- package/_standalone/.next/static/chunks/app/layout-8eacff5813458190.js +186 -0
- package/_standalone/.next/static/chunks/app/loading-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/login/{page-24236460fa7c11d0.js → page-0eeef685052869a6.js} +1 -1
- package/_standalone/.next/static/chunks/app/page-5a6c9455efe8a0df.js +7 -0
- package/_standalone/.next/static/chunks/app/setup/{page-99f40e9337388cda.js → page-9a81fa4d82c6351b.js} +1 -1
- package/_standalone/.next/static/chunks/app/trash/page-72d0ae3649ac4b6c.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/not-found-fc04c2bd4f35bc6f.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/page-e8699f96589c0979.js +12 -0
- package/_standalone/.next/static/chunks/app/wiki/page-d492256a93f0b8bc.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e240db6d5049d336.js +1 -0
- package/_standalone/.next/static/chunks/{webpack-bbd44cbc83dc0aa4.js → webpack-73c9da80c6c1ebfe.js} +1 -1
- package/_standalone/.next/static/css/66f8a81e4eda06d4.css +1 -0
- package/_standalone/.next/static/css/a4a2b71142b311af.css +31 -0
- package/_standalone/.next/trace +64 -64
- package/_standalone/.next/types/routes.d.ts +5 -2
- package/_standalone/.next/types/validator.ts +27 -0
- package/_standalone/__tests__/agents/agents-content-dashboard.test.tsx +1 -0
- package/_standalone/__tests__/agents/agents-content-model.test.ts +13 -0
- package/_standalone/__tests__/core/inbox.test.ts +168 -0
- package/_standalone/__tests__/core/sync.test.ts +37 -0
- package/_standalone/__tests__/panels/agents-panel-hub.test.tsx +1 -0
- package/_standalone/app/globals.css +29 -3
- package/_standalone/components/ActivityBar.tsx +9 -9
- package/_standalone/components/AskFab.tsx +1 -1
- package/_standalone/components/Backlinks.tsx +1 -1
- package/_standalone/components/Breadcrumb.tsx +1 -1
- package/_standalone/components/CreateSpaceModal.tsx +1 -1
- package/_standalone/components/EchoSpotlight.tsx +14 -10
- package/_standalone/components/Editor.tsx +1 -1
- package/_standalone/components/ExportModal.tsx +3 -3
- package/_standalone/components/FileTree.tsx +6 -11
- package/_standalone/components/GuideCard.tsx +1 -1
- package/_standalone/components/ImportModal.tsx +1 -2
- package/_standalone/components/KeyboardShortcuts.tsx +1 -1
- package/_standalone/components/MarkdownEditor.tsx +1 -1
- package/_standalone/components/OnboardingView.tsx +2 -2
- package/_standalone/components/OrganizeToast.tsx +3 -1
- package/_standalone/components/Panel.tsx +27 -6
- package/_standalone/components/Sidebar.tsx +1 -1
- package/_standalone/components/SidebarLayout.tsx +30 -7
- package/_standalone/components/SystemPulse.tsx +16 -16
- package/_standalone/components/agents/AgentsOverviewSection.tsx +18 -92
- package/_standalone/components/agents/AgentsPanelA2aTab.tsx +67 -66
- package/_standalone/components/agents/AgentsPrimitives.tsx +1 -1
- package/_standalone/components/agents/RecentActivityFeed.tsx +6 -6
- package/_standalone/components/agents/SkillDetailPopover.tsx +1 -1
- package/_standalone/components/ask/AskHeader.tsx +1 -1
- package/_standalone/components/echo/EchoHero.tsx +1 -1
- package/_standalone/components/echo/EchoPageSections.tsx +1 -1
- package/_standalone/components/explore/UseCaseCard.tsx +1 -1
- package/_standalone/components/home/InboxSection.tsx +262 -54
- package/_standalone/components/panels/AgentsPanel.tsx +4 -3
- package/_standalone/components/panels/AgentsPanelAgentDetail.tsx +1 -1
- package/_standalone/components/panels/AgentsPanelHubNav.tsx +10 -6
- package/_standalone/components/panels/PanelHeader.tsx +1 -1
- package/_standalone/components/renderers/audio/AudioRenderer.tsx +79 -0
- package/_standalone/components/renderers/image/ImageRenderer.tsx +203 -0
- package/_standalone/components/renderers/pdf/PdfRenderer.tsx +57 -0
- package/_standalone/components/renderers/video/VideoRenderer.tsx +91 -0
- package/_standalone/components/settings/McpTab.tsx +154 -28
- package/_standalone/components/settings/PluginsTab.tsx +1 -1
- package/_standalone/components/settings/SettingsContent.tsx +41 -7
- package/_standalone/components/settings/types.ts +7 -1
- package/_standalone/components/walkthrough/WalkthroughOverlay.tsx +1 -1
- package/_standalone/components/walkthrough/WalkthroughTooltip.tsx +1 -1
- package/_standalone/hooks/useAiOrganize.ts +14 -1
- package/_standalone/lib/organize-history.ts +6 -0
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/api/file/raw/route.ts +121 -0
- package/app/app/api/file/route.ts +21 -0
- package/app/app/api/inbox/route.ts +38 -2
- package/app/app/api/mcp/status/route.ts +1 -0
- package/app/app/api/settings/route.ts +13 -0
- package/app/app/api/setup/route.ts +11 -1
- package/app/app/api/sync/route.ts +36 -13
- package/app/app/global-error.tsx +3 -3
- package/app/app/globals.css +29 -3
- package/app/app/inbox/history/page.tsx +250 -0
- package/app/app/layout.tsx +5 -11
- package/app/app/login/page.tsx +1 -1
- package/app/app/view/[...path]/ViewPageClient.tsx +15 -10
- package/app/app/view/[...path]/not-found.tsx +1 -1
- package/app/app/view/[...path]/page.tsx +32 -1
- package/app/app/wiki/page.tsx +58 -0
- package/app/components/ActivityBar.tsx +9 -9
- package/app/components/AskFab.tsx +1 -1
- package/app/components/Backlinks.tsx +1 -1
- package/app/components/Breadcrumb.tsx +1 -1
- package/app/components/CreateSpaceModal.tsx +1 -1
- package/app/components/DirView.tsx +2 -2
- package/app/components/EchoSpotlight.tsx +14 -10
- package/app/components/Editor.tsx +1 -1
- package/app/components/ExportModal.tsx +3 -3
- package/app/components/FileTree.tsx +6 -11
- package/app/components/GuideCard.tsx +1 -1
- package/app/components/HomeContent.tsx +50 -39
- package/app/components/ImportModal.tsx +1 -2
- package/app/components/KeyboardShortcuts.tsx +1 -1
- package/app/components/MarkdownEditor.tsx +1 -1
- package/app/components/OnboardingView.tsx +2 -2
- package/app/components/OrganizeToast.tsx +3 -1
- package/app/components/Panel.tsx +27 -6
- package/app/components/Sidebar.tsx +1 -1
- package/app/components/SidebarLayout.tsx +30 -7
- package/app/components/SystemPulse.tsx +16 -16
- package/app/components/TrashPageClient.tsx +8 -6
- package/app/components/UpdateOverlay.tsx +1 -1
- package/app/components/WikiHomeContent.tsx +273 -0
- package/app/components/agents/AgentDetailContent.tsx +5 -5
- package/app/components/agents/AgentsContentPage.tsx +14 -3
- package/app/components/agents/AgentsOverviewSection.tsx +18 -92
- package/app/components/agents/AgentsPanelA2aTab.tsx +67 -66
- package/app/components/agents/AgentsPrimitives.tsx +1 -1
- package/app/components/agents/RecentActivityFeed.tsx +6 -6
- package/app/components/agents/SkillDetailPopover.tsx +1 -1
- package/app/components/agents/agents-content-model.ts +4 -1
- package/app/components/ask/AskHeader.tsx +1 -1
- package/app/components/changes/ChangesContentPage.tsx +10 -6
- package/app/components/echo/EchoHero.tsx +1 -1
- package/app/components/echo/EchoPageSections.tsx +1 -1
- package/app/components/explore/ExploreContent.tsx +1 -1
- package/app/components/explore/UseCaseCard.tsx +1 -1
- package/app/components/help/HelpContent.tsx +3 -3
- package/app/components/home/InboxSection.tsx +262 -54
- package/app/components/panels/AgentsPanel.tsx +4 -3
- package/app/components/panels/AgentsPanelAgentDetail.tsx +1 -1
- package/app/components/panels/AgentsPanelHubNav.tsx +10 -6
- package/app/components/panels/PanelHeader.tsx +1 -1
- package/app/components/renderers/audio/AudioRenderer.tsx +79 -0
- package/app/components/renderers/audio/manifest.ts +17 -0
- package/app/components/renderers/image/ImageRenderer.tsx +203 -0
- package/app/components/renderers/image/manifest.ts +17 -0
- package/app/components/renderers/pdf/PdfRenderer.tsx +57 -0
- package/app/components/renderers/pdf/manifest.ts +15 -0
- package/app/components/renderers/video/VideoRenderer.tsx +91 -0
- package/app/components/renderers/video/manifest.ts +17 -0
- package/app/components/settings/McpTab.tsx +154 -28
- package/app/components/settings/PluginsTab.tsx +1 -1
- package/app/components/settings/SettingsContent.tsx +41 -7
- package/app/components/settings/types.ts +7 -1
- package/app/components/setup/index.tsx +4 -3
- package/app/components/walkthrough/WalkthroughOverlay.tsx +1 -1
- package/app/components/walkthrough/WalkthroughTooltip.tsx +1 -1
- package/app/hooks/useAiOrganize.ts +14 -1
- package/app/lib/core/inbox.ts +131 -2
- package/app/lib/core/pdf-text.ts +28 -0
- package/app/lib/core/search-index.ts +29 -5
- package/app/lib/core/tree.ts +6 -1
- package/app/lib/fs.ts +31 -3
- package/app/lib/i18n/modules/ai-chat.ts +34 -0
- package/app/lib/i18n/modules/knowledge.ts +30 -0
- package/app/lib/i18n/modules/navigation.ts +4 -2
- package/app/lib/i18n/modules/panels.ts +22 -4
- package/app/lib/i18n/modules/settings.ts +26 -0
- package/app/lib/organize-history.ts +6 -0
- package/app/lib/renderers/index.ts +5 -1
- package/app/lib/settings.ts +28 -0
- package/bin/commands/doctor.js +12 -6
- package/bin/commands/file.js +7 -4
- package/bin/commands/logs.js +39 -4
- package/bin/commands/onboard.js +1 -1
- package/bin/commands/open.js +6 -1
- package/bin/commands/space.js +7 -4
- package/bin/commands/update.js +8 -18
- package/bin/lib/build.js +19 -8
- package/bin/lib/cli-shim.js +67 -2
- package/bin/lib/config.js +4 -5
- package/bin/lib/gateway.js +10 -23
- package/bin/lib/jsonc.js +7 -2
- package/bin/lib/mcp-agents.js +26 -5
- package/bin/lib/path-expand.js +6 -3
- package/bin/lib/port.js +5 -1
- package/bin/lib/stop.js +72 -51
- package/bin/lib/sync.js +1 -1
- package/package.json +1 -1
- package/scripts/setup.js +7 -5
- package/_standalone/.next/server/chunks/3436.js +0 -52
- package/_standalone/.next/server/chunks/5648.js +0 -2
- package/_standalone/.next/server/chunks/8408.js +0 -219
- package/_standalone/.next/static/W-wLgvhPtPJ5Psq9V4i3M/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/1053-17786066ecd6f216.js +0 -29
- package/_standalone/.next/static/chunks/1814.72f7fe7c61e2b647.js +0 -1
- package/_standalone/.next/static/chunks/362.4c226d7887d5f696.js +0 -1
- package/_standalone/.next/static/chunks/6357-c645842834c0d4cd.js +0 -1
- package/_standalone/.next/static/chunks/6981-3d7dcac2d12a5670.js +0 -1
- package/_standalone/.next/static/chunks/7035-032641fb6f4e07b2.js +0 -1
- package/_standalone/.next/static/chunks/7144-5febf62f1a79fe64.js +0 -1
- package/_standalone/.next/static/chunks/9602-423291fdb36396d1.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-074d6aafc2606561.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/page-710d8c80fa86e93e.js +0 -5
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/changes/page-350992cf5091bc5b.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/page-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/global-error-e1ad0e18236ba26c.js +0 -1
- package/_standalone/.next/static/chunks/app/help/page-2325d25b6846ca07.js +0 -1
- package/_standalone/.next/static/chunks/app/layout-e5d2fb384207d821.js +0 -186
- package/_standalone/.next/static/chunks/app/loading-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/page-54edd045d3448df5.js +0 -7
- package/_standalone/.next/static/chunks/app/trash/page-6372bb3f5463affa.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/not-found-61474670d6bb6116.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-f3d1d87190dcfe28.js +0 -12
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/css/bbf51803eade6c50.css +0 -31
- package/_standalone/.next/static/css/ef1151f74f00d91a.css +0 -1
- /package/_standalone/.next/static/{W-wLgvhPtPJ5Psq9V4i3M → 2hrwFOLEOZhHQHfrIt-Dw}/_ssgManifest.js +0 -0
|
@@ -184,12 +184,14 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
|
|
|
184
184
|
}, [handleOpenImport]);
|
|
185
185
|
|
|
186
186
|
// ── Inbox: batch AI organize from InboxSection ──
|
|
187
|
+
const organizedFileNamesRef = useRef<string[]>([]);
|
|
187
188
|
useEffect(() => {
|
|
188
189
|
const handler = (e: Event) => {
|
|
189
190
|
const files = (e as CustomEvent).detail?.files as Array<{ name: string; path: string }> | undefined;
|
|
190
191
|
if (!files || files.length === 0 || aiOrganize.phase === 'organizing') return;
|
|
191
192
|
|
|
192
193
|
const prompt = t.inbox.organizePrompt(files.map(f => f.name));
|
|
194
|
+
organizedFileNamesRef.current = files.map(f => f.name);
|
|
193
195
|
|
|
194
196
|
(async () => {
|
|
195
197
|
const attachments: Array<{ name: string; content: string }> = [];
|
|
@@ -203,7 +205,7 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
|
|
|
203
205
|
} catch { /* skip unreadable files */ }
|
|
204
206
|
}
|
|
205
207
|
if (attachments.length > 0) {
|
|
206
|
-
aiOrganize.start(attachments, prompt);
|
|
208
|
+
aiOrganize.start(attachments, prompt, 'inbox-organize');
|
|
207
209
|
} else {
|
|
208
210
|
toast.error(t.inbox.organizeFailed, 4000);
|
|
209
211
|
window.dispatchEvent(new Event('mindos:organize-done'));
|
|
@@ -214,12 +216,28 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
|
|
|
214
216
|
return () => window.removeEventListener('mindos:inbox-organize', handler);
|
|
215
217
|
}, [aiOrganize, t]);
|
|
216
218
|
|
|
217
|
-
// Notify InboxSection when organize finishes
|
|
219
|
+
// Notify InboxSection when organize finishes + clean up source inbox files
|
|
218
220
|
useEffect(() => {
|
|
219
|
-
if (aiOrganize.phase === 'done'
|
|
221
|
+
if (aiOrganize.phase === 'done') {
|
|
222
|
+
const hasSuccessfulChanges = aiOrganize.changes.some(c => c.ok);
|
|
223
|
+
const names = organizedFileNamesRef.current;
|
|
224
|
+
if (hasSuccessfulChanges && names.length > 0) {
|
|
225
|
+
fetch('/api/inbox', {
|
|
226
|
+
method: 'DELETE',
|
|
227
|
+
headers: { 'Content-Type': 'application/json' },
|
|
228
|
+
body: JSON.stringify({ names }),
|
|
229
|
+
})
|
|
230
|
+
.then(() => {
|
|
231
|
+
window.dispatchEvent(new Event('mindos:inbox-updated'));
|
|
232
|
+
})
|
|
233
|
+
.catch(() => { /* best-effort cleanup */ });
|
|
234
|
+
organizedFileNamesRef.current = [];
|
|
235
|
+
}
|
|
236
|
+
window.dispatchEvent(new Event('mindos:organize-done'));
|
|
237
|
+
} else if (aiOrganize.phase === 'error') {
|
|
220
238
|
window.dispatchEvent(new Event('mindos:organize-done'));
|
|
221
239
|
}
|
|
222
|
-
}, [aiOrganize.phase]);
|
|
240
|
+
}, [aiOrganize.phase, aiOrganize.changes]);
|
|
223
241
|
|
|
224
242
|
// Listen for cross-component "open panel" events (e.g. GuideCard → Agents)
|
|
225
243
|
useEffect(() => {
|
|
@@ -381,7 +399,7 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
|
|
|
381
399
|
{/* Skip link */}
|
|
382
400
|
<a
|
|
383
401
|
href="#main-content"
|
|
384
|
-
className="sr-only focus:not-sr-only focus:fixed focus:top-2 focus:left-2 focus:z-[60] focus:px-4 focus:py-2 focus:rounded-lg focus:text-sm focus:font-medium
|
|
402
|
+
className="sr-only focus:not-sr-only focus:fixed focus:top-2 focus:left-2 focus:z-[60] focus:px-4 focus:py-2 focus:rounded-lg focus:text-sm focus:font-medium bg-[var(--amber)] text-[var(--amber-foreground)]"
|
|
385
403
|
>
|
|
386
404
|
Skip to main content
|
|
387
405
|
</a>
|
|
@@ -406,6 +424,11 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
|
|
|
406
424
|
lp.setActivePanel(wasActive ? null : 'discover');
|
|
407
425
|
if (!wasActive) router.push('/explore');
|
|
408
426
|
}}
|
|
427
|
+
onSpacesClick={() => {
|
|
428
|
+
const wasActive = lp.activePanel === 'files';
|
|
429
|
+
lp.setActivePanel(wasActive ? null : 'files');
|
|
430
|
+
if (!wasActive) router.push('/wiki');
|
|
431
|
+
}}
|
|
409
432
|
syncStatus={syncStatus}
|
|
410
433
|
expanded={lp.railExpanded}
|
|
411
434
|
onExpandedChange={handleExpandedChange}
|
|
@@ -509,7 +532,7 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
|
|
|
509
532
|
</button>
|
|
510
533
|
<Link href="/" className="flex items-center gap-2 hover:opacity-80 transition-opacity">
|
|
511
534
|
<Logo id="mobile" />
|
|
512
|
-
<span className="
|
|
535
|
+
<span className="text-foreground text-sm font-brand">MindOS</span>
|
|
513
536
|
</Link>
|
|
514
537
|
<div className="flex items-center gap-0.5">
|
|
515
538
|
<button onClick={openSyncSettings} className="p-3 rounded-lg hover:bg-muted text-muted-foreground hover:text-foreground transition-colors active:bg-accent flex items-center justify-center" aria-label="Sync status">
|
|
@@ -529,7 +552,7 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
|
|
|
529
552
|
<div className="flex items-center justify-between px-4 py-4 border-b border-border shrink-0">
|
|
530
553
|
<Link href="/" className="flex items-center gap-2 hover:opacity-80 transition-opacity">
|
|
531
554
|
<Logo id="drawer" />
|
|
532
|
-
<span className="
|
|
555
|
+
<span className="text-foreground text-sm font-brand">MindOS</span>
|
|
533
556
|
</Link>
|
|
534
557
|
<button onClick={() => setMobileOpen(false)} className="p-1 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors">
|
|
535
558
|
<X size={16} />
|
|
@@ -78,14 +78,14 @@ export default function SystemPulse() {
|
|
|
78
78
|
return (
|
|
79
79
|
<section className="mb-10">
|
|
80
80
|
{/* Use same title style as other sections */}
|
|
81
|
-
<div className="flex items-center gap-2 mb-
|
|
82
|
-
<
|
|
83
|
-
<h2 className="text-
|
|
81
|
+
<div className="flex items-center gap-2.5 mb-5">
|
|
82
|
+
<div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]"><Bot size={13} /></div>
|
|
83
|
+
<h2 className="text-[13px] font-semibold text-foreground tracking-wide">{pulse.title}</h2>
|
|
84
84
|
</div>
|
|
85
|
-
<div className="rounded-xl border border-
|
|
85
|
+
<div className="rounded-xl border border-border/40 bg-card/30 p-5">
|
|
86
86
|
<div className="flex items-center gap-4">
|
|
87
|
-
<div className="w-
|
|
88
|
-
<Bot size={
|
|
87
|
+
<div className="w-10 h-10 rounded-full bg-[var(--amber-subtle)] flex items-center justify-center shrink-0">
|
|
88
|
+
<Bot size={18} className="text-[var(--amber)]" />
|
|
89
89
|
</div>
|
|
90
90
|
<div className="flex-1 min-w-0">
|
|
91
91
|
<p className="text-sm font-medium text-foreground">{pulse.connectTitle}</p>
|
|
@@ -114,10 +114,10 @@ export default function SystemPulse() {
|
|
|
114
114
|
onClick={toggleCollapsed}
|
|
115
115
|
className="w-full flex items-center gap-2 group cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded"
|
|
116
116
|
>
|
|
117
|
-
<
|
|
118
|
-
<h2 className="text-
|
|
117
|
+
<div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]"><Bot size={13} /></div>
|
|
118
|
+
<h2 className="text-[13px] font-semibold text-foreground tracking-wide">{pulse.title}</h2>
|
|
119
119
|
{totalConnected > 0 && (
|
|
120
|
-
<span className="text-
|
|
120
|
+
<span className="inline-flex items-center justify-center min-w-[20px] h-5 px-1.5 text-[10px] font-semibold rounded-full bg-muted text-muted-foreground tabular-nums">{totalConnected}</span>
|
|
121
121
|
)}
|
|
122
122
|
{/* Inline status */}
|
|
123
123
|
<div className="flex items-center gap-2 ml-1">
|
|
@@ -144,11 +144,11 @@ export default function SystemPulse() {
|
|
|
144
144
|
return (
|
|
145
145
|
<section className="mb-10">
|
|
146
146
|
{/* Section title — same pattern as Spaces / Recently Edited */}
|
|
147
|
-
<div className="flex items-center gap-2 mb-
|
|
148
|
-
<
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
147
|
+
<div className="flex items-center gap-2.5 mb-5">
|
|
148
|
+
<div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]"><Bot size={13} /></div>
|
|
149
|
+
<h2 className="text-[13px] font-semibold text-foreground tracking-wide">{pulse.title}</h2>
|
|
150
|
+
{totalConnected > 0 && (
|
|
151
|
+
<span className="inline-flex items-center justify-center min-w-[20px] h-5 px-1.5 text-[10px] font-semibold rounded-full bg-muted text-muted-foreground tabular-nums">{totalConnected}</span>
|
|
152
152
|
)}
|
|
153
153
|
{mcpRunning && (
|
|
154
154
|
<span className="inline-flex items-center gap-1 text-xs text-muted-foreground/50 ml-1">
|
|
@@ -159,7 +159,7 @@ export default function SystemPulse() {
|
|
|
159
159
|
<div className="flex items-center gap-2 ml-auto">
|
|
160
160
|
<Link
|
|
161
161
|
href="/agents"
|
|
162
|
-
className="text-xs font-medium text-[var(--amber)] hover:opacity-80 transition-opacity
|
|
162
|
+
className="text-xs font-medium text-[var(--amber)] hover:opacity-80 transition-opacity"
|
|
163
163
|
>
|
|
164
164
|
{pulse.manage}
|
|
165
165
|
</Link>
|
|
@@ -181,7 +181,7 @@ export default function SystemPulse() {
|
|
|
181
181
|
<Link
|
|
182
182
|
key={agent.key}
|
|
183
183
|
href={`/agents/${encodeURIComponent(agent.key)}`}
|
|
184
|
-
className="flex items-center gap-3 px-3.5 py-3 rounded-xl border border-border hover:border-[var(--amber)]/30 hover:shadow-
|
|
184
|
+
className="flex items-center gap-3 px-3.5 py-3 rounded-xl border border-border hover:border-[var(--amber)]/30 hover:shadow-md hover:-translate-y-0.5 transition-all duration-200 hover:bg-muted/30 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
185
185
|
>
|
|
186
186
|
{/* Avatar */}
|
|
187
187
|
<div className="relative w-8 h-8 rounded-lg bg-[var(--amber)]/8 text-[var(--amber-text)] ring-1 ring-[var(--amber)]/15 flex items-center justify-center text-xs font-semibold font-display shrink-0">
|
|
@@ -96,7 +96,7 @@ export default function TrashPageClient({ initialItems }: { initialItems: TrashM
|
|
|
96
96
|
<div className="content-width xl:mr-[220px] rounded-xl border border-border bg-card px-4 py-3 md:px-5 md:py-4">
|
|
97
97
|
<div className="flex flex-wrap items-start justify-between gap-3">
|
|
98
98
|
<div className="min-w-0">
|
|
99
|
-
<div className="flex items-center gap-2 text-sm font-medium text-foreground
|
|
99
|
+
<div className="flex items-center gap-2 text-sm font-medium text-foreground">
|
|
100
100
|
<Trash2 size={15} />
|
|
101
101
|
{t.trash.title}
|
|
102
102
|
</div>
|
|
@@ -126,10 +126,12 @@ export default function TrashPageClient({ initialItems }: { initialItems: TrashM
|
|
|
126
126
|
<div className="px-4 md:px-6 py-4 md:py-6">
|
|
127
127
|
<div className="content-width xl:mr-[220px]">
|
|
128
128
|
{items.length === 0 ? (
|
|
129
|
-
<div className="rounded-xl border border-
|
|
130
|
-
<
|
|
131
|
-
|
|
132
|
-
|
|
129
|
+
<div className="rounded-xl border border-border/40 bg-card/30 p-12 text-center">
|
|
130
|
+
<div className="inline-flex items-center justify-center w-12 h-12 rounded-full bg-muted/60 mb-4">
|
|
131
|
+
<Trash2 size={22} className="text-muted-foreground/40" />
|
|
132
|
+
</div>
|
|
133
|
+
<p className="text-sm font-medium text-muted-foreground/70">{t.trash.empty}</p>
|
|
134
|
+
<p className="text-xs text-muted-foreground/40 mt-1 max-w-xs mx-auto leading-relaxed">{t.trash.emptySubtext}</p>
|
|
133
135
|
</div>
|
|
134
136
|
) : (
|
|
135
137
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3">
|
|
@@ -227,7 +229,7 @@ export default function TrashPageClient({ initialItems }: { initialItems: TrashM
|
|
|
227
229
|
<div className="bg-card border border-border rounded-xl shadow-xl max-w-sm w-full mx-4 p-5">
|
|
228
230
|
<div className="flex items-center gap-2 mb-3">
|
|
229
231
|
<AlertTriangle size={16} className="text-[var(--amber)]" />
|
|
230
|
-
<h3 className="text-sm font-semibold
|
|
232
|
+
<h3 className="text-sm font-semibold">{t.trash.restoreConflict}</h3>
|
|
231
233
|
</div>
|
|
232
234
|
<p className="text-xs text-muted-foreground mb-4">
|
|
233
235
|
"{conflictItem.fileName}" — {conflictItem.originalPath}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect, useMemo } from 'react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { Brain, ChevronDown, FolderOpen, Plus, Sparkles, Search, FilePlus, ArrowRight } from 'lucide-react';
|
|
6
|
+
import { useLocale } from '@/lib/stores/locale-store';
|
|
7
|
+
import { encodePath, relativeTime, extractEmoji, stripEmoji } from '@/lib/utils';
|
|
8
|
+
import { InboxSection } from '@/components/home/InboxSection';
|
|
9
|
+
import type { SpaceInfo } from '@/app/page';
|
|
10
|
+
|
|
11
|
+
interface RecentFile {
|
|
12
|
+
path: string;
|
|
13
|
+
mtime: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface WikiHomeContentProps {
|
|
17
|
+
spaces: SpaceInfo[];
|
|
18
|
+
recent: RecentFile[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function triggerSearch() {
|
|
22
|
+
window.dispatchEvent(new KeyboardEvent('keydown', { key: 'k', metaKey: true, bubbles: true }));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function triggerAsk() {
|
|
26
|
+
window.dispatchEvent(new KeyboardEvent('keydown', { key: '/', metaKey: true, bubbles: true }));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Calculate the max mtime for a space from recent files
|
|
31
|
+
*/
|
|
32
|
+
function getSpaceLatestMtime(spaceName: string, recentFiles: RecentFile[]): number {
|
|
33
|
+
let maxMtime = 0;
|
|
34
|
+
for (const file of recentFiles) {
|
|
35
|
+
if (file.path.startsWith(`${spaceName}/`)) {
|
|
36
|
+
maxMtime = Math.max(maxMtime, file.mtime);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return maxMtime;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const SPACES_COLLAPSED = 9;
|
|
43
|
+
|
|
44
|
+
export default function WikiHomeContent({ spaces, recent }: WikiHomeContentProps) {
|
|
45
|
+
const { t } = useLocale();
|
|
46
|
+
const [sortBy, setSortBy] = useState<'recent' | 'name' | 'fileCount'>('recent');
|
|
47
|
+
const [showAllSpaces, setShowAllSpaces] = useState(false);
|
|
48
|
+
const [suggestionIdx, setSuggestionIdx] = useState(0);
|
|
49
|
+
|
|
50
|
+
const suggestions = t.ask?.suggestions ?? [
|
|
51
|
+
'Summarize this document',
|
|
52
|
+
'List all action items',
|
|
53
|
+
'What are the key points?',
|
|
54
|
+
'Find related notes',
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
const interval = setInterval(() => {
|
|
59
|
+
setSuggestionIdx(i => (i + 1) % suggestions.length);
|
|
60
|
+
}, 4000);
|
|
61
|
+
return () => clearInterval(interval);
|
|
62
|
+
}, [suggestions.length]);
|
|
63
|
+
|
|
64
|
+
// Sort spaces
|
|
65
|
+
const sortedSpaces = useMemo(() => {
|
|
66
|
+
const sorted = [...spaces];
|
|
67
|
+
if (sortBy === 'recent') {
|
|
68
|
+
sorted.sort((a, b) => {
|
|
69
|
+
const aMtime = getSpaceLatestMtime(a.name, recent);
|
|
70
|
+
const bMtime = getSpaceLatestMtime(b.name, recent);
|
|
71
|
+
return bMtime - aMtime;
|
|
72
|
+
});
|
|
73
|
+
} else if (sortBy === 'name') {
|
|
74
|
+
sorted.sort((a, b) => a.name.localeCompare(b.name));
|
|
75
|
+
} else if (sortBy === 'fileCount') {
|
|
76
|
+
sorted.sort((a, b) => b.fileCount - a.fileCount);
|
|
77
|
+
}
|
|
78
|
+
return sorted;
|
|
79
|
+
}, [spaces, recent, sortBy]);
|
|
80
|
+
|
|
81
|
+
const visibleSpaces = showAllSpaces ? sortedSpaces : sortedSpaces.slice(0, SPACES_COLLAPSED);
|
|
82
|
+
const formatTime = (mtime: number) => relativeTime(mtime, t.home.relativeTime);
|
|
83
|
+
const lastFile = recent[0];
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<div className="content-width px-4 md:px-6 py-10 md:py-14">
|
|
87
|
+
|
|
88
|
+
{/* ══════════ Hero ══════════ */}
|
|
89
|
+
<div className="mb-10">
|
|
90
|
+
<div className="flex items-center gap-3 mb-6">
|
|
91
|
+
<div className="w-1 h-7 rounded-full bg-gradient-to-b from-[var(--amber)] to-[var(--amber)]/20" />
|
|
92
|
+
<h1 className="text-2xl font-semibold tracking-tight text-foreground">
|
|
93
|
+
{t.sidebar.files}
|
|
94
|
+
</h1>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
{/* Command bar */}
|
|
98
|
+
<div className="w-full max-w-xl flex flex-col sm:flex-row items-stretch sm:items-center gap-2 pl-4">
|
|
99
|
+
<button
|
|
100
|
+
onClick={triggerAsk}
|
|
101
|
+
title="⌘/"
|
|
102
|
+
className="flex-1 flex items-center gap-3 px-4 py-3.5 rounded-xl border border-border/50 shadow-sm bg-card/80 backdrop-blur-sm transition-all duration-200 hover:border-[var(--amber)]/40 hover:shadow-md hover:-translate-y-0.5 group"
|
|
103
|
+
>
|
|
104
|
+
<Sparkles size={16} className="shrink-0 text-[var(--amber)] group-hover:scale-110 transition-transform duration-150" />
|
|
105
|
+
<div className="flex-1 min-h-[1.5rem] flex items-center">
|
|
106
|
+
<span
|
|
107
|
+
key={suggestionIdx}
|
|
108
|
+
className="text-sm text-left text-muted-foreground animate-in fade-in duration-300"
|
|
109
|
+
>
|
|
110
|
+
{suggestions[suggestionIdx]}
|
|
111
|
+
</span>
|
|
112
|
+
</div>
|
|
113
|
+
<kbd className="hidden sm:inline-flex items-center gap-0.5 px-2 py-0.5 rounded text-xs font-mono font-medium bg-[var(--amber-dim)] text-[var(--amber-text)]">
|
|
114
|
+
⌘/
|
|
115
|
+
</kbd>
|
|
116
|
+
</button>
|
|
117
|
+
<button
|
|
118
|
+
onClick={triggerSearch}
|
|
119
|
+
title="⌘K"
|
|
120
|
+
className="flex items-center gap-2 px-3.5 py-3 rounded-xl border border-border/50 text-sm text-muted-foreground transition-all duration-200 shrink-0 hover:bg-muted/60 hover:shadow-sm hover:-translate-y-0.5"
|
|
121
|
+
>
|
|
122
|
+
<Search size={14} />
|
|
123
|
+
<kbd className="hidden sm:inline-flex items-center px-1.5 py-0.5 rounded text-xs font-mono bg-muted">
|
|
124
|
+
⌘K
|
|
125
|
+
</kbd>
|
|
126
|
+
</button>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
{/* Quick actions */}
|
|
130
|
+
<div className="flex items-center gap-3 mt-4 pl-4">
|
|
131
|
+
<Link
|
|
132
|
+
href="/view/Untitled.md"
|
|
133
|
+
className="inline-flex items-center gap-2 px-4 py-2.5 rounded-lg text-sm font-medium transition-all duration-200 hover:shadow-md hover:-translate-y-0.5 bg-[var(--amber)] text-[var(--amber-foreground)]"
|
|
134
|
+
>
|
|
135
|
+
<FilePlus size={14} />
|
|
136
|
+
<span>{t.home.newNote}</span>
|
|
137
|
+
</Link>
|
|
138
|
+
{lastFile && (
|
|
139
|
+
<Link
|
|
140
|
+
href={`/view/${encodePath(lastFile.path)}`}
|
|
141
|
+
className="inline-flex items-center gap-2 px-3.5 py-2 rounded-lg text-sm font-medium transition-colors text-muted-foreground hover:text-foreground hover:bg-muted"
|
|
142
|
+
>
|
|
143
|
+
<ArrowRight size={14} className="text-[var(--amber)]/60" />
|
|
144
|
+
<span>{t.home.continueEditing}</span>
|
|
145
|
+
<span className="text-xs opacity-40 truncate max-w-32" suppressHydrationWarning>
|
|
146
|
+
{lastFile.path.split('/').pop()}
|
|
147
|
+
</span>
|
|
148
|
+
</Link>
|
|
149
|
+
)}
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
{/* ══════════ Spaces Grid ══════════ */}
|
|
154
|
+
<section className="mb-10">
|
|
155
|
+
<div className="flex items-center gap-2.5 mb-5">
|
|
156
|
+
<div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]">
|
|
157
|
+
<Brain size={14} />
|
|
158
|
+
</div>
|
|
159
|
+
<h2 className="text-[13px] font-semibold text-foreground tracking-wide">
|
|
160
|
+
{t.home.spaces}
|
|
161
|
+
</h2>
|
|
162
|
+
{spaces.length > 0 && (
|
|
163
|
+
<span className="inline-flex items-center justify-center min-w-[20px] h-5 px-1.5 text-[10px] font-semibold rounded-full bg-muted text-muted-foreground tabular-nums">
|
|
164
|
+
{spaces.length}
|
|
165
|
+
</span>
|
|
166
|
+
)}
|
|
167
|
+
<div className="ml-auto flex items-center gap-3">
|
|
168
|
+
{spaces.length > 0 && (
|
|
169
|
+
<select
|
|
170
|
+
value={sortBy}
|
|
171
|
+
onChange={(e) => setSortBy(e.target.value as typeof sortBy)}
|
|
172
|
+
className="text-xs font-medium text-muted-foreground hover:text-foreground cursor-pointer focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring rounded px-2 py-1 transition-colors bg-transparent"
|
|
173
|
+
>
|
|
174
|
+
<option value="recent">{t.home.sortRecent ?? 'Recent'}</option>
|
|
175
|
+
<option value="name">{t.home.sortName ?? 'A-Z'}</option>
|
|
176
|
+
<option value="fileCount">{t.home.sortCount ?? 'File Count'}</option>
|
|
177
|
+
</select>
|
|
178
|
+
)}
|
|
179
|
+
<button
|
|
180
|
+
onClick={() => window.dispatchEvent(new Event('mindos:create-space'))}
|
|
181
|
+
className="flex items-center gap-1.5 text-xs font-medium text-[var(--amber)] transition-colors hover:opacity-80 cursor-pointer font-display"
|
|
182
|
+
>
|
|
183
|
+
<Plus size={12} />
|
|
184
|
+
<span>{t.home.newSpace}</span>
|
|
185
|
+
</button>
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
{spaces.length === 0 ? (
|
|
190
|
+
<div className="rounded-xl border border-border/40 bg-card/30 px-6 py-12 text-center">
|
|
191
|
+
<div className="inline-flex items-center justify-center w-12 h-12 rounded-full bg-[var(--amber-subtle)] mb-4">
|
|
192
|
+
<Brain size={22} className="text-[var(--amber)]/60" />
|
|
193
|
+
</div>
|
|
194
|
+
<p className="text-sm font-medium text-muted-foreground/70 mb-1">
|
|
195
|
+
{t.home.noSpacesYet ?? 'No spaces yet'}
|
|
196
|
+
</p>
|
|
197
|
+
<p className="text-xs text-muted-foreground/60 mb-4">
|
|
198
|
+
Create your first space to organize your knowledge
|
|
199
|
+
</p>
|
|
200
|
+
<button
|
|
201
|
+
onClick={() => window.dispatchEvent(new Event('mindos:create-space'))}
|
|
202
|
+
className="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors bg-[var(--amber)] text-[var(--amber-foreground)] hover:opacity-80"
|
|
203
|
+
>
|
|
204
|
+
<Plus size={14} />
|
|
205
|
+
Create Space
|
|
206
|
+
</button>
|
|
207
|
+
</div>
|
|
208
|
+
) : (
|
|
209
|
+
<>
|
|
210
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2">
|
|
211
|
+
{visibleSpaces.map((space) => {
|
|
212
|
+
const emoji = extractEmoji(space.name);
|
|
213
|
+
const label = stripEmoji(space.name);
|
|
214
|
+
const latestMtime = getSpaceLatestMtime(space.name, recent);
|
|
215
|
+
const isEmpty = space.fileCount === 0;
|
|
216
|
+
|
|
217
|
+
return (
|
|
218
|
+
<Link
|
|
219
|
+
key={space.name}
|
|
220
|
+
href={`/view/${encodePath(space.path)}`}
|
|
221
|
+
className={`flex items-start gap-3 px-4 py-3.5 rounded-xl border transition-all duration-200 ${
|
|
222
|
+
isEmpty
|
|
223
|
+
? 'border-dashed border-border/50 opacity-50 hover:opacity-70'
|
|
224
|
+
: 'border-border/60 hover:border-[var(--amber)]/30 hover:shadow-md hover:-translate-y-0.5 bg-card/40'
|
|
225
|
+
}`}
|
|
226
|
+
>
|
|
227
|
+
{emoji ? (
|
|
228
|
+
<span className="text-lg leading-none shrink-0 mt-0.5" suppressHydrationWarning>{emoji}</span>
|
|
229
|
+
) : (
|
|
230
|
+
<FolderOpen size={16} className="shrink-0 text-[var(--amber)] mt-0.5" />
|
|
231
|
+
)}
|
|
232
|
+
<div className="min-w-0 flex-1">
|
|
233
|
+
<span className="text-sm font-medium truncate block text-foreground">{label}</span>
|
|
234
|
+
{space.description && (
|
|
235
|
+
<span className="text-xs text-muted-foreground line-clamp-1 mt-0.5" suppressHydrationWarning>
|
|
236
|
+
{space.description}
|
|
237
|
+
</span>
|
|
238
|
+
)}
|
|
239
|
+
<span className="text-xs text-muted-foreground/50 mt-0.5 block tabular-nums">
|
|
240
|
+
{t.home.nFiles(space.fileCount)}
|
|
241
|
+
{latestMtime > 0 && ` · ${formatTime(latestMtime)}`}
|
|
242
|
+
</span>
|
|
243
|
+
</div>
|
|
244
|
+
</Link>
|
|
245
|
+
);
|
|
246
|
+
})}
|
|
247
|
+
</div>
|
|
248
|
+
|
|
249
|
+
{sortedSpaces.length > SPACES_COLLAPSED && (
|
|
250
|
+
<button
|
|
251
|
+
onClick={() => setShowAllSpaces(!showAllSpaces)}
|
|
252
|
+
aria-expanded={showAllSpaces}
|
|
253
|
+
className="flex items-center gap-1.5 text-xs font-medium text-[var(--amber)] transition-colors hover:opacity-80 cursor-pointer font-display mt-3"
|
|
254
|
+
>
|
|
255
|
+
<ChevronDown size={12} className={`transition-transform duration-200 ${showAllSpaces ? 'rotate-180' : ''}`} />
|
|
256
|
+
<span>{showAllSpaces ? t.home.showLess : t.home.showMore}</span>
|
|
257
|
+
</button>
|
|
258
|
+
)}
|
|
259
|
+
</>
|
|
260
|
+
)}
|
|
261
|
+
</section>
|
|
262
|
+
|
|
263
|
+
{/* ══════════ Inbox ══════════ */}
|
|
264
|
+
<InboxSection />
|
|
265
|
+
|
|
266
|
+
{/* Footer */}
|
|
267
|
+
<div className="py-6 border-t border-border/20 flex items-center gap-1.5 text-xs font-display text-muted-foreground/30">
|
|
268
|
+
<Sparkles size={10} className="text-[var(--amber)]/40" />
|
|
269
|
+
<span>{t.app.footer}</span>
|
|
270
|
+
</div>
|
|
271
|
+
</div>
|
|
272
|
+
);
|
|
273
|
+
}
|
|
@@ -251,7 +251,7 @@ export default function AgentDetailContent({ agentKey }: { agentKey: string }) {
|
|
|
251
251
|
<div className="flex items-center gap-3.5 px-5 py-4">
|
|
252
252
|
<AgentAvatar name={agent.name} status={status} size="md" />
|
|
253
253
|
<div className="min-w-0 flex-1">
|
|
254
|
-
<h1 className="text-lg font-semibold tracking-tight
|
|
254
|
+
<h1 className="text-lg font-semibold tracking-tight text-foreground truncate">{agent.name}</h1>
|
|
255
255
|
<div className="flex flex-wrap items-center gap-x-2 gap-y-0.5 mt-0.5 text-2xs text-muted-foreground/60">
|
|
256
256
|
<span className={`font-medium px-1.5 py-px rounded-full ${
|
|
257
257
|
status === 'connected' ? 'bg-muted text-muted-foreground'
|
|
@@ -902,7 +902,7 @@ function KnowledgeInteractionSection() {
|
|
|
902
902
|
<BookOpen size={12} className="text-muted-foreground/50" />
|
|
903
903
|
{d?.knowledgeInteraction ?? 'Knowledge Interaction'}
|
|
904
904
|
</h2>
|
|
905
|
-
<div className="rounded-lg border border-
|
|
905
|
+
<div className="rounded-lg border border-border/40 bg-card/30 px-4 py-6 text-center">
|
|
906
906
|
<BookOpen size={20} className="text-muted-foreground/30 mx-auto mb-2" />
|
|
907
907
|
<p className="text-2xs text-muted-foreground/50">{d?.knowledgeNoData ?? 'No interactions yet. Agents will show activity here once they start working with your knowledge base.'}</p>
|
|
908
908
|
</div>
|
|
@@ -920,7 +920,7 @@ function KnowledgeInteractionSection() {
|
|
|
920
920
|
</h2>
|
|
921
921
|
<Link
|
|
922
922
|
href={`/view/${encodePath('.mindos/agent-audit-log.json')}`}
|
|
923
|
-
className="text-2xs font-medium text-[var(--amber)] hover:opacity-80 transition-opacity
|
|
923
|
+
className="text-2xs font-medium text-[var(--amber)] hover:opacity-80 transition-opacity"
|
|
924
924
|
>
|
|
925
925
|
{d?.viewFullLog ?? 'View log'} →
|
|
926
926
|
</Link>
|
|
@@ -961,7 +961,7 @@ function KnowledgeInteractionSection() {
|
|
|
961
961
|
{/* Timeline */}
|
|
962
962
|
<div className="border-t border-border/40">
|
|
963
963
|
<div className="px-4 py-2 flex items-center justify-between">
|
|
964
|
-
<p className="text-2xs text-muted-foreground/40 uppercase tracking-wider
|
|
964
|
+
<p className="text-2xs text-muted-foreground/40 uppercase tracking-wider">{d?.recentOps ?? 'Recent operations'}</p>
|
|
965
965
|
</div>
|
|
966
966
|
{visible.map((ev, i) => {
|
|
967
967
|
const kind = classifyTool(ev.tool);
|
|
@@ -1039,7 +1039,7 @@ function ActivitySection({ agent }: { agent: AgentInfo }) {
|
|
|
1039
1039
|
<StatCard label={d.activityLast7d} value={agent.runtimeUsageSignal ? 'Active' : '—'} />
|
|
1040
1040
|
</div>
|
|
1041
1041
|
) : (
|
|
1042
|
-
<div className="rounded-lg border border-
|
|
1042
|
+
<div className="rounded-lg border border-border/40 bg-card/30 px-4 py-6 text-center">
|
|
1043
1043
|
<Activity size={20} className="text-muted-foreground/30 mx-auto mb-2" />
|
|
1044
1044
|
<p className="text-2xs text-muted-foreground/50">{d.activityNoData}</p>
|
|
1045
1045
|
</div>
|
|
@@ -62,16 +62,18 @@ export default function AgentsContentPage({ tab }: { tab: AgentsDashboardTab })
|
|
|
62
62
|
}, [a, tab]);
|
|
63
63
|
|
|
64
64
|
const buckets = useMemo(() => bucketAgents(mcp.agents), [mcp.agents]);
|
|
65
|
+
const mcpEnabled = mcp.status?.connectionMode?.mcp ?? false;
|
|
65
66
|
const riskQueue = useMemo(
|
|
66
67
|
() =>
|
|
67
68
|
buildRiskQueue({
|
|
68
69
|
mcpRunning: !!mcp.status?.running,
|
|
70
|
+
mcpEnabled,
|
|
69
71
|
detectedCount: buckets.detected.length,
|
|
70
72
|
notFoundCount: buckets.notFound.length,
|
|
71
73
|
allSkillsDisabled: mcp.skills.length > 0 && mcp.skills.every((s) => !s.enabled),
|
|
72
74
|
copy: a.overview,
|
|
73
75
|
}),
|
|
74
|
-
[mcp.skills, mcp.status?.running, buckets.detected.length, buckets.notFound.length, a.overview],
|
|
76
|
+
[mcp.skills, mcp.status?.running, mcpEnabled, buckets.detected.length, buckets.notFound.length, a.overview],
|
|
75
77
|
);
|
|
76
78
|
const enabledSkillCount = useMemo(
|
|
77
79
|
() => mcp.skills.filter((skill) => skill.enabled).length,
|
|
@@ -89,7 +91,7 @@ export default function AgentsContentPage({ tab }: { tab: AgentsDashboardTab })
|
|
|
89
91
|
return (
|
|
90
92
|
<div className="content-width px-4 md:px-6 py-8 md:py-10">
|
|
91
93
|
<header className="mb-6">
|
|
92
|
-
<h1 className="text-2xl font-semibold tracking-tight
|
|
94
|
+
<h1 className="text-2xl font-semibold tracking-tight text-foreground">{pageHeader.title}</h1>
|
|
93
95
|
<p className="mt-1 text-sm text-muted-foreground">{pageHeader.subtitle}</p>
|
|
94
96
|
</header>
|
|
95
97
|
|
|
@@ -104,6 +106,7 @@ export default function AgentsContentPage({ tab }: { tab: AgentsDashboardTab })
|
|
|
104
106
|
mcpRunning={!!mcp.status?.running}
|
|
105
107
|
mcpPort={mcp.status?.port ?? null}
|
|
106
108
|
mcpToolCount={mcp.status?.toolCount ?? 0}
|
|
109
|
+
mcpEnabled={mcpEnabled}
|
|
107
110
|
enabledSkillCount={enabledSkillCount}
|
|
108
111
|
allAgents={mcp.agents}
|
|
109
112
|
pulseCopy={a.workspacePulse}
|
|
@@ -111,10 +114,18 @@ export default function AgentsContentPage({ tab }: { tab: AgentsDashboardTab })
|
|
|
111
114
|
/>
|
|
112
115
|
)}
|
|
113
116
|
|
|
114
|
-
{tab === 'mcp' && (
|
|
117
|
+
{tab === 'mcp' && mcpEnabled && (
|
|
115
118
|
<AgentsMcpSection copy={{ ...a.mcp, status: a.status }} mcp={mcp} buckets={buckets} copyState={null} onCopySnippet={copySnippet} />
|
|
116
119
|
)}
|
|
117
120
|
|
|
121
|
+
{/* MCP tab accessed but mode disabled — show hint */}
|
|
122
|
+
{tab === 'mcp' && !mcpEnabled && !mcp.loading && (
|
|
123
|
+
<div className="flex flex-col items-center justify-center py-16 text-center">
|
|
124
|
+
<p className="text-sm text-muted-foreground">{a.mcp?.mcpDisabledMessage ?? 'MCP mode is not enabled.'}</p>
|
|
125
|
+
<p className="text-xs text-muted-foreground/60 mt-1">{a.mcp?.mcpDisabledHint ?? 'Enable it in Settings → Connections to use MCP agents.'}</p>
|
|
126
|
+
</div>
|
|
127
|
+
)}
|
|
128
|
+
|
|
118
129
|
{tab === 'skills' && (
|
|
119
130
|
<AgentsSkillsSection copy={a.skills} mcp={mcp} buckets={buckets} />
|
|
120
131
|
)}
|