@geminilight/mindos 0.6.52 → 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 +17 -14
- 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 +44 -16
- 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.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.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.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 +17 -14
- 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 +40 -11
- 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/lib/stores/walkthrough-store.ts +33 -1
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/api/ask/route.ts +193 -3
- package/app/app/api/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/restart/route.ts +26 -21
- 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/api/update/route.ts +24 -10
- 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 +40 -11
- package/app/components/walkthrough/WalkthroughTooltip.tsx +1 -1
- package/app/hooks/useAiOrganize.ts +14 -1
- package/app/lib/agent/model.ts +2 -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 +42 -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 +60 -0
- package/app/lib/stores/walkthrough-store.ts +33 -1
- 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 +31 -29
- package/bin/lib/build.js +19 -8
- package/bin/lib/clean-env.js +38 -0
- package/bin/lib/cli-shim.js +67 -2
- package/bin/lib/config.js +4 -5
- package/bin/lib/gateway.js +51 -27
- 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 +98 -41
- package/bin/lib/sync.js +1 -1
- package/package.json +1 -1
- package/scripts/setup.js +7 -5
- package/_standalone/.next/server/chunks/2673.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/IiTZbEzZo8l5MSUxlDwKp/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/1053-c519cb347faa75e2.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-e706f9a963b177ba.js +0 -186
- package/_standalone/.next/static/chunks/app/loading-b07a5983e85bc5e3.js +0 -1
- package/_standalone/.next/static/chunks/app/page-2595175820acfd65.js +0 -7
- package/_standalone/.next/static/chunks/app/trash/page-61c6210fac1e9710.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-798359c36f10ef8d.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/lib/i18n/generated/explore-i18n.generated.ts +0 -138
- package/_standalone/lib/i18n/index.ts +0 -38
- package/_standalone/lib/i18n/modules/ai-chat.ts +0 -237
- package/_standalone/lib/i18n/modules/common.ts +0 -71
- package/_standalone/lib/i18n/modules/features.ts +0 -153
- package/_standalone/lib/i18n/modules/knowledge.ts +0 -727
- package/_standalone/lib/i18n/modules/navigation.ts +0 -157
- package/_standalone/lib/i18n/modules/onboarding.ts +0 -445
- package/_standalone/lib/i18n/modules/panels.ts +0 -1255
- package/_standalone/lib/i18n/modules/settings.ts +0 -889
- package/_standalone/lib/i18n.ts +0 -3
- /package/_standalone/.next/static/{IiTZbEzZo8l5MSUxlDwKp → 2hrwFOLEOZhHQHfrIt-Dw}/_ssgManifest.js +0 -0
|
@@ -66,7 +66,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
|
|
|
66
66
|
|
|
67
67
|
if (justOpened) {
|
|
68
68
|
apiFetch<SettingsData>('/api/settings').then(d => { setData(d); dataLoaded.current = true; }).catch(() => setStatus('load-error'));
|
|
69
|
-
setFont(localStorage.getItem('prose-font') ?? 'lora');
|
|
69
|
+
setFont(localStorage.getItem('prose-font') === 'geist' ? 'inter' : localStorage.getItem('prose-font') ?? 'lora');
|
|
70
70
|
setFontSize(localStorage.getItem('prose-font-size') ?? '15px');
|
|
71
71
|
setContentWidth(localStorage.getItem('content-width') ?? '780px');
|
|
72
72
|
const stored = localStorage.getItem('theme');
|
|
@@ -90,7 +90,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
|
|
|
90
90
|
const fontMap: Record<string, string> = {
|
|
91
91
|
'lora': "'Lora', Georgia, serif",
|
|
92
92
|
'ibm-plex-sans': "'IBM Plex Sans', sans-serif",
|
|
93
|
-
'
|
|
93
|
+
'inter': 'var(--font-inter), sans-serif',
|
|
94
94
|
'ibm-plex-mono': "'IBM Plex Mono', monospace",
|
|
95
95
|
};
|
|
96
96
|
document.documentElement.style.setProperty('--prose-font-override', fontMap[font] ?? '');
|
|
@@ -134,13 +134,47 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
|
|
|
134
134
|
}
|
|
135
135
|
}, []);
|
|
136
136
|
|
|
137
|
+
// Track unsaved data so we can flush on close/unmount
|
|
138
|
+
const pendingData = useRef<SettingsData | null>(null);
|
|
139
|
+
|
|
137
140
|
useEffect(() => {
|
|
138
141
|
if (!data || !dataLoaded.current) return;
|
|
142
|
+
pendingData.current = data;
|
|
139
143
|
clearTimeout(saveTimer.current);
|
|
140
|
-
saveTimer.current = setTimeout(() =>
|
|
144
|
+
saveTimer.current = setTimeout(() => {
|
|
145
|
+
pendingData.current = null;
|
|
146
|
+
doSave(data);
|
|
147
|
+
}, 800);
|
|
141
148
|
return () => clearTimeout(saveTimer.current);
|
|
142
149
|
}, [data, doSave]);
|
|
143
150
|
|
|
151
|
+
// Flush unsaved changes when panel hides (panel variant)
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
if (!visible && pendingData.current) {
|
|
154
|
+
const d = pendingData.current;
|
|
155
|
+
pendingData.current = null;
|
|
156
|
+
clearTimeout(saveTimer.current);
|
|
157
|
+
doSave(d);
|
|
158
|
+
}
|
|
159
|
+
}, [visible, doSave]);
|
|
160
|
+
|
|
161
|
+
// Flush unsaved changes on unmount (modal variant: SettingsModal returns null when !open)
|
|
162
|
+
useEffect(() => {
|
|
163
|
+
return () => {
|
|
164
|
+
if (pendingData.current) {
|
|
165
|
+
clearTimeout(saveTimer.current);
|
|
166
|
+
const d = pendingData.current;
|
|
167
|
+
pendingData.current = null;
|
|
168
|
+
apiFetch('/api/settings', {
|
|
169
|
+
method: 'POST',
|
|
170
|
+
headers: { 'Content-Type': 'application/json' },
|
|
171
|
+
body: JSON.stringify({ ai: d.ai, agent: d.agent, mindRoot: d.mindRoot, webPassword: d.webPassword, authToken: d.authToken }),
|
|
172
|
+
}).catch(() => {});
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
176
|
+
}, []);
|
|
177
|
+
|
|
144
178
|
const updateAi = useCallback((patch: Partial<AiSettings>) => {
|
|
145
179
|
setData(d => d ? { ...d, ai: { ...d.ai, ...patch } } : d);
|
|
146
180
|
}, []);
|
|
@@ -250,7 +284,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
|
|
|
250
284
|
<div className="flex items-center justify-between px-4 py-3 border-b border-border shrink-0">
|
|
251
285
|
<div className="flex items-center gap-2 text-sm font-medium text-foreground">
|
|
252
286
|
<Settings size={14} className="text-muted-foreground" />
|
|
253
|
-
<span className="text-xs font-medium text-muted-foreground uppercase tracking-wider
|
|
287
|
+
<span className="text-xs font-medium text-muted-foreground uppercase tracking-wider">Settings</span>
|
|
254
288
|
</div>
|
|
255
289
|
<div className="flex items-center gap-1.5">
|
|
256
290
|
<div className="flex items-center gap-1.5 text-[10px]" role="status" aria-live="polite">
|
|
@@ -295,7 +329,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
|
|
|
295
329
|
</div>
|
|
296
330
|
<div className="flex items-center gap-2 text-sm font-medium text-foreground">
|
|
297
331
|
<Settings size={15} className="text-muted-foreground" />
|
|
298
|
-
<span
|
|
332
|
+
<span>{t.settings.title}</span>
|
|
299
333
|
</div>
|
|
300
334
|
<div className="flex items-center gap-1.5">
|
|
301
335
|
<div className="flex items-center gap-1.5 text-[10px]" role="status" aria-live="polite">
|
|
@@ -345,7 +379,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
|
|
|
345
379
|
<div className="w-[180px] shrink-0 border-r border-border flex flex-col">
|
|
346
380
|
<div className="flex items-center gap-2 px-4 py-3 border-b border-border">
|
|
347
381
|
<Settings size={15} className="text-muted-foreground" />
|
|
348
|
-
<span className="text-sm font-medium
|
|
382
|
+
<span className="text-sm font-medium text-foreground">{t.settings.title}</span>
|
|
349
383
|
</div>
|
|
350
384
|
<nav className="flex-1 overflow-y-auto py-1.5">
|
|
351
385
|
{TABS.map(tabItem => (
|
|
@@ -383,7 +417,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
|
|
|
383
417
|
<div className="flex-1 flex flex-col min-w-0 min-h-0">
|
|
384
418
|
{/* Right header: tab title + status + close */}
|
|
385
419
|
<div className="flex items-center justify-between px-5 py-3 border-b border-border shrink-0">
|
|
386
|
-
<span className="text-sm font-medium text-foreground
|
|
420
|
+
<span className="text-sm font-medium text-foreground">{activeTabLabel}</span>
|
|
387
421
|
<div className="flex items-center gap-1.5">
|
|
388
422
|
<div className="flex items-center gap-1.5 text-[10px]" role="status" aria-live="polite">
|
|
389
423
|
{saving && <Loader2 size={12} className="animate-spin text-muted-foreground" />}
|
|
@@ -51,12 +51,17 @@ export const FONT_SIZES = [
|
|
|
51
51
|
export const FONTS = [
|
|
52
52
|
{ value: 'lora', label: 'Lora', category: 'Serif', style: { fontFamily: 'Lora, Georgia, serif' } },
|
|
53
53
|
{ value: 'ibm-plex-sans', label: 'IBM Plex Sans', category: 'Sans', style: { fontFamily: "'IBM Plex Sans', sans-serif" } },
|
|
54
|
-
{ value: '
|
|
54
|
+
{ value: 'inter', label: 'Inter', category: 'Sans', style: { fontFamily: 'var(--font-inter), sans-serif' } },
|
|
55
55
|
{ value: 'ibm-plex-mono', label: 'IBM Plex Mono', category: 'Mono', style: { fontFamily: "'IBM Plex Mono', monospace" } },
|
|
56
56
|
];
|
|
57
57
|
|
|
58
58
|
/* ── MCP Types ────────────────────────────────────────────────── */
|
|
59
59
|
|
|
60
|
+
export interface ConnectionMode {
|
|
61
|
+
cli: boolean;
|
|
62
|
+
mcp: boolean;
|
|
63
|
+
}
|
|
64
|
+
|
|
60
65
|
export interface McpStatus {
|
|
61
66
|
running: boolean;
|
|
62
67
|
transport: string;
|
|
@@ -67,6 +72,7 @@ export interface McpStatus {
|
|
|
67
72
|
maskedToken?: string;
|
|
68
73
|
authToken?: string;
|
|
69
74
|
localIP?: string | null;
|
|
75
|
+
connectionMode?: ConnectionMode;
|
|
70
76
|
}
|
|
71
77
|
|
|
72
78
|
export interface AgentInfo {
|
|
@@ -47,7 +47,7 @@ function parseInstallResult(
|
|
|
47
47
|
// ─── Phase runners (pure async, no setState — results consumed by caller) ────
|
|
48
48
|
|
|
49
49
|
/** Phase 1: Save setup config. Returns whether restart is needed. Throws on failure. */
|
|
50
|
-
async function saveConfig(state: SetupState): Promise<boolean> {
|
|
50
|
+
async function saveConfig(state: SetupState, connectionMode?: { cli: boolean; mcp: boolean }): Promise<boolean> {
|
|
51
51
|
// Build providers dict from dynamic providerConfigs
|
|
52
52
|
const providers: Record<string, { apiKey: string; model: string; baseUrl?: string }> = {};
|
|
53
53
|
if (state.provider !== 'skip') {
|
|
@@ -72,6 +72,7 @@ async function saveConfig(state: SetupState): Promise<boolean> {
|
|
|
72
72
|
provider: state.provider,
|
|
73
73
|
providers,
|
|
74
74
|
},
|
|
75
|
+
connectionMode: connectionMode ?? { cli: true, mcp: false },
|
|
75
76
|
};
|
|
76
77
|
const res = await fetch('/api/setup', {
|
|
77
78
|
method: 'POST',
|
|
@@ -355,7 +356,7 @@ export default function SetupWizard() {
|
|
|
355
356
|
setSetupPhase('saving');
|
|
356
357
|
let restartNeeded = false;
|
|
357
358
|
try {
|
|
358
|
-
restartNeeded = await saveConfig(finalState);
|
|
359
|
+
restartNeeded = await saveConfig(finalState, connectionMode);
|
|
359
360
|
if (restartNeeded) setNeedsRestart(true);
|
|
360
361
|
} catch (e) {
|
|
361
362
|
setError(e instanceof Error ? e.message : String(e));
|
|
@@ -440,7 +441,7 @@ export default function SetupWizard() {
|
|
|
440
441
|
<div className="text-center mb-3">
|
|
441
442
|
<div className="inline-flex items-center gap-2">
|
|
442
443
|
<Sparkles size={18} style={{ color: 'var(--amber)' }} />
|
|
443
|
-
<h1 id="setup-title" className="text-2xl font-
|
|
444
|
+
<h1 id="setup-title" className="text-2xl font-brand" style={{ color: 'var(--foreground)' }}>
|
|
444
445
|
MindOS
|
|
445
446
|
</h1>
|
|
446
447
|
</div>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useEffect, useCallback, useId } from 'react';
|
|
4
4
|
import { useLocale } from '@/lib/stores/locale-store';
|
|
5
|
-
import { useWalkthrough } from '@/lib/stores/walkthrough-store';
|
|
5
|
+
import { useWalkthrough, useWalkthroughStore } from '@/lib/stores/walkthrough-store';
|
|
6
6
|
import { walkthroughSteps } from './steps';
|
|
7
7
|
import WalkthroughTooltip from './WalkthroughTooltip';
|
|
8
8
|
|
|
@@ -68,16 +68,31 @@ export default function WalkthroughOverlay() {
|
|
|
68
68
|
return () => window.removeEventListener('keydown', handler, true);
|
|
69
69
|
}, [skipFn]);
|
|
70
70
|
|
|
71
|
-
// If target element doesn't exist (e.g.
|
|
71
|
+
// If target element doesn't exist (e.g. panel not enabled), auto-skip
|
|
72
|
+
// after a grace period. Use stable store ref to avoid re-triggering on
|
|
73
|
+
// every store change (which caused spurious skips during step transitions).
|
|
74
|
+
const currentStep = wt?.currentStep ?? 0;
|
|
72
75
|
useEffect(() => {
|
|
73
76
|
if (!step) return;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
// Wait 500ms for DOM to settle (sidebar animations, lazy rendering)
|
|
78
|
+
const timer = setTimeout(() => {
|
|
79
|
+
const el = document.querySelector(`[data-walkthrough="${step.anchor}"]`);
|
|
80
|
+
if (!el) {
|
|
81
|
+
useWalkthroughStore.getState().next();
|
|
82
|
+
}
|
|
83
|
+
}, 500);
|
|
84
|
+
return () => clearTimeout(timer);
|
|
85
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
86
|
+
}, [currentStep]); // Only re-run when step index changes, not on every store update
|
|
87
|
+
|
|
88
|
+
// Safety timeout: if overlay stays for 60s without user interaction, auto-dismiss.
|
|
89
|
+
// Prevents permanently stuck overlay from any unforeseen edge case.
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
const timer = setTimeout(() => {
|
|
92
|
+
useWalkthroughStore.getState().skip();
|
|
93
|
+
}, 60_000);
|
|
94
|
+
return () => clearTimeout(timer);
|
|
95
|
+
}, [currentStep]); // Reset on each step change
|
|
81
96
|
|
|
82
97
|
if (!wt || !step) return null;
|
|
83
98
|
|
|
@@ -138,7 +153,7 @@ export default function WalkthroughOverlay() {
|
|
|
138
153
|
/>
|
|
139
154
|
</svg>
|
|
140
155
|
|
|
141
|
-
{/* Tooltip */}
|
|
156
|
+
{/* Tooltip — shown when target element found */}
|
|
142
157
|
{targetRect && (
|
|
143
158
|
<WalkthroughTooltip
|
|
144
159
|
stepIndex={wt.currentStep}
|
|
@@ -146,6 +161,20 @@ export default function WalkthroughOverlay() {
|
|
|
146
161
|
position={step.position}
|
|
147
162
|
/>
|
|
148
163
|
)}
|
|
164
|
+
|
|
165
|
+
{/* Fallback dismiss button — shown when target element NOT found.
|
|
166
|
+
Without this, user sees dark overlay but no visible UI to dismiss it. */}
|
|
167
|
+
{!targetRect && (
|
|
168
|
+
<div className="fixed inset-0 z-[101] flex items-center justify-center pointer-events-none">
|
|
169
|
+
<button
|
|
170
|
+
onClick={wt.skip}
|
|
171
|
+
className="pointer-events-auto px-4 py-2 text-sm rounded-lg font-medium transition-all hover:opacity-90"
|
|
172
|
+
style={{ background: 'var(--amber)', color: 'var(--amber-foreground)' }}
|
|
173
|
+
>
|
|
174
|
+
{wt.currentStep === wt.totalSteps - 1 ? '✓' : '→'}
|
|
175
|
+
</button>
|
|
176
|
+
</div>
|
|
177
|
+
)}
|
|
149
178
|
</>
|
|
150
179
|
);
|
|
151
180
|
}
|
|
@@ -195,7 +224,7 @@ function MobileWalkthroughSheet() {
|
|
|
195
224
|
</div>
|
|
196
225
|
|
|
197
226
|
<h3
|
|
198
|
-
className="text-base font-semibold
|
|
227
|
+
className="text-base font-semibold mb-1"
|
|
199
228
|
style={{ color: 'var(--foreground)' }}
|
|
200
229
|
>
|
|
201
230
|
{stepData.title}
|
|
@@ -72,7 +72,7 @@ export default function WalkthroughTooltip({ stepIndex, rect, position }: Walkth
|
|
|
72
72
|
|
|
73
73
|
{/* Content */}
|
|
74
74
|
<h3
|
|
75
|
-
className="text-sm font-semibold
|
|
75
|
+
className="text-sm font-semibold mb-1"
|
|
76
76
|
style={{ color: 'var(--foreground)' }}
|
|
77
77
|
>
|
|
78
78
|
{stepData.title}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useCallback, useRef } from 'react';
|
|
4
4
|
import type { LocalAttachment, Message } from '@/lib/types';
|
|
5
|
+
import type { OrganizeSource } from '@/lib/organize-history';
|
|
5
6
|
|
|
6
7
|
// ---------------------------------------------------------------------------
|
|
7
8
|
// Types
|
|
@@ -248,8 +249,11 @@ export function useAiOrganize() {
|
|
|
248
249
|
const lastEventRef = useRef<number>(0);
|
|
249
250
|
const snapshotsRef = useRef<FileSnapshots>(new Map());
|
|
250
251
|
const [sourceFileNames, setSourceFileNames] = useState<string[]>([]);
|
|
252
|
+
const [source, setSource] = useState<OrganizeSource>('upload');
|
|
253
|
+
const startTimeRef = useRef<number>(0);
|
|
254
|
+
const [durationMs, setDurationMs] = useState<number>(0);
|
|
251
255
|
|
|
252
|
-
const start = useCallback(async (files: LocalAttachment[], prompt: string) => {
|
|
256
|
+
const start = useCallback(async (files: LocalAttachment[], prompt: string, organizeSource: OrganizeSource = 'upload') => {
|
|
253
257
|
setPhase('organizing');
|
|
254
258
|
setChanges([]);
|
|
255
259
|
setCurrentTool(null);
|
|
@@ -258,6 +262,9 @@ export function useAiOrganize() {
|
|
|
258
262
|
setError(null);
|
|
259
263
|
setToolCallCount(0);
|
|
260
264
|
setSourceFileNames(files.map(f => f.name));
|
|
265
|
+
setSource(organizeSource);
|
|
266
|
+
startTimeRef.current = Date.now();
|
|
267
|
+
setDurationMs(0);
|
|
261
268
|
snapshotsRef.current = new Map();
|
|
262
269
|
lastEventRef.current = Date.now();
|
|
263
270
|
|
|
@@ -318,6 +325,7 @@ export function useAiOrganize() {
|
|
|
318
325
|
setSummary(result.summary);
|
|
319
326
|
setToolCallCount(result.toolCallCount);
|
|
320
327
|
setCurrentTool(null);
|
|
328
|
+
setDurationMs(Date.now() - startTimeRef.current);
|
|
321
329
|
setPhase('done');
|
|
322
330
|
} catch (err) {
|
|
323
331
|
if ((err as Error).name === 'AbortError') {
|
|
@@ -426,6 +434,9 @@ export function useAiOrganize() {
|
|
|
426
434
|
setError(null);
|
|
427
435
|
setToolCallCount(0);
|
|
428
436
|
setSourceFileNames([]);
|
|
437
|
+
setSource('upload');
|
|
438
|
+
setDurationMs(0);
|
|
439
|
+
startTimeRef.current = 0;
|
|
429
440
|
snapshotsRef.current = new Map();
|
|
430
441
|
lastEventRef.current = 0;
|
|
431
442
|
}, []);
|
|
@@ -439,6 +450,8 @@ export function useAiOrganize() {
|
|
|
439
450
|
error,
|
|
440
451
|
toolCallCount,
|
|
441
452
|
sourceFileNames,
|
|
453
|
+
source,
|
|
454
|
+
durationMs,
|
|
442
455
|
snapshots: snapshotsRef,
|
|
443
456
|
start,
|
|
444
457
|
abort,
|
package/app/lib/agent/model.ts
CHANGED
|
@@ -32,6 +32,7 @@ export function getModelConfig(options?: ModelConfigOverrides): {
|
|
|
32
32
|
modelName: string;
|
|
33
33
|
apiKey: string;
|
|
34
34
|
provider: ProviderId;
|
|
35
|
+
baseUrl: string;
|
|
35
36
|
} {
|
|
36
37
|
const saved = effectiveAiConfig(options?.provider);
|
|
37
38
|
|
|
@@ -49,7 +50,7 @@ export function getModelConfig(options?: ModelConfigOverrides): {
|
|
|
49
50
|
model = ensureVisionCapable(model);
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
return { model, modelName, apiKey: cfg.apiKey, provider: cfg.provider };
|
|
53
|
+
return { model, modelName, apiKey: cfg.apiKey, provider: cfg.provider, baseUrl: cfg.baseUrl };
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
/**
|
package/app/lib/core/inbox.ts
CHANGED
|
@@ -44,6 +44,7 @@ export interface InboxFileInfo {
|
|
|
44
44
|
export interface InboxSaveResult {
|
|
45
45
|
saved: Array<{ original: string; path: string }>;
|
|
46
46
|
skipped: Array<{ name: string; reason: string }>;
|
|
47
|
+
source?: string;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
export interface InboxSaveInput {
|
|
@@ -133,11 +134,139 @@ function resolveUniqueName(inboxDir: string, targetName: string): string {
|
|
|
133
134
|
return targetName;
|
|
134
135
|
}
|
|
135
136
|
|
|
137
|
+
export interface InboxDeleteResult {
|
|
138
|
+
deleted: string[];
|
|
139
|
+
notFound: string[];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Deletes files from the Inbox directory by name.
|
|
144
|
+
* Only deletes user files — never INSTRUCTION.md or README.md.
|
|
145
|
+
*/
|
|
146
|
+
export function deleteFromInbox(mindRoot: string, names: string[]): InboxDeleteResult {
|
|
147
|
+
const inboxDir = path.resolve(mindRoot, INBOX_DIR);
|
|
148
|
+
const deleted: string[] = [];
|
|
149
|
+
const notFound: string[] = [];
|
|
150
|
+
|
|
151
|
+
for (const name of names) {
|
|
152
|
+
if (!name || typeof name !== 'string') continue;
|
|
153
|
+
const lower = name.toLowerCase();
|
|
154
|
+
if (lower === 'instruction.md' || lower === 'readme.md') continue;
|
|
155
|
+
|
|
156
|
+
const filePath = path.join(inboxDir, path.basename(name));
|
|
157
|
+
try {
|
|
158
|
+
resolveSafe(mindRoot, `${INBOX_DIR}/${path.basename(name)}`);
|
|
159
|
+
if (fs.existsSync(filePath)) {
|
|
160
|
+
fs.unlinkSync(filePath);
|
|
161
|
+
deleted.push(name);
|
|
162
|
+
} else {
|
|
163
|
+
notFound.push(name);
|
|
164
|
+
}
|
|
165
|
+
} catch {
|
|
166
|
+
notFound.push(name);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return { deleted, notFound };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const PROCESSED_DIR = '.processed';
|
|
174
|
+
|
|
175
|
+
export interface InboxArchiveResult {
|
|
176
|
+
archived: Array<{ original: string; archivedPath: string }>;
|
|
177
|
+
notFound: string[];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Moves files from Inbox/ to Inbox/.processed/ with a timestamp prefix.
|
|
182
|
+
* Preserves originals so users can recover them from the processed folder.
|
|
183
|
+
*/
|
|
184
|
+
export function archiveFromInbox(mindRoot: string, names: string[]): InboxArchiveResult {
|
|
185
|
+
const inboxDir = path.resolve(mindRoot, INBOX_DIR);
|
|
186
|
+
const processedDir = path.join(inboxDir, PROCESSED_DIR);
|
|
187
|
+
fs.mkdirSync(processedDir, { recursive: true });
|
|
188
|
+
|
|
189
|
+
const archived: InboxArchiveResult['archived'] = [];
|
|
190
|
+
const notFound: string[] = [];
|
|
191
|
+
const now = new Date();
|
|
192
|
+
const ts = now.toISOString().replace(/[-:]/g, '').replace('T', '-').slice(0, 15);
|
|
193
|
+
|
|
194
|
+
for (const name of names) {
|
|
195
|
+
if (!name || typeof name !== 'string') continue;
|
|
196
|
+
const lower = name.toLowerCase();
|
|
197
|
+
if (lower === 'instruction.md' || lower === 'readme.md') continue;
|
|
198
|
+
|
|
199
|
+
const baseName = path.basename(name);
|
|
200
|
+
const srcPath = path.join(inboxDir, baseName);
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
resolveSafe(mindRoot, `${INBOX_DIR}/${baseName}`);
|
|
204
|
+
if (!fs.existsSync(srcPath)) {
|
|
205
|
+
notFound.push(name);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const archivedName = `${ts}_${baseName}`;
|
|
210
|
+
const destPath = path.join(processedDir, archivedName);
|
|
211
|
+
fs.renameSync(srcPath, destPath);
|
|
212
|
+
archived.push({
|
|
213
|
+
original: name,
|
|
214
|
+
archivedPath: `${INBOX_DIR}/${PROCESSED_DIR}/${archivedName}`,
|
|
215
|
+
});
|
|
216
|
+
} catch {
|
|
217
|
+
notFound.push(name);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return { archived, notFound };
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export interface ProcessedFileInfo {
|
|
225
|
+
name: string;
|
|
226
|
+
originalName: string;
|
|
227
|
+
path: string;
|
|
228
|
+
size: number;
|
|
229
|
+
archivedAt: string;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Lists files in Inbox/.processed/ with metadata.
|
|
234
|
+
* Returns files sorted by archive time (newest first).
|
|
235
|
+
*/
|
|
236
|
+
export function listProcessedFiles(mindRoot: string): ProcessedFileInfo[] {
|
|
237
|
+
const processedDir = path.resolve(mindRoot, INBOX_DIR, PROCESSED_DIR);
|
|
238
|
+
if (!fs.existsSync(processedDir)) return [];
|
|
239
|
+
|
|
240
|
+
const entries = fs.readdirSync(processedDir, { withFileTypes: true });
|
|
241
|
+
const results: ProcessedFileInfo[] = [];
|
|
242
|
+
|
|
243
|
+
for (const entry of entries) {
|
|
244
|
+
if (!entry.isFile()) continue;
|
|
245
|
+
if (entry.name.startsWith('.')) continue;
|
|
246
|
+
|
|
247
|
+
const filePath = path.join(processedDir, entry.name);
|
|
248
|
+
try {
|
|
249
|
+
const stat = fs.statSync(filePath);
|
|
250
|
+
const originalName = entry.name.replace(/^\d{8}-\d{6}_/, '');
|
|
251
|
+
results.push({
|
|
252
|
+
name: entry.name,
|
|
253
|
+
originalName,
|
|
254
|
+
path: `${INBOX_DIR}/${PROCESSED_DIR}/${entry.name}`,
|
|
255
|
+
size: stat.size,
|
|
256
|
+
archivedAt: stat.mtime.toISOString(),
|
|
257
|
+
});
|
|
258
|
+
} catch { /* skip */ }
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
results.sort((a, b) => new Date(b.archivedAt).getTime() - new Date(a.archivedAt).getTime());
|
|
262
|
+
return results;
|
|
263
|
+
}
|
|
264
|
+
|
|
136
265
|
/**
|
|
137
266
|
* Saves files to the Inbox directory.
|
|
138
267
|
* Handles format conversion (txt→md, html→md, etc.) and deduplication.
|
|
139
268
|
*/
|
|
140
|
-
export function saveToInbox(mindRoot: string, files: InboxSaveInput[]): InboxSaveResult {
|
|
269
|
+
export function saveToInbox(mindRoot: string, files: InboxSaveInput[], source?: string): InboxSaveResult {
|
|
141
270
|
const inboxDir = ensureInboxSpace(mindRoot);
|
|
142
271
|
const saved: InboxSaveResult['saved'] = [];
|
|
143
272
|
const skipped: InboxSaveResult['skipped'] = [];
|
|
@@ -177,5 +306,5 @@ export function saveToInbox(mindRoot: string, files: InboxSaveInput[]): InboxSav
|
|
|
177
306
|
}
|
|
178
307
|
}
|
|
179
308
|
|
|
180
|
-
return { saved, skipped };
|
|
309
|
+
return { saved, skipped, source };
|
|
181
310
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { execFileSync } from 'child_process';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Extract text from a PDF file via pdfjs-dist (child process).
|
|
7
|
+
* Spawns extract-pdf.cjs to avoid Turbopack/pdfjs-dist worker conflicts.
|
|
8
|
+
* Returns extracted text, or empty string if extraction fails.
|
|
9
|
+
*/
|
|
10
|
+
export function extractPdfText(absolutePath: string): string {
|
|
11
|
+
try {
|
|
12
|
+
const appDir = process.env.MINDOS_PROJECT_ROOT
|
|
13
|
+
? path.join(process.env.MINDOS_PROJECT_ROOT, 'app')
|
|
14
|
+
: path.resolve(process.cwd());
|
|
15
|
+
const scriptPath = path.join(appDir, 'scripts', 'extract-pdf.cjs');
|
|
16
|
+
if (!fs.existsSync(scriptPath)) return '';
|
|
17
|
+
|
|
18
|
+
const stdout = execFileSync('node', [scriptPath, absolutePath], {
|
|
19
|
+
encoding: 'utf-8',
|
|
20
|
+
timeout: 15_000,
|
|
21
|
+
maxBuffer: 5 * 1024 * 1024,
|
|
22
|
+
});
|
|
23
|
+
const result = JSON.parse(stdout) as { text: string; pages: number };
|
|
24
|
+
return result.text || '';
|
|
25
|
+
} catch {
|
|
26
|
+
return '';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -2,6 +2,8 @@ import fs from 'fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { collectAllFiles } from './tree';
|
|
4
4
|
import { readFile } from './fs-ops';
|
|
5
|
+
import { resolveSafe } from './security';
|
|
6
|
+
import { extractPdfText } from './pdf-text';
|
|
5
7
|
import { CJK_CHAR_REGEX } from './cjk';
|
|
6
8
|
|
|
7
9
|
const MAX_CONTENT_LENGTH = 50_000;
|
|
@@ -111,10 +113,23 @@ export class SearchIndex {
|
|
|
111
113
|
|
|
112
114
|
for (const filePath of allFiles) {
|
|
113
115
|
let content: string;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
117
|
+
|
|
118
|
+
if (ext === '.pdf') {
|
|
119
|
+
// PDF: extract text from binary via pdfjs-dist child process
|
|
120
|
+
try {
|
|
121
|
+
const resolved = resolveSafe(mindRoot, filePath);
|
|
122
|
+
content = extractPdfText(resolved);
|
|
123
|
+
if (!content) continue;
|
|
124
|
+
} catch {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
try {
|
|
129
|
+
content = readFile(mindRoot, filePath);
|
|
130
|
+
} catch {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
118
133
|
}
|
|
119
134
|
|
|
120
135
|
// Store original length for BM25 before truncation
|
|
@@ -191,7 +206,16 @@ export class SearchIndex {
|
|
|
191
206
|
if (!this.invertedIndex) return;
|
|
192
207
|
|
|
193
208
|
let content: string;
|
|
194
|
-
|
|
209
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
210
|
+
if (ext === '.pdf') {
|
|
211
|
+
try {
|
|
212
|
+
const resolved = resolveSafe(mindRoot, filePath);
|
|
213
|
+
content = extractPdfText(resolved);
|
|
214
|
+
if (!content) return;
|
|
215
|
+
} catch { return; }
|
|
216
|
+
} else {
|
|
217
|
+
try { content = readFile(mindRoot, filePath); } catch { return; }
|
|
218
|
+
}
|
|
195
219
|
|
|
196
220
|
// Update BM25 stats
|
|
197
221
|
this.docLengths.set(filePath, content.length);
|
package/app/lib/core/tree.ts
CHANGED
|
@@ -4,7 +4,12 @@ import path from 'path';
|
|
|
4
4
|
import type { FileNode } from './types';
|
|
5
5
|
|
|
6
6
|
const DEFAULT_IGNORED_DIRS = new Set(['.git', 'node_modules', 'app', '.next', '.DS_Store', 'mcp']);
|
|
7
|
-
const DEFAULT_ALLOWED_EXTENSIONS = new Set([
|
|
7
|
+
const DEFAULT_ALLOWED_EXTENSIONS = new Set([
|
|
8
|
+
'.md', '.csv', '.pdf',
|
|
9
|
+
'.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp', '.ico',
|
|
10
|
+
'.mp3', '.wav', '.m4a', '.ogg', '.flac', '.aac',
|
|
11
|
+
'.mp4', '.webm', '.mov', '.mkv',
|
|
12
|
+
]);
|
|
8
13
|
const SYSTEM_FILES = new Set(['INSTRUCTION.md', 'README.md', 'CONFIG.json', 'CHANGELOG.md']);
|
|
9
14
|
|
|
10
15
|
export interface TreeOptions {
|
package/app/lib/fs.ts
CHANGED
|
@@ -33,12 +33,14 @@ import {
|
|
|
33
33
|
listContentChanges as coreListContentChanges,
|
|
34
34
|
markContentChangesSeen as coreMarkContentChangesSeen,
|
|
35
35
|
getContentChangeSummary as coreGetContentChangeSummary,
|
|
36
|
+
resolveSafe,
|
|
36
37
|
} from './core';
|
|
37
38
|
import type { MindSpaceSummary } from './core';
|
|
38
39
|
import type { ContentChangeEvent, ContentChangeInput, ContentChangeSummary } from './core';
|
|
39
40
|
import { FileNode, SpacePreview } from './core/types';
|
|
40
41
|
import { SearchMatch } from './types';
|
|
41
42
|
import { effectiveSopRoot } from './settings';
|
|
43
|
+
import { extractPdfText } from './core/pdf-text';
|
|
42
44
|
|
|
43
45
|
// ─── Root helpers ─────────────────────────────────────────────────────────────
|
|
44
46
|
|
|
@@ -48,7 +50,12 @@ export function getMindRoot(): string {
|
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
const IGNORED_DIRS = new Set(['.git', 'node_modules', 'app', '.next', '.DS_Store']);
|
|
51
|
-
const ALLOWED_EXTENSIONS = new Set([
|
|
53
|
+
const ALLOWED_EXTENSIONS = new Set([
|
|
54
|
+
'.md', '.csv', '.json', '.pdf',
|
|
55
|
+
'.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp', '.ico',
|
|
56
|
+
'.mp3', '.wav', '.m4a', '.ogg', '.flac', '.aac',
|
|
57
|
+
'.mp4', '.webm', '.mov', '.mkv',
|
|
58
|
+
]);
|
|
52
59
|
const SYSTEM_FILES = new Set(['INSTRUCTION.md', 'README.md', 'CONFIG.json', 'CHANGELOG.md']);
|
|
53
60
|
|
|
54
61
|
// ─── In-memory cache ──────────────────────────────────────────────────────────
|
|
@@ -463,9 +470,30 @@ export function getRecentlyModified(limit = 10): Array<{ path: string; mtime: nu
|
|
|
463
470
|
|
|
464
471
|
// ─── Public API: File operations (delegated to @mindos/core) ─────────────────
|
|
465
472
|
|
|
466
|
-
/** Reads the content of a file given a relative path from MIND_ROOT.
|
|
473
|
+
/** Reads the content of a file given a relative path from MIND_ROOT.
|
|
474
|
+
* PDF files are automatically extracted to text via pdfjs-dist. */
|
|
467
475
|
export function getFileContent(filePath: string): string {
|
|
468
|
-
|
|
476
|
+
const root = getMindRoot();
|
|
477
|
+
if (path.extname(filePath).toLowerCase() === '.pdf') {
|
|
478
|
+
const resolved = resolveSafe(root, filePath);
|
|
479
|
+
if (!fs.existsSync(resolved)) {
|
|
480
|
+
throw new MindOSError(
|
|
481
|
+
ErrorCodes.FILE_NOT_FOUND,
|
|
482
|
+
`File not found: ${filePath}`,
|
|
483
|
+
{ filePath },
|
|
484
|
+
);
|
|
485
|
+
}
|
|
486
|
+
const text = extractPdfText(resolved);
|
|
487
|
+
if (!text) {
|
|
488
|
+
throw new MindOSError(
|
|
489
|
+
ErrorCodes.INTERNAL_ERROR,
|
|
490
|
+
`Could not extract text from PDF: ${filePath}`,
|
|
491
|
+
{ filePath },
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
return text;
|
|
495
|
+
}
|
|
496
|
+
return coreReadFile(root, filePath);
|
|
469
497
|
}
|
|
470
498
|
|
|
471
499
|
/** Atomically writes content to a file given a relative path from MIND_ROOT. */
|