@geminilight/mindos 0.6.53 → 0.6.55
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 +28 -25
- 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 +28 -25
- package/_standalone/.next/server/chunks/1981.js +52 -0
- 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/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/QXZErVsiRQxfqUnWMUsH6/_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-45e66033ba1bdb05.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-71bd113f66bd7617.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-ba3802cf675d029a.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-35da7f9f5a009292.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/__tests__/settings/update-tab-desktop.test.tsx +40 -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/UpdateTab.tsx +18 -2
- 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/page.tsx +3 -3
- 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/UpdateTab.tsx +18 -2
- 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 +32 -4
- 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 → QXZErVsiRQxfqUnWMUsH6}/_ssgManifest.js +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// This file is generated automatically by Next.js
|
|
2
2
|
// Do not edit this file manually
|
|
3
3
|
|
|
4
|
-
type AppRoutes = "/" | "/agents" | "/agents/[agentKey]" | "/changes" | "/echo" | "/echo/[segment]" | "/explore" | "/help" | "/login" | "/setup" | "/trash" | "/view/[...path]"
|
|
5
|
-
type AppRouteHandlerRoutes = "/.well-known/agent-card.json" | "/api/a2a" | "/api/a2a/agents" | "/api/a2a/delegations" | "/api/a2a/discover" | "/api/acp/config" | "/api/acp/detect" | "/api/acp/install" | "/api/acp/registry" | "/api/acp/session" | "/api/agent-activity" | "/api/ask" | "/api/ask-sessions" | "/api/auth" | "/api/backlinks" | "/api/bootstrap" | "/api/changes" | "/api/export" | "/api/extract-pdf" | "/api/file" | "/api/file/import" | "/api/files" | "/api/git" | "/api/graph" | "/api/health" | "/api/inbox" | "/api/init" | "/api/mcp/agents" | "/api/mcp/install" | "/api/mcp/install-skill" | "/api/mcp/restart" | "/api/mcp/status" | "/api/mcp/uninstall" | "/api/monitoring" | "/api/recent-files" | "/api/restart" | "/api/search" | "/api/settings" | "/api/settings/list-models" | "/api/settings/reset-token" | "/api/settings/test-key" | "/api/setup" | "/api/setup/check-path" | "/api/setup/check-port" | "/api/setup/generate-token" | "/api/setup/ls" | "/api/skills" | "/api/sync" | "/api/tree-version" | "/api/uninstall" | "/api/update" | "/api/update-check" | "/api/update-status" | "/api/workflows"
|
|
4
|
+
type AppRoutes = "/" | "/agents" | "/agents/[agentKey]" | "/changes" | "/echo" | "/echo/[segment]" | "/explore" | "/help" | "/inbox/history" | "/login" | "/setup" | "/trash" | "/view/[...path]" | "/wiki"
|
|
5
|
+
type AppRouteHandlerRoutes = "/.well-known/agent-card.json" | "/api/a2a" | "/api/a2a/agents" | "/api/a2a/delegations" | "/api/a2a/discover" | "/api/acp/config" | "/api/acp/detect" | "/api/acp/install" | "/api/acp/registry" | "/api/acp/session" | "/api/agent-activity" | "/api/ask" | "/api/ask-sessions" | "/api/auth" | "/api/backlinks" | "/api/bootstrap" | "/api/changes" | "/api/export" | "/api/extract-pdf" | "/api/file" | "/api/file/import" | "/api/file/raw" | "/api/files" | "/api/git" | "/api/graph" | "/api/health" | "/api/inbox" | "/api/init" | "/api/mcp/agents" | "/api/mcp/install" | "/api/mcp/install-skill" | "/api/mcp/restart" | "/api/mcp/status" | "/api/mcp/uninstall" | "/api/monitoring" | "/api/recent-files" | "/api/restart" | "/api/search" | "/api/settings" | "/api/settings/list-models" | "/api/settings/reset-token" | "/api/settings/test-key" | "/api/setup" | "/api/setup/check-path" | "/api/setup/check-port" | "/api/setup/generate-token" | "/api/setup/ls" | "/api/skills" | "/api/sync" | "/api/tree-version" | "/api/uninstall" | "/api/update" | "/api/update-check" | "/api/update-status" | "/api/workflows"
|
|
6
6
|
type PageRoutes = never
|
|
7
7
|
type LayoutRoutes = "/"
|
|
8
8
|
type RedirectRoutes = never
|
|
@@ -35,6 +35,7 @@ interface ParamMap {
|
|
|
35
35
|
"/api/extract-pdf": {}
|
|
36
36
|
"/api/file": {}
|
|
37
37
|
"/api/file/import": {}
|
|
38
|
+
"/api/file/raw": {}
|
|
38
39
|
"/api/files": {}
|
|
39
40
|
"/api/git": {}
|
|
40
41
|
"/api/graph": {}
|
|
@@ -73,10 +74,12 @@ interface ParamMap {
|
|
|
73
74
|
"/echo/[segment]": { "segment": string; }
|
|
74
75
|
"/explore": {}
|
|
75
76
|
"/help": {}
|
|
77
|
+
"/inbox/history": {}
|
|
76
78
|
"/login": {}
|
|
77
79
|
"/setup": {}
|
|
78
80
|
"/trash": {}
|
|
79
81
|
"/view/[...path]": { "path": string[]; }
|
|
82
|
+
"/wiki": {}
|
|
80
83
|
}
|
|
81
84
|
|
|
82
85
|
|
|
@@ -110,6 +110,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
|
|
|
110
110
|
type __Unused = __Check
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
+
// Validate ../../app/inbox/history/page.tsx
|
|
114
|
+
{
|
|
115
|
+
type __IsExpected<Specific extends AppPageConfig<"/inbox/history">> = Specific
|
|
116
|
+
const handler = {} as typeof import("../../app/inbox/history/page.js")
|
|
117
|
+
type __Check = __IsExpected<typeof handler>
|
|
118
|
+
// @ts-ignore
|
|
119
|
+
type __Unused = __Check
|
|
120
|
+
}
|
|
121
|
+
|
|
113
122
|
// Validate ../../app/login/page.tsx
|
|
114
123
|
{
|
|
115
124
|
type __IsExpected<Specific extends AppPageConfig<"/login">> = Specific
|
|
@@ -155,6 +164,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
|
|
|
155
164
|
type __Unused = __Check
|
|
156
165
|
}
|
|
157
166
|
|
|
167
|
+
// Validate ../../app/wiki/page.tsx
|
|
168
|
+
{
|
|
169
|
+
type __IsExpected<Specific extends AppPageConfig<"/wiki">> = Specific
|
|
170
|
+
const handler = {} as typeof import("../../app/wiki/page.js")
|
|
171
|
+
type __Check = __IsExpected<typeof handler>
|
|
172
|
+
// @ts-ignore
|
|
173
|
+
type __Unused = __Check
|
|
174
|
+
}
|
|
175
|
+
|
|
158
176
|
// Validate ../../app/.well-known/agent-card.json/route.ts
|
|
159
177
|
{
|
|
160
178
|
type __IsExpected<Specific extends RouteHandlerConfig<"/.well-known/agent-card.json">> = Specific
|
|
@@ -335,6 +353,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
|
|
|
335
353
|
type __Unused = __Check
|
|
336
354
|
}
|
|
337
355
|
|
|
356
|
+
// Validate ../../app/api/file/raw/route.ts
|
|
357
|
+
{
|
|
358
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/file/raw">> = Specific
|
|
359
|
+
const handler = {} as typeof import("../../app/api/file/raw/route.js")
|
|
360
|
+
type __Check = __IsExpected<typeof handler>
|
|
361
|
+
// @ts-ignore
|
|
362
|
+
type __Unused = __Check
|
|
363
|
+
}
|
|
364
|
+
|
|
338
365
|
// Validate ../../app/api/file/route.ts
|
|
339
366
|
{
|
|
340
367
|
type __IsExpected<Specific extends RouteHandlerConfig<"/api/file">> = Specific
|
|
@@ -144,11 +144,24 @@ describe('MCP workspace model helpers', () => {
|
|
|
144
144
|
it('builds risk queue from mcp running state and buckets (notFound excluded)', () => {
|
|
145
145
|
const queue = buildMcpRiskQueue({
|
|
146
146
|
mcpRunning: false,
|
|
147
|
+
mcpEnabled: true,
|
|
147
148
|
detectedCount: 2,
|
|
148
149
|
notFoundCount: 1,
|
|
149
150
|
});
|
|
150
151
|
expect(queue.length).toBe(2);
|
|
151
152
|
});
|
|
153
|
+
|
|
154
|
+
it('omits mcp-stopped risk when mcpEnabled is false', () => {
|
|
155
|
+
const queue = buildMcpRiskQueue({
|
|
156
|
+
mcpRunning: false,
|
|
157
|
+
mcpEnabled: false,
|
|
158
|
+
detectedCount: 2,
|
|
159
|
+
notFoundCount: 1,
|
|
160
|
+
});
|
|
161
|
+
// Only detected-unconfigured, no mcp-stopped
|
|
162
|
+
expect(queue.length).toBe(1);
|
|
163
|
+
expect(queue[0].id).toBe('detected-unconfigured');
|
|
164
|
+
});
|
|
152
165
|
});
|
|
153
166
|
|
|
154
167
|
describe('aggregateCrossAgentMcpServers', () => {
|
|
@@ -7,6 +7,9 @@ import {
|
|
|
7
7
|
ensureInboxSpace,
|
|
8
8
|
listInboxFiles,
|
|
9
9
|
saveToInbox,
|
|
10
|
+
deleteFromInbox,
|
|
11
|
+
archiveFromInbox,
|
|
12
|
+
listProcessedFiles,
|
|
10
13
|
} from '@/lib/core/inbox';
|
|
11
14
|
|
|
12
15
|
describe('ensureInboxSpace', () => {
|
|
@@ -248,3 +251,168 @@ describe('saveToInbox', () => {
|
|
|
248
251
|
expect(readSeeded(mindRoot, 'Inbox/encoded.md')).toContain('Hello from base64!');
|
|
249
252
|
});
|
|
250
253
|
});
|
|
254
|
+
|
|
255
|
+
describe('deleteFromInbox', () => {
|
|
256
|
+
let mindRoot: string;
|
|
257
|
+
|
|
258
|
+
beforeEach(() => { mindRoot = mkTempMindRoot(); });
|
|
259
|
+
afterEach(() => { cleanupMindRoot(mindRoot); });
|
|
260
|
+
|
|
261
|
+
it('deletes existing files by name', () => {
|
|
262
|
+
ensureInboxSpace(mindRoot);
|
|
263
|
+
seedFile(mindRoot, `${INBOX_DIR}/a.md`, 'aaa');
|
|
264
|
+
seedFile(mindRoot, `${INBOX_DIR}/b.md`, 'bbb');
|
|
265
|
+
|
|
266
|
+
const result = deleteFromInbox(mindRoot, ['a.md', 'b.md']);
|
|
267
|
+
expect(result.deleted).toEqual(['a.md', 'b.md']);
|
|
268
|
+
expect(result.notFound).toEqual([]);
|
|
269
|
+
expect(fs.existsSync(path.join(mindRoot, INBOX_DIR, 'a.md'))).toBe(false);
|
|
270
|
+
expect(fs.existsSync(path.join(mindRoot, INBOX_DIR, 'b.md'))).toBe(false);
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it('reports not-found for missing files', () => {
|
|
274
|
+
ensureInboxSpace(mindRoot);
|
|
275
|
+
const result = deleteFromInbox(mindRoot, ['nonexistent.md']);
|
|
276
|
+
expect(result.deleted).toEqual([]);
|
|
277
|
+
expect(result.notFound).toEqual(['nonexistent.md']);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it('refuses to delete system files', () => {
|
|
281
|
+
ensureInboxSpace(mindRoot);
|
|
282
|
+
const result = deleteFromInbox(mindRoot, ['INSTRUCTION.md', 'README.md']);
|
|
283
|
+
expect(result.deleted).toEqual([]);
|
|
284
|
+
expect(fs.existsSync(path.join(mindRoot, INBOX_DIR, 'INSTRUCTION.md'))).toBe(true);
|
|
285
|
+
expect(fs.existsSync(path.join(mindRoot, INBOX_DIR, 'README.md'))).toBe(true);
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
it('handles mixed existing and missing files', () => {
|
|
289
|
+
ensureInboxSpace(mindRoot);
|
|
290
|
+
seedFile(mindRoot, `${INBOX_DIR}/real.md`, 'content');
|
|
291
|
+
|
|
292
|
+
const result = deleteFromInbox(mindRoot, ['real.md', 'fake.md']);
|
|
293
|
+
expect(result.deleted).toEqual(['real.md']);
|
|
294
|
+
expect(result.notFound).toEqual(['fake.md']);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it('ignores empty or invalid names', () => {
|
|
298
|
+
ensureInboxSpace(mindRoot);
|
|
299
|
+
const result = deleteFromInbox(mindRoot, ['', null as unknown as string]);
|
|
300
|
+
expect(result.deleted).toEqual([]);
|
|
301
|
+
expect(result.notFound).toEqual([]);
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
it('prevents path traversal attempts', () => {
|
|
305
|
+
ensureInboxSpace(mindRoot);
|
|
306
|
+
seedFile(mindRoot, 'outside.md', 'should not be deleted');
|
|
307
|
+
|
|
308
|
+
const result = deleteFromInbox(mindRoot, ['../outside.md']);
|
|
309
|
+
expect(result.notFound).toEqual(['../outside.md']);
|
|
310
|
+
expect(fs.existsSync(path.join(mindRoot, 'outside.md'))).toBe(true);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
describe('archiveFromInbox', () => {
|
|
315
|
+
let mindRoot: string;
|
|
316
|
+
|
|
317
|
+
beforeEach(() => { mindRoot = mkTempMindRoot(); });
|
|
318
|
+
afterEach(() => { cleanupMindRoot(mindRoot); });
|
|
319
|
+
|
|
320
|
+
it('moves files to .processed/ with timestamp prefix', () => {
|
|
321
|
+
ensureInboxSpace(mindRoot);
|
|
322
|
+
seedFile(mindRoot, `${INBOX_DIR}/notes.md`, '# Notes');
|
|
323
|
+
|
|
324
|
+
const result = archiveFromInbox(mindRoot, ['notes.md']);
|
|
325
|
+
expect(result.archived).toHaveLength(1);
|
|
326
|
+
expect(result.archived[0].original).toBe('notes.md');
|
|
327
|
+
expect(result.archived[0].archivedPath).toMatch(/^Inbox\/\.processed\/\d{8}-\d{6}_notes\.md$/);
|
|
328
|
+
expect(result.notFound).toEqual([]);
|
|
329
|
+
|
|
330
|
+
expect(fs.existsSync(path.join(mindRoot, INBOX_DIR, 'notes.md'))).toBe(false);
|
|
331
|
+
|
|
332
|
+
const processedDir = path.join(mindRoot, INBOX_DIR, '.processed');
|
|
333
|
+
const processedFiles = fs.readdirSync(processedDir);
|
|
334
|
+
expect(processedFiles).toHaveLength(1);
|
|
335
|
+
expect(processedFiles[0]).toMatch(/^\d{8}-\d{6}_notes\.md$/);
|
|
336
|
+
|
|
337
|
+
const content = fs.readFileSync(path.join(processedDir, processedFiles[0]), 'utf-8');
|
|
338
|
+
expect(content).toBe('# Notes');
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
it('reports not-found for missing files', () => {
|
|
342
|
+
ensureInboxSpace(mindRoot);
|
|
343
|
+
const result = archiveFromInbox(mindRoot, ['nonexistent.md']);
|
|
344
|
+
expect(result.archived).toEqual([]);
|
|
345
|
+
expect(result.notFound).toEqual(['nonexistent.md']);
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it('refuses to archive system files', () => {
|
|
349
|
+
ensureInboxSpace(mindRoot);
|
|
350
|
+
const result = archiveFromInbox(mindRoot, ['INSTRUCTION.md', 'README.md']);
|
|
351
|
+
expect(result.archived).toEqual([]);
|
|
352
|
+
expect(fs.existsSync(path.join(mindRoot, INBOX_DIR, 'INSTRUCTION.md'))).toBe(true);
|
|
353
|
+
expect(fs.existsSync(path.join(mindRoot, INBOX_DIR, 'README.md'))).toBe(true);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
it('handles mixed existing and missing files', () => {
|
|
357
|
+
ensureInboxSpace(mindRoot);
|
|
358
|
+
seedFile(mindRoot, `${INBOX_DIR}/real.md`, 'content');
|
|
359
|
+
|
|
360
|
+
const result = archiveFromInbox(mindRoot, ['real.md', 'fake.md']);
|
|
361
|
+
expect(result.archived).toHaveLength(1);
|
|
362
|
+
expect(result.notFound).toEqual(['fake.md']);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('creates .processed/ directory if it does not exist', () => {
|
|
366
|
+
ensureInboxSpace(mindRoot);
|
|
367
|
+
seedFile(mindRoot, `${INBOX_DIR}/a.md`, 'aaa');
|
|
368
|
+
|
|
369
|
+
const processedDir = path.join(mindRoot, INBOX_DIR, '.processed');
|
|
370
|
+
expect(fs.existsSync(processedDir)).toBe(false);
|
|
371
|
+
|
|
372
|
+
archiveFromInbox(mindRoot, ['a.md']);
|
|
373
|
+
expect(fs.existsSync(processedDir)).toBe(true);
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
it('archived files are hidden from listInboxFiles', () => {
|
|
377
|
+
ensureInboxSpace(mindRoot);
|
|
378
|
+
seedFile(mindRoot, `${INBOX_DIR}/visible.md`, 'visible');
|
|
379
|
+
|
|
380
|
+
expect(listInboxFiles(mindRoot)).toHaveLength(1);
|
|
381
|
+
|
|
382
|
+
archiveFromInbox(mindRoot, ['visible.md']);
|
|
383
|
+
|
|
384
|
+
expect(listInboxFiles(mindRoot)).toHaveLength(0);
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
describe('listProcessedFiles', () => {
|
|
389
|
+
let mindRoot: string;
|
|
390
|
+
|
|
391
|
+
beforeEach(() => { mindRoot = mkTempMindRoot(); });
|
|
392
|
+
afterEach(() => { cleanupMindRoot(mindRoot); });
|
|
393
|
+
|
|
394
|
+
it('returns empty array when .processed/ does not exist', () => {
|
|
395
|
+
expect(listProcessedFiles(mindRoot)).toEqual([]);
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
it('lists archived files sorted by date', () => {
|
|
399
|
+
ensureInboxSpace(mindRoot);
|
|
400
|
+
seedFile(mindRoot, `${INBOX_DIR}/a.md`, 'a');
|
|
401
|
+
seedFile(mindRoot, `${INBOX_DIR}/b.md`, 'b');
|
|
402
|
+
archiveFromInbox(mindRoot, ['a.md', 'b.md']);
|
|
403
|
+
|
|
404
|
+
const files = listProcessedFiles(mindRoot);
|
|
405
|
+
expect(files).toHaveLength(2);
|
|
406
|
+
expect(files[0].originalName).toMatch(/\.(md|csv|json)$/);
|
|
407
|
+
expect(files[0].path).toContain('.processed/');
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
it('extracts original name by stripping timestamp prefix', () => {
|
|
411
|
+
ensureInboxSpace(mindRoot);
|
|
412
|
+
seedFile(mindRoot, `${INBOX_DIR}/report.md`, 'content');
|
|
413
|
+
archiveFromInbox(mindRoot, ['report.md']);
|
|
414
|
+
|
|
415
|
+
const files = listProcessedFiles(mindRoot);
|
|
416
|
+
expect(files[0].originalName).toBe('report.md');
|
|
417
|
+
});
|
|
418
|
+
});
|
|
@@ -315,3 +315,40 @@ describe('sync: config management', () => {
|
|
|
315
315
|
expect(reloaded.mindRoot).toBe(mindRoot);
|
|
316
316
|
});
|
|
317
317
|
});
|
|
318
|
+
|
|
319
|
+
describe('sync: path traversal protection', () => {
|
|
320
|
+
beforeEach(setup);
|
|
321
|
+
afterEach(cleanup);
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Helper to test if a file path is safely within mindRoot
|
|
325
|
+
* (mirrors the isPathWithinMindRoot function in sync/route.ts)
|
|
326
|
+
*/
|
|
327
|
+
function isPathWithinMindRoot(mindRootDir: string, filePath: string): boolean {
|
|
328
|
+
const normalizedPath = path.resolve(mindRootDir, filePath);
|
|
329
|
+
return normalizedPath.startsWith(mindRootDir + '/') || normalizedPath === mindRootDir;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
it('allows normal relative paths', () => {
|
|
333
|
+
expect(isPathWithinMindRoot(mindRoot, 'notes/todo.md')).toBe(true);
|
|
334
|
+
expect(isPathWithinMindRoot(mindRoot, 'README.md')).toBe(true);
|
|
335
|
+
expect(isPathWithinMindRoot(mindRoot, 'deep/nested/file.md')).toBe(true);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('blocks path traversal with ../', () => {
|
|
339
|
+
expect(isPathWithinMindRoot(mindRoot, '../etc/passwd')).toBe(false);
|
|
340
|
+
expect(isPathWithinMindRoot(mindRoot, '../../etc/passwd')).toBe(false);
|
|
341
|
+
expect(isPathWithinMindRoot(mindRoot, 'notes/../../../etc/passwd')).toBe(false);
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it('blocks absolute paths outside mindRoot', () => {
|
|
345
|
+
expect(isPathWithinMindRoot(mindRoot, '/etc/passwd')).toBe(false);
|
|
346
|
+
expect(isPathWithinMindRoot(mindRoot, '/tmp/malicious')).toBe(false);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it('allows paths that start with .. but resolve within mindRoot', () => {
|
|
350
|
+
// e.g., notes/../README.md resolves to mindRoot/README.md
|
|
351
|
+
expect(isPathWithinMindRoot(mindRoot, 'notes/../README.md')).toBe(true);
|
|
352
|
+
expect(isPathWithinMindRoot(mindRoot, './notes/../notes/todo.md')).toBe(true);
|
|
353
|
+
});
|
|
354
|
+
});
|
|
@@ -126,4 +126,44 @@ describe('Desktop UpdateTab error handling', () => {
|
|
|
126
126
|
|
|
127
127
|
expect(host.textContent).toContain("You're up to date");
|
|
128
128
|
});
|
|
129
|
+
|
|
130
|
+
it('resets state to idle on mount to clear stale state after app restart', async () => {
|
|
131
|
+
// This test verifies the fix for: restart → 'state' still 'downloading' → button disabled
|
|
132
|
+
mockBridge.checkUpdate.mockResolvedValue({ available: true, version: '0.2.0' });
|
|
133
|
+
|
|
134
|
+
const { UpdateTab } = await import('@/components/settings/UpdateTab');
|
|
135
|
+
|
|
136
|
+
// First render (before restart)
|
|
137
|
+
await act(async () => { root.render(<UpdateTab />); });
|
|
138
|
+
|
|
139
|
+
const updateBtn = Array.from(host.querySelectorAll('button'))
|
|
140
|
+
.find(b => b.textContent?.includes('Update to v0.2.0'));
|
|
141
|
+
expect(updateBtn).toBeTruthy();
|
|
142
|
+
expect((updateBtn as HTMLButtonElement).disabled).toBe(false);
|
|
143
|
+
|
|
144
|
+
// User clicks update, state becomes 'downloading'
|
|
145
|
+
await act(async () => { updateBtn!.click(); });
|
|
146
|
+
await act(async () => { await Promise.resolve(); });
|
|
147
|
+
|
|
148
|
+
// In real scenario, app restarts here and component remounts
|
|
149
|
+
// Unmount and create new root to simulate fresh load
|
|
150
|
+
await act(async () => { root.unmount(); });
|
|
151
|
+
host.remove();
|
|
152
|
+
|
|
153
|
+
const newHost = document.createElement('div');
|
|
154
|
+
document.body.appendChild(newHost);
|
|
155
|
+
const newRoot = createRoot(newHost);
|
|
156
|
+
|
|
157
|
+
await act(async () => { newRoot.render(<UpdateTab />); });
|
|
158
|
+
|
|
159
|
+
// CRITICAL: After remount, the "Check for Updates" button should be ENABLED
|
|
160
|
+
// (not disabled like before the fix)
|
|
161
|
+
const checkBtn = Array.from(newHost.querySelectorAll('button'))
|
|
162
|
+
.find(b => b.textContent?.includes('Check for Updates'));
|
|
163
|
+
expect(checkBtn).toBeTruthy();
|
|
164
|
+
expect((checkBtn as HTMLButtonElement).disabled).toBe(false); // Must be enabled!
|
|
165
|
+
|
|
166
|
+
await act(async () => { newRoot.unmount(); });
|
|
167
|
+
newHost.remove();
|
|
168
|
+
});
|
|
129
169
|
});
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
@theme inline {
|
|
8
8
|
--color-background: var(--background);
|
|
9
9
|
--color-foreground: var(--foreground);
|
|
10
|
-
--font-sans: var(--font-
|
|
11
|
-
--font-mono: var(--font-
|
|
10
|
+
--font-sans: var(--font-inter);
|
|
11
|
+
--font-mono: var(--font-ibm-plex-mono);
|
|
12
12
|
--color-sidebar-ring: var(--sidebar-ring);
|
|
13
13
|
--color-sidebar-border: var(--sidebar-border);
|
|
14
14
|
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
body {
|
|
55
|
-
font-family: 'IBM Plex Sans', var(--font-
|
|
55
|
+
font-family: 'IBM Plex Sans', var(--font-ibm-plex-sans), system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji';
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
:root {
|
|
@@ -138,6 +138,13 @@ body {
|
|
|
138
138
|
/* Utility: IBM Plex Mono display heading font */
|
|
139
139
|
.font-display { font-family: 'IBM Plex Mono', var(--font-ibm-plex-mono), monospace; }
|
|
140
140
|
|
|
141
|
+
/* Brand wordmark — premium sans with engineering precision */
|
|
142
|
+
.font-brand {
|
|
143
|
+
font-family: 'IBM Plex Sans', var(--font-ibm-plex-sans), system-ui, sans-serif;
|
|
144
|
+
font-weight: 700;
|
|
145
|
+
letter-spacing: 0.03em;
|
|
146
|
+
}
|
|
147
|
+
|
|
141
148
|
/* Content width — controlled by Settings > Appearance */
|
|
142
149
|
:root { --content-width: 780px; --toc-width: 0px; }
|
|
143
150
|
.content-width { max-width: var(--content-width-override, var(--content-width)); margin-left: auto; margin-right: auto; }
|
|
@@ -332,6 +339,25 @@ body {
|
|
|
332
339
|
@layer utilities {
|
|
333
340
|
.text-2xs { font-size: 10px; line-height: 1.4; }
|
|
334
341
|
.animate-spin-slow { animation: spin 3s linear infinite; }
|
|
342
|
+
/* Checkerboard background for transparent image preview */
|
|
343
|
+
.bg-checkerboard {
|
|
344
|
+
background-color: #f0f0f0;
|
|
345
|
+
background-image:
|
|
346
|
+
linear-gradient(45deg, #e0e0e0 25%, transparent 25%),
|
|
347
|
+
linear-gradient(-45deg, #e0e0e0 25%, transparent 25%),
|
|
348
|
+
linear-gradient(45deg, transparent 75%, #e0e0e0 75%),
|
|
349
|
+
linear-gradient(-45deg, transparent 75%, #e0e0e0 75%);
|
|
350
|
+
background-size: 16px 16px;
|
|
351
|
+
background-position: 0 0, 0 8px, 8px -8px, -8px 0;
|
|
352
|
+
}
|
|
353
|
+
:is(.dark) .bg-checkerboard {
|
|
354
|
+
background-color: #1a1a1a;
|
|
355
|
+
background-image:
|
|
356
|
+
linear-gradient(45deg, #252525 25%, transparent 25%),
|
|
357
|
+
linear-gradient(-45deg, #252525 25%, transparent 25%),
|
|
358
|
+
linear-gradient(45deg, transparent 75%, #252525 75%),
|
|
359
|
+
linear-gradient(-45deg, transparent 75%, #252525 75%);
|
|
360
|
+
}
|
|
335
361
|
}
|
|
336
362
|
|
|
337
363
|
/* Hide scrollbar but keep scroll functionality */
|
|
@@ -20,6 +20,7 @@ interface ActivityBarProps {
|
|
|
20
20
|
onAgentsClick?: () => void;
|
|
21
21
|
onDiscoverClick?: () => void;
|
|
22
22
|
onWorkflowsClick?: () => void;
|
|
23
|
+
onSpacesClick?: () => void;
|
|
23
24
|
syncStatus: SyncStatus | null;
|
|
24
25
|
expanded: boolean;
|
|
25
26
|
onExpandedChange: (expanded: boolean) => void;
|
|
@@ -83,6 +84,7 @@ export default function ActivityBar({
|
|
|
83
84
|
onAgentsClick,
|
|
84
85
|
onDiscoverClick,
|
|
85
86
|
onWorkflowsClick,
|
|
87
|
+
onSpacesClick,
|
|
86
88
|
syncStatus,
|
|
87
89
|
expanded,
|
|
88
90
|
onExpandedChange,
|
|
@@ -144,14 +146,12 @@ export default function ActivityBar({
|
|
|
144
146
|
};
|
|
145
147
|
}, []);
|
|
146
148
|
|
|
147
|
-
// Labs feature flags (Echo, Workflows) —
|
|
148
|
-
const [labsEcho, setLabsEcho] = useState(
|
|
149
|
-
|
|
150
|
-
);
|
|
151
|
-
const [labsWorkflows, setLabsWorkflows] = useState(() =>
|
|
152
|
-
typeof window !== 'undefined' ? localStorage.getItem('mindos:labs-workflows') === '1' : false
|
|
153
|
-
);
|
|
149
|
+
// Labs feature flags (Echo, Workflows) — always start false to match SSR, hydrate from localStorage in effect
|
|
150
|
+
const [labsEcho, setLabsEcho] = useState(false);
|
|
151
|
+
const [labsWorkflows, setLabsWorkflows] = useState(false);
|
|
154
152
|
useEffect(() => {
|
|
153
|
+
setLabsEcho(localStorage.getItem('mindos:labs-echo') === '1');
|
|
154
|
+
setLabsWorkflows(localStorage.getItem('mindos:labs-workflows') === '1');
|
|
155
155
|
const sync = () => {
|
|
156
156
|
setLabsEcho(localStorage.getItem('mindos:labs-echo') === '1');
|
|
157
157
|
setLabsWorkflows(localStorage.getItem('mindos:labs-workflows') === '1');
|
|
@@ -199,14 +199,14 @@ export default function ActivityBar({
|
|
|
199
199
|
aria-label="MindOS Home"
|
|
200
200
|
>
|
|
201
201
|
<Logo id="rail" className="w-7 h-3.5 shrink-0" />
|
|
202
|
-
{expanded && <span className="text-sm
|
|
202
|
+
{expanded && <span className="text-sm text-foreground font-brand whitespace-nowrap">MindOS</span>}
|
|
203
203
|
</Link>
|
|
204
204
|
|
|
205
205
|
<div className={`${expanded ? 'mx-3' : 'mx-2'} border-t border-border`} />
|
|
206
206
|
|
|
207
207
|
{/* ── Middle: Core panel toggles ── */}
|
|
208
208
|
<div className={`flex flex-col ${expanded ? 'px-1.5' : 'items-center'} gap-1 py-2`}>
|
|
209
|
-
<RailButton icon={<FolderTree size={18} />} label={t.sidebar.files} active={activePanel === 'files'} expanded={expanded} onClick={() => toggle('files')} walkthroughId="files-panel" />
|
|
209
|
+
<RailButton icon={<FolderTree size={18} />} label={t.sidebar.files} active={activePanel === 'files'} expanded={expanded} onClick={() => onSpacesClick ? debounced(onSpacesClick) : toggle('files')} walkthroughId="files-panel" />
|
|
210
210
|
{labsEcho && <RailButton icon={<Radio size={18} />} label={t.sidebar.echo} active={activePanel === 'echo'} expanded={expanded} onClick={() => onEchoClick ? debounced(onEchoClick) : toggle('echo')} walkthroughId="echo-panel" />}
|
|
211
211
|
<RailButton icon={<Search size={18} />} label={t.sidebar.searchTitle} shortcut="⌘K" active={activePanel === 'search'} expanded={expanded} onClick={() => toggle('search')} />
|
|
212
212
|
<RailButton
|
|
@@ -27,7 +27,7 @@ export default function AskFab({ onToggle, askPanelOpen }: AskFabProps) {
|
|
|
27
27
|
shadow-sm shadow-amber-900/10
|
|
28
28
|
transition-all duration-200 ease-out
|
|
29
29
|
hover:shadow-md hover:shadow-amber-900/15
|
|
30
|
-
active:scale-95 cursor-pointer overflow-hidden
|
|
30
|
+
active:scale-95 cursor-pointer overflow-hidden
|
|
31
31
|
${askPanelOpen ? 'opacity-0 pointer-events-none translate-y-2' : 'opacity-100 translate-y-0'}
|
|
32
32
|
`}
|
|
33
33
|
style={{
|
|
@@ -31,7 +31,7 @@ export default function Backlinks({ filePath }: { filePath: string }) {
|
|
|
31
31
|
<div className="mt-12 pt-8 border-t border-border">
|
|
32
32
|
<div className="flex items-center gap-2 mb-6 text-muted-foreground">
|
|
33
33
|
<LinkIcon size={16} className="text-[var(--amber)]/70" />
|
|
34
|
-
<h3 className="text-sm font-semibold tracking-wider uppercase
|
|
34
|
+
<h3 className="text-sm font-semibold tracking-wider uppercase">
|
|
35
35
|
{t.common?.relatedFiles || 'Related Files'}
|
|
36
36
|
</h3>
|
|
37
37
|
<span className="text-xs bg-muted px-1.5 py-0.5 rounded-full font-mono">
|
|
@@ -13,7 +13,7 @@ function FileTypeIcon({ name }: { name: string }) {
|
|
|
13
13
|
export default function Breadcrumb({ filePath }: { filePath: string }) {
|
|
14
14
|
const parts = filePath.split('/');
|
|
15
15
|
return (
|
|
16
|
-
<nav className="flex items-center gap-1 text-xs text-muted-foreground flex-wrap
|
|
16
|
+
<nav className="flex items-center gap-1 text-xs text-muted-foreground flex-wrap">
|
|
17
17
|
<Link href="/" className="hover:text-foreground transition-colors">
|
|
18
18
|
<Home size={14} />
|
|
19
19
|
</Link>
|
|
@@ -120,7 +120,7 @@ export default function CreateSpaceModal({ t, dirPaths }: { t: ReturnType<typeof
|
|
|
120
120
|
>
|
|
121
121
|
{/* Header */}
|
|
122
122
|
<div className="flex items-center justify-between px-5 pt-5 pb-3">
|
|
123
|
-
<h3 className="text-base font-semibold
|
|
123
|
+
<h3 className="text-base font-semibold text-foreground">{h.newSpace}</h3>
|
|
124
124
|
<button onClick={close} className="p-1 rounded-md text-muted-foreground hover:bg-muted transition-colors">
|
|
125
125
|
<X size={14} />
|
|
126
126
|
</button>
|
|
@@ -41,13 +41,15 @@ export default function EchoSpotlight() {
|
|
|
41
41
|
if (dailyLine.trim()) {
|
|
42
42
|
return (
|
|
43
43
|
<section className="mb-10">
|
|
44
|
-
<div className="flex items-center gap-2 mb-
|
|
45
|
-
<
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
<div className="flex items-center gap-2.5 mb-5">
|
|
45
|
+
<div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]">
|
|
46
|
+
<Feather size={13} />
|
|
47
|
+
</div>
|
|
48
|
+
<h2 className="text-[13px] font-semibold text-foreground tracking-wide">{echo.title}</h2>
|
|
49
|
+
<span className="text-xs text-muted-foreground/50">{echo.dailyLine}</span>
|
|
48
50
|
<Link
|
|
49
51
|
href="/echo/daily"
|
|
50
|
-
className="ml-auto text-xs font-medium text-[var(--amber)] hover:opacity-80 transition-opacity
|
|
52
|
+
className="ml-auto text-xs font-medium text-[var(--amber)] hover:opacity-80 transition-opacity"
|
|
51
53
|
>
|
|
52
54
|
{echo.goToEcho}
|
|
53
55
|
</Link>
|
|
@@ -61,7 +63,7 @@ export default function EchoSpotlight() {
|
|
|
61
63
|
onChange={e => saveLine(e.target.value)}
|
|
62
64
|
onBlur={() => setEditing(false)}
|
|
63
65
|
onKeyDown={e => { if (e.key === 'Enter') setEditing(false); }}
|
|
64
|
-
className="w-full px-3.5 py-3 rounded-xl border border-[var(--amber)]/40 bg-card text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring
|
|
66
|
+
className="w-full px-3.5 py-3 rounded-xl border border-[var(--amber)]/40 bg-card text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring italic"
|
|
65
67
|
placeholder={echo.placeholder}
|
|
66
68
|
/>
|
|
67
69
|
) : (
|
|
@@ -83,9 +85,11 @@ export default function EchoSpotlight() {
|
|
|
83
85
|
// ── No daily line → invite ──
|
|
84
86
|
return (
|
|
85
87
|
<section className="mb-10">
|
|
86
|
-
<div className="flex items-center gap-2 mb-
|
|
87
|
-
<
|
|
88
|
-
|
|
88
|
+
<div className="flex items-center gap-2.5 mb-5">
|
|
89
|
+
<div className="flex items-center justify-center w-6 h-6 rounded-md bg-[var(--amber-subtle)] text-[var(--amber)]">
|
|
90
|
+
<Feather size={13} />
|
|
91
|
+
</div>
|
|
92
|
+
<h2 className="text-[13px] font-semibold text-foreground tracking-wide">{echo.title}</h2>
|
|
89
93
|
</div>
|
|
90
94
|
<div className="flex items-center gap-4 px-3.5 py-3.5 rounded-xl border border-dashed border-border/60 hover:border-[var(--amber)]/30 transition-all duration-150 group">
|
|
91
95
|
<div className="flex-1 min-w-0">
|
|
@@ -93,7 +97,7 @@ export default function EchoSpotlight() {
|
|
|
93
97
|
type="text"
|
|
94
98
|
value={dailyLine}
|
|
95
99
|
onChange={e => saveLine(e.target.value)}
|
|
96
|
-
className="w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground/40 focus-visible:outline-none
|
|
100
|
+
className="w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground/40 focus-visible:outline-none italic"
|
|
97
101
|
placeholder={echo.placeholder}
|
|
98
102
|
/>
|
|
99
103
|
<p className="text-xs text-muted-foreground/40 mt-1">{echo.inviteDesc}</p>
|
|
@@ -17,7 +17,7 @@ const darkTheme = EditorView.theme({
|
|
|
17
17
|
backgroundColor: '#09090b',
|
|
18
18
|
height: '100%',
|
|
19
19
|
fontSize: '0.875rem',
|
|
20
|
-
fontFamily: 'var(--font-
|
|
20
|
+
fontFamily: 'var(--font-ibm-plex-mono), ui-monospace, monospace',
|
|
21
21
|
},
|
|
22
22
|
'.cm-scroller': {
|
|
23
23
|
overflow: 'auto',
|
|
@@ -113,7 +113,7 @@ export default function ExportModal({ open, onClose, filePath, isDirectory, file
|
|
|
113
113
|
<div className="flex items-center justify-between px-5 py-4 border-b border-border">
|
|
114
114
|
<div className="flex items-center gap-2">
|
|
115
115
|
<Download size={15} className="text-[var(--amber)]" />
|
|
116
|
-
<h3 id="export-modal-title" className="text-sm font-semibold
|
|
116
|
+
<h3 id="export-modal-title" className="text-sm font-semibold">
|
|
117
117
|
{isDirectory ? (t.export?.exportSpace ?? 'Export Space') : (t.export?.exportFile ?? 'Export File')}
|
|
118
118
|
</h3>
|
|
119
119
|
</div>
|
|
@@ -129,7 +129,7 @@ export default function ExportModal({ open, onClose, filePath, isDirectory, file
|
|
|
129
129
|
<div className="w-10 h-10 rounded-full bg-success/10 flex items-center justify-center mx-auto mb-3">
|
|
130
130
|
<Check size={20} className="text-success" />
|
|
131
131
|
</div>
|
|
132
|
-
<p className="text-sm font-medium
|
|
132
|
+
<p className="text-sm font-medium">{t.export?.done ?? 'Export Complete'}</p>
|
|
133
133
|
<p className="text-xs text-muted-foreground mt-1">{fileName}</p>
|
|
134
134
|
</div>
|
|
135
135
|
) : state === 'error' ? (
|
|
@@ -140,7 +140,7 @@ export default function ExportModal({ open, onClose, filePath, isDirectory, file
|
|
|
140
140
|
) : (
|
|
141
141
|
<>
|
|
142
142
|
<p className="text-xs text-muted-foreground mb-3 truncate" title={filePath}>{filePath}</p>
|
|
143
|
-
<p className="text-xs font-medium
|
|
143
|
+
<p className="text-xs font-medium text-foreground mb-2">{t.export?.chooseFormat ?? 'Choose format'}</p>
|
|
144
144
|
<div className="space-y-1.5">
|
|
145
145
|
{formats.map(f => (
|
|
146
146
|
<label
|