@geminilight/mindos 0.6.51 → 0.6.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_standalone/.mindos-build-version +1 -1
- package/_standalone/.next/BUILD_ID +1 -1
- package/_standalone/.next/app-path-routes-manifest.json +18 -18
- package/_standalone/.next/build-manifest.json +3 -3
- package/_standalone/.next/cache/.previewinfo +1 -1
- package/_standalone/.next/cache/.rscinfo +1 -1
- package/_standalone/.next/cache/config.json +3 -3
- package/_standalone/.next/prerender-manifest.json +3 -3
- package/_standalone/.next/react-loadable-manifest.json +1 -1
- package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error/page.js +2 -2
- 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 +11 -6
- package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +11 -6
- 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 +6 -1
- package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/_standalone/.next/server/app/_not-found/page.js +2 -2
- package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js +2 -2
- package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/page.js +3 -3
- package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/config/route_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 +1 -1
- package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/backlinks/route.js +1 -1
- package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route.js +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/changes/route.js +1 -1
- package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/export/route.js +1 -1
- 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 +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/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 +1 -1
- package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/git/route.js +1 -1
- package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/graph/route.js +1 -1
- package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/route.js +1 -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 +1 -1
- package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/search/route.js +1 -1
- package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route_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_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/tree-version/route.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 +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 +2 -2
- package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/page.js +2 -2
- package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/explore/page.js +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/login/page.js +2 -2
- package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/page.js +2 -2
- 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 +2 -2
- package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app-paths-manifest.json +18 -18
- package/_standalone/.next/server/chunks/2190.js +1 -1
- package/_standalone/.next/server/chunks/2673.js +52 -0
- package/_standalone/.next/server/chunks/4241.js +1 -219
- package/_standalone/.next/server/chunks/8408.js +219 -0
- package/_standalone/.next/server/instrumentation.js +1 -1
- package/_standalone/.next/server/middleware-build-manifest.js +1 -1
- package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/_standalone/.next/server/pages/500.html +2 -2
- package/_standalone/.next/server/server-reference-manifest.js +1 -1
- package/_standalone/.next/server/server-reference-manifest.json +1 -1
- package/_standalone/.next/static/chunks/1053-c519cb347faa75e2.js +29 -0
- package/_standalone/.next/static/chunks/{1814.2ee1d03297c0bccd.js → 1814.72f7fe7c61e2b647.js} +1 -1
- package/_standalone/.next/static/chunks/{1880-c2a9e76201841c86.js → 1880-3ec02adc80531825.js} +1 -1
- package/_standalone/.next/static/chunks/6636-9bbc90fb3b8731fe.js +6 -0
- package/_standalone/.next/static/chunks/7035-032641fb6f4e07b2.js +1 -0
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/_global-error/page-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/{page-773071a99c4daac2.js → page-074d6aafc2606561.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/{page-0d9920b591ce999f.js → page-710d8c80fa86e93e.js} +2 -2
- package/_standalone/.next/static/chunks/app/api/a2a/agents/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/page-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/{layout-4264ca690ad73be1.js → layout-e706f9a963b177ba.js} +32 -32
- package/_standalone/.next/static/chunks/app/loading-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/page-2595175820acfd65.js +7 -0
- package/_standalone/.next/static/chunks/app/setup/page-99f40e9337388cda.js +1 -0
- package/_standalone/.next/static/chunks/app/trash/page-61c6210fac1e9710.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/page-798359c36f10ef8d.js +12 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b07a5983e85bc5e3.js +1 -0
- package/_standalone/.next/static/chunks/{webpack-7b276daaa930d480.js → webpack-bbd44cbc83dc0aa4.js} +1 -1
- package/_standalone/.next/static/css/ef1151f74f00d91a.css +1 -0
- package/_standalone/.next/trace +64 -63
- package/_standalone/app/globals.css +1 -1
- package/_standalone/components/ActivityBar.tsx +1 -1
- package/_standalone/components/AskFab.tsx +4 -4
- package/_standalone/components/ExportModal.tsx +4 -1
- package/_standalone/components/FileTree.tsx +13 -5
- package/_standalone/components/Panel.tsx +5 -12
- package/_standalone/components/RightAgentDetailPanel.tsx +5 -4
- package/_standalone/components/RightAskPanel.tsx +5 -4
- package/_standalone/components/agents/AgentsPrimitives.tsx +7 -3
- package/_standalone/components/ask/ProviderModelCapsule.tsx +16 -3
- package/_standalone/components/settings/AiTab.tsx +1 -0
- package/_standalone/components/settings/Primitives.tsx +84 -3
- package/_standalone/instrumentation.ts +3 -1
- package/_standalone/lib/config/animation.ts +76 -0
- package/_standalone/lib/config/icon-scale.ts +35 -0
- package/_standalone/lib/config/panel-sizes.ts +58 -0
- package/_standalone/lib/hooks/useFocusTrap.ts +65 -0
- package/_standalone/lib/i18n/modules/knowledge.ts +16 -8
- package/_standalone/lib/i18n/modules/onboarding.ts +2 -2
- package/_standalone/lib/i18n/modules/settings.ts +4 -0
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/globals.css +1 -1
- package/app/app/loading.tsx +80 -0
- package/app/app/view/[...path]/loading.tsx +32 -9
- package/app/components/ActivityBar.tsx +1 -1
- package/app/components/AskFab.tsx +4 -4
- package/app/components/ExportModal.tsx +4 -1
- package/app/components/FileTree.tsx +13 -5
- package/app/components/HomeContent.tsx +29 -12
- package/app/components/Panel.tsx +5 -12
- package/app/components/RightAgentDetailPanel.tsx +5 -4
- package/app/components/RightAskPanel.tsx +5 -4
- package/app/components/TrashPageClient.tsx +4 -4
- package/app/components/agents/AgentsPrimitives.tsx +7 -3
- package/app/components/ask/ProviderModelCapsule.tsx +16 -3
- package/app/components/settings/AiTab.tsx +1 -0
- package/app/components/settings/Primitives.tsx +84 -3
- package/app/components/ui/Toaster.tsx +1 -1
- package/app/instrumentation.ts +3 -1
- package/app/lib/config/animation.ts +76 -0
- package/app/lib/config/icon-scale.ts +35 -0
- package/app/lib/config/panel-sizes.ts +58 -0
- package/app/lib/hooks/useFocusTrap.ts +65 -0
- package/app/lib/i18n/modules/knowledge.ts +16 -8
- package/app/lib/i18n/modules/onboarding.ts +2 -2
- package/app/lib/i18n/modules/settings.ts +4 -0
- package/package.json +1 -1
- package/_standalone/.next/server/chunks/1975.js +0 -52
- package/_standalone/.next/server/chunks/6622.js +0 -1
- package/_standalone/.next/static/chunks/1053-8cb7fd1bfbbbedd3.js +0 -29
- package/_standalone/.next/static/chunks/4563-b2a2ce80aff845af.js +0 -6
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/_global-error/page-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/agents/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/page-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/page-00202b22c6db2144.js +0 -7
- package/_standalone/.next/static/chunks/app/setup/page-81c37de31c9a5beb.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-e0398f37b2a47da5.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-02d632d03f3ec6c6.js +0 -12
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-84943536516b00b2.js +0 -1
- package/_standalone/.next/static/css/bc9179074eaf65ae.css +0 -1
- /package/_standalone/.next/static/{Oo3NOv4X7Res4OjfuRdIF → IiTZbEzZo8l5MSUxlDwKp}/_buildManifest.js +0 -0
- /package/_standalone/.next/static/{Oo3NOv4X7Res4OjfuRdIF → IiTZbEzZo8l5MSUxlDwKp}/_ssgManifest.js +0 -0
|
@@ -195,22 +195,103 @@ export function Toggle({ checked, onChange, size = 'md', disabled, title, onClic
|
|
|
195
195
|
);
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
-
export function ApiKeyInput({ value, onChange, placeholder, disabled }: {
|
|
198
|
+
export function ApiKeyInput({ value, onChange, placeholder, disabled, labels }: {
|
|
199
199
|
value: string;
|
|
200
200
|
onChange: (v: string) => void;
|
|
201
201
|
placeholder?: string;
|
|
202
202
|
disabled?: boolean;
|
|
203
|
+
labels?: { change?: string; cancel?: string };
|
|
203
204
|
}) {
|
|
204
205
|
const isMasked = value === '***set***';
|
|
206
|
+
const [editing, setEditing] = useState(false);
|
|
207
|
+
const [draft, setDraft] = useState('');
|
|
208
|
+
const inputRef = useRef<HTMLInputElement>(null);
|
|
209
|
+
const prevValueRef = useRef(value);
|
|
210
|
+
|
|
211
|
+
// Reset editing when the masked value identity changes (e.g. provider switch)
|
|
212
|
+
useEffect(() => {
|
|
213
|
+
if (prevValueRef.current !== value) {
|
|
214
|
+
prevValueRef.current = value;
|
|
215
|
+
setEditing(false);
|
|
216
|
+
setDraft('');
|
|
217
|
+
}
|
|
218
|
+
}, [value]);
|
|
219
|
+
|
|
220
|
+
const commitDraft = useCallback(() => {
|
|
221
|
+
if (draft.trim()) {
|
|
222
|
+
onChange(draft);
|
|
223
|
+
}
|
|
224
|
+
setEditing(false);
|
|
225
|
+
setDraft('');
|
|
226
|
+
}, [draft, onChange]);
|
|
227
|
+
|
|
228
|
+
const cancelEdit = useCallback(() => {
|
|
229
|
+
setEditing(false);
|
|
230
|
+
setDraft('');
|
|
231
|
+
}, []);
|
|
232
|
+
|
|
233
|
+
const changeLabel = labels?.change ?? 'Change';
|
|
234
|
+
const cancelLabel = labels?.cancel ?? 'Cancel';
|
|
235
|
+
|
|
236
|
+
// Masked state: show dots + "Change" button. No clearing on click.
|
|
237
|
+
if (isMasked && !editing) {
|
|
238
|
+
return (
|
|
239
|
+
<div className="flex items-center gap-2">
|
|
240
|
+
<div className="flex-1 px-3 py-2 text-sm bg-muted/50 border border-border rounded-lg text-muted-foreground select-none tracking-widest">
|
|
241
|
+
••••••••••••
|
|
242
|
+
</div>
|
|
243
|
+
<button
|
|
244
|
+
type="button"
|
|
245
|
+
onClick={() => {
|
|
246
|
+
setDraft('');
|
|
247
|
+
setEditing(true);
|
|
248
|
+
requestAnimationFrame(() => inputRef.current?.focus());
|
|
249
|
+
}}
|
|
250
|
+
disabled={disabled}
|
|
251
|
+
className="shrink-0 px-3 py-2 text-xs font-medium rounded-lg border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors disabled:opacity-50"
|
|
252
|
+
>
|
|
253
|
+
{changeLabel}
|
|
254
|
+
</button>
|
|
255
|
+
</div>
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Edit mode (replacing masked key) — uses local draft, commits on Enter/blur
|
|
260
|
+
if (editing) {
|
|
261
|
+
return (
|
|
262
|
+
<div className="flex items-center gap-2">
|
|
263
|
+
<input
|
|
264
|
+
ref={inputRef}
|
|
265
|
+
type="password"
|
|
266
|
+
value={draft}
|
|
267
|
+
onChange={e => setDraft(e.target.value)}
|
|
268
|
+
onKeyDown={e => { if (e.key === 'Enter') commitDraft(); }}
|
|
269
|
+
onBlur={commitDraft}
|
|
270
|
+
placeholder={placeholder ?? 'sk-...'}
|
|
271
|
+
disabled={disabled}
|
|
272
|
+
className="flex-1 px-3 py-2 text-sm bg-background border border-border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50"
|
|
273
|
+
/>
|
|
274
|
+
<button
|
|
275
|
+
type="button"
|
|
276
|
+
onMouseDown={e => e.preventDefault()}
|
|
277
|
+
onClick={cancelEdit}
|
|
278
|
+
className="shrink-0 px-3 py-2 text-xs font-medium rounded-lg border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors"
|
|
279
|
+
>
|
|
280
|
+
{cancelLabel}
|
|
281
|
+
</button>
|
|
282
|
+
</div>
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Normal (no masked key) — direct editing
|
|
205
287
|
return (
|
|
206
288
|
<input
|
|
207
289
|
type="password"
|
|
208
|
-
value={
|
|
290
|
+
value={value}
|
|
209
291
|
onChange={e => onChange(e.target.value)}
|
|
210
292
|
placeholder={placeholder ?? 'sk-...'}
|
|
211
293
|
disabled={disabled}
|
|
212
294
|
className="w-full px-3 py-2 text-sm bg-background border border-border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50"
|
|
213
|
-
onFocus={() => { if (isMasked) onChange(''); }}
|
|
214
295
|
/>
|
|
215
296
|
);
|
|
216
297
|
}
|
|
@@ -16,7 +16,7 @@ export default function Toaster() {
|
|
|
16
16
|
if (toasts.length === 0) return null;
|
|
17
17
|
|
|
18
18
|
return (
|
|
19
|
-
<div className="fixed bottom-4 right-4 z-50 flex flex-col-reverse gap-2 pointer-events-none" aria-live="polite">
|
|
19
|
+
<div className="fixed bottom-4 right-4 z-50 flex flex-col-reverse gap-2 pointer-events-none" role="status" aria-live="polite" aria-atomic="false">
|
|
20
20
|
{toasts.map((t) => (
|
|
21
21
|
<div
|
|
22
22
|
key={t.id}
|
package/app/instrumentation.ts
CHANGED
|
@@ -40,7 +40,9 @@ export async function register() {
|
|
|
40
40
|
try {
|
|
41
41
|
const projRoot = process.env.MINDOS_PROJECT_ROOT || resolve(process.cwd(), '..');
|
|
42
42
|
const skillCheckModule = resolve(projRoot, 'bin', 'lib', 'skill-check.js');
|
|
43
|
-
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
44
|
+
const dynamicRequireSkill = new Function('id', 'return require(id)') as (id: string) => any;
|
|
45
|
+
const { checkSkillVersions, updateSkill } = dynamicRequireSkill(skillCheckModule);
|
|
44
46
|
const mismatches = checkSkillVersions(projRoot);
|
|
45
47
|
for (const m of mismatches) {
|
|
46
48
|
try {
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized animation configuration.
|
|
3
|
+
* Three-tier system for consistent animation timings across the app.
|
|
4
|
+
* All durations in milliseconds, <= 300ms per WCAG/a11y standards.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Animation duration tiers */
|
|
8
|
+
export const ANIMATION = {
|
|
9
|
+
// Micro: Quick feedback, hover/focus states
|
|
10
|
+
MICRO: 100, // Button hover, icon transitions, quick visual feedback
|
|
11
|
+
|
|
12
|
+
// Short: Interactive transitions, small content changes
|
|
13
|
+
SHORT: 200, // Slide/fade modals, popovers, panel opens, dropdowns, quick state changes
|
|
14
|
+
|
|
15
|
+
// Medium: Larger content transitions, drawing attention
|
|
16
|
+
MEDIUM: 300, // Long panel slides, collapse/expand grids, significant layout changes
|
|
17
|
+
|
|
18
|
+
// Fast-exit: When closing/dismissing (slightly faster)
|
|
19
|
+
FAST_EXIT: 150,
|
|
20
|
+
} as const;
|
|
21
|
+
|
|
22
|
+
/** Easing functions (using Tailwind defaults) */
|
|
23
|
+
export const EASING = {
|
|
24
|
+
// Use for enter/appear animations (slow start, fast end)
|
|
25
|
+
EASE_OUT: 'cubic-bezier(0, 0, 0.2, 1)',
|
|
26
|
+
|
|
27
|
+
// Use for exit/disappear animations (fast start, slow end)
|
|
28
|
+
EASE_IN: 'cubic-bezier(0.4, 0, 1, 1)',
|
|
29
|
+
|
|
30
|
+
// Use for continuous/reversible animations (uniform acceleration/deceleration)
|
|
31
|
+
EASE_IN_OUT: 'cubic-bezier(0.4, 0, 0.2, 1)',
|
|
32
|
+
} as const;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Helper to build transition string
|
|
36
|
+
* @example
|
|
37
|
+
* buildTransition('all') // 'all 200ms cubic-bezier(...)'
|
|
38
|
+
* buildTransition('opacity', { duration: ANIMATION.MICRO, easing: EASING.EASE_IN_OUT })
|
|
39
|
+
*/
|
|
40
|
+
export function buildTransition(
|
|
41
|
+
property: string = 'all',
|
|
42
|
+
options?: {
|
|
43
|
+
duration?: number;
|
|
44
|
+
easing?: string;
|
|
45
|
+
delay?: number;
|
|
46
|
+
}
|
|
47
|
+
) {
|
|
48
|
+
const duration = options?.duration ?? ANIMATION.SHORT;
|
|
49
|
+
const easing = options?.easing ?? EASING.EASE_IN_OUT;
|
|
50
|
+
const delay = options?.delay ?? 0;
|
|
51
|
+
|
|
52
|
+
const delayStr = delay > 0 ? ` ${delay}ms` : '';
|
|
53
|
+
return `${property} ${duration}ms ${easing}${delayStr}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Usage guide:
|
|
58
|
+
*
|
|
59
|
+
* ### Hover/Focus (MICRO)
|
|
60
|
+
* className="transition duration-100 ease-out hover:bg-muted"
|
|
61
|
+
*
|
|
62
|
+
* ### Modal/Panel Open (SHORT with EASE_OUT)
|
|
63
|
+
* className="animate-in fade-in-0 zoom-in-95 duration-200 ease-out"
|
|
64
|
+
*
|
|
65
|
+
* ### Collapse/Expand Grid (MEDIUM with EASE_IN_OUT)
|
|
66
|
+
* style={{
|
|
67
|
+
* transition: buildTransition('grid-template-rows', {
|
|
68
|
+
* duration: ANIMATION.MEDIUM,
|
|
69
|
+
* easing: EASING.EASE_IN_OUT
|
|
70
|
+
* })
|
|
71
|
+
* }}
|
|
72
|
+
*
|
|
73
|
+
* ### Sidebar Slide (SHORT with EASE_OUT for enter, EASE_IN for exit)
|
|
74
|
+
* // Sidebar appears: transition duration-200 ease-out
|
|
75
|
+
* // Sidebar closes: transition duration-150 ease-in
|
|
76
|
+
*/
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized icon size scale.
|
|
3
|
+
* Replaces arbitrary sizes (10/12/13/14/15/16/18/20px) with a named scale.
|
|
4
|
+
* Usage: import { ICON_SIZES } from '@/lib/config/icon-scale'
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const ICON_SIZES = {
|
|
8
|
+
xs: 10, // Tiny: breadcrumb items, status dots, inline badges
|
|
9
|
+
sm: 12, // Small: form field icons, list item decorators
|
|
10
|
+
md: 14, // Medium: button icons, sidebar items, file tree (DEFAULT)
|
|
11
|
+
lg: 16, // Large: main action buttons, panel headers
|
|
12
|
+
xl: 18, // XL: hero icons, large buttons, empty states
|
|
13
|
+
xxl: 20, // XXL: large empty state icons, prominent UI
|
|
14
|
+
xxxl: 24, // XXXL: section headers, splash screens
|
|
15
|
+
} as const;
|
|
16
|
+
|
|
17
|
+
export type IconSize = keyof typeof ICON_SIZES;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Helper: Get pixel value by size name
|
|
21
|
+
* @param size - Size key, e.g., 'md', 'lg'
|
|
22
|
+
* @returns Pixel value, e.g., 14
|
|
23
|
+
*/
|
|
24
|
+
export function getIconSize(size: IconSize): number {
|
|
25
|
+
return ICON_SIZES[size];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Most common sizes in the codebase:
|
|
30
|
+
* - md (14px): 60% of icons → FileTree, buttons, lists, sidebars
|
|
31
|
+
* - lg (16px): 20% of icons → Headers, main actions
|
|
32
|
+
* - sm (12px): 10% of icons → Inline, compact
|
|
33
|
+
* - xs (10px): 8% of icons → Badges, tiny status
|
|
34
|
+
* - xl+ (18-24px): 2% of icons → Empty states, highlights
|
|
35
|
+
*/
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized panel width configuration.
|
|
3
|
+
* All panel sizing constants in one place for easy maintenance.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { PanelId } from '@/components/ActivityBar';
|
|
7
|
+
|
|
8
|
+
// ── Left Panel (Files/Search/Agents/Echo/Discover) ──
|
|
9
|
+
|
|
10
|
+
export const DEFAULT_LEFT_PANEL_WIDTH: Record<PanelId, number> = {
|
|
11
|
+
files: 280,
|
|
12
|
+
search: 320,
|
|
13
|
+
echo: 340,
|
|
14
|
+
agents: 300,
|
|
15
|
+
discover: 300,
|
|
16
|
+
workflows: 320,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const LEFT_PANEL: { DEFAULT: number; MIN: number; MAX_RATIO: number; MAX_ABS: number } = {
|
|
20
|
+
DEFAULT: 280,
|
|
21
|
+
MIN: 240,
|
|
22
|
+
MAX_RATIO: 0.45, // 45% of screen width
|
|
23
|
+
MAX_ABS: 600, // Absolute pixel max
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// ── Right Ask Panel ──
|
|
27
|
+
|
|
28
|
+
export const RIGHT_ASK_PANEL: { DEFAULT: number; MIN: number; MAX_ABS: number; MIN_CONTENT: number } = {
|
|
29
|
+
DEFAULT: 420,
|
|
30
|
+
MIN: 400,
|
|
31
|
+
MAX_ABS: 4000, // Unlikely but safe upper bound
|
|
32
|
+
MIN_CONTENT: 360, // Minimum content width when panel is resized
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// ── Right Agent Detail Panel ──
|
|
36
|
+
|
|
37
|
+
export const RIGHT_AGENT_DETAIL_PANEL: { DEFAULT: number; MIN: number; MAX_ABS: number; MAX_RATIO: number } = {
|
|
38
|
+
DEFAULT: 400,
|
|
39
|
+
MIN: 300,
|
|
40
|
+
MAX_ABS: 640,
|
|
41
|
+
MAX_RATIO: 0.42, // 42% of screen width
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// ── Mobile/Responsive Breakpoints ──
|
|
45
|
+
|
|
46
|
+
export const RESPONSIVE_BREAKPOINTS = {
|
|
47
|
+
mobile: 375,
|
|
48
|
+
tablet: 768,
|
|
49
|
+
desktop: 1024,
|
|
50
|
+
wide: 1440,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// ── Activity Bar ──
|
|
54
|
+
|
|
55
|
+
export const ACTIVITY_BAR = {
|
|
56
|
+
WIDTH_COLLAPSED: 48,
|
|
57
|
+
WIDTH_EXPANDED: 180,
|
|
58
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Focus trap hook: keeps Tab navigation within a dialog/modal.
|
|
7
|
+
* Wraps focus from last focusable element back to first, and vice versa.
|
|
8
|
+
*/
|
|
9
|
+
export function useFocusTrap(ref: React.RefObject<HTMLElement | null>, enabled = true) {
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (!enabled || !ref.current) return;
|
|
12
|
+
|
|
13
|
+
const handleKeyDown = (e: KeyboardEvent) => {
|
|
14
|
+
if (e.key !== 'Tab') return;
|
|
15
|
+
|
|
16
|
+
const focusableElements = ref.current?.querySelectorAll(
|
|
17
|
+
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
18
|
+
) as NodeListOf<HTMLElement>;
|
|
19
|
+
|
|
20
|
+
if (!focusableElements || focusableElements.length === 0) return;
|
|
21
|
+
|
|
22
|
+
const firstElement = focusableElements[0];
|
|
23
|
+
const lastElement = focusableElements[focusableElements.length - 1];
|
|
24
|
+
const activeElement = document.activeElement;
|
|
25
|
+
|
|
26
|
+
if (e.shiftKey) {
|
|
27
|
+
// Shift+Tab on first element -> focus last
|
|
28
|
+
if (activeElement === firstElement) {
|
|
29
|
+
e.preventDefault();
|
|
30
|
+
lastElement.focus();
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
// Tab on last element -> focus first
|
|
34
|
+
if (activeElement === lastElement) {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
firstElement.focus();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const container = ref.current;
|
|
42
|
+
container.addEventListener('keydown', handleKeyDown);
|
|
43
|
+
return () => container.removeEventListener('keydown', handleKeyDown);
|
|
44
|
+
}, [ref, enabled]);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Return focus hook: saves reference to trigger element and restores focus on unmount
|
|
49
|
+
*/
|
|
50
|
+
export function useReturnFocus() {
|
|
51
|
+
const triggerRef = useRef<HTMLElement | null>(null);
|
|
52
|
+
|
|
53
|
+
const saveTrigger = (el: HTMLElement | null) => {
|
|
54
|
+
triggerRef.current = el;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
return () => {
|
|
59
|
+
// Return focus on unmount
|
|
60
|
+
triggerRef.current?.focus();
|
|
61
|
+
};
|
|
62
|
+
}, []);
|
|
63
|
+
|
|
64
|
+
return saveTrigger;
|
|
65
|
+
}
|
|
@@ -110,8 +110,8 @@ export const knowledgeEn = {
|
|
|
110
110
|
dropOverlay: 'Drop to save to Capture',
|
|
111
111
|
dropOverlayFormats: 'md · txt · pdf · csv · json',
|
|
112
112
|
noMindRoot: 'Please configure your knowledge base first',
|
|
113
|
-
saveFailed: 'Failed to save files',
|
|
114
|
-
organizeFailed: 'Could not read files for organizing',
|
|
113
|
+
saveFailed: 'Failed to save files. Check disk space and permissions.',
|
|
114
|
+
organizeFailed: 'Could not read files for organizing. Check file permissions.',
|
|
115
115
|
},
|
|
116
116
|
pulse: {
|
|
117
117
|
title: 'Your Agents',
|
|
@@ -162,7 +162,8 @@ export const knowledgeEn = {
|
|
|
162
162
|
title: 'Pinned Files',
|
|
163
163
|
addedToast: 'Added to Favorites',
|
|
164
164
|
removedToast: 'Removed from Favorites',
|
|
165
|
-
empty: '
|
|
165
|
+
empty: 'No pinned files',
|
|
166
|
+
emptyHint: 'Click the star icon on any file to pin it here',
|
|
166
167
|
},
|
|
167
168
|
trash: {
|
|
168
169
|
title: 'Trash',
|
|
@@ -182,6 +183,9 @@ export const knowledgeEn = {
|
|
|
182
183
|
movedToTrash: 'Deleted',
|
|
183
184
|
undo: 'Undo',
|
|
184
185
|
undoFailed: 'Undo failed',
|
|
186
|
+
restoreFailed: 'Could not restore file. Check disk space and try again.',
|
|
187
|
+
deleteFailed: 'Could not permanently delete. Please try again.',
|
|
188
|
+
emptyFailed: 'Could not empty trash. Please try again.',
|
|
185
189
|
emptied: (count: number) => `Emptied ${count} item${count !== 1 ? 's' : ''} from Trash`,
|
|
186
190
|
restoreConflict: 'A file with this name already exists at the original location.',
|
|
187
191
|
overwrite: 'Overwrite',
|
|
@@ -218,7 +222,7 @@ export const knowledgeEn = {
|
|
|
218
222
|
downloadAgain: 'Download Again',
|
|
219
223
|
fileCount: (n: number) => `${n} file${n !== 1 ? 's' : ''}`,
|
|
220
224
|
downloaded: 'Downloaded',
|
|
221
|
-
error: 'Export failed',
|
|
225
|
+
error: 'Export failed. Please check disk space and try again.',
|
|
222
226
|
retry: 'Retry',
|
|
223
227
|
},
|
|
224
228
|
fileImport: {
|
|
@@ -469,8 +473,8 @@ export const knowledgeZh = {
|
|
|
469
473
|
dropOverlay: '拖放到暂存台快速保存',
|
|
470
474
|
dropOverlayFormats: 'md · txt · pdf · csv · json',
|
|
471
475
|
noMindRoot: '请先配置知识库路径',
|
|
472
|
-
saveFailed: '
|
|
473
|
-
organizeFailed: '
|
|
476
|
+
saveFailed: '保存文件失败,请检查磁盘空间和权限。',
|
|
477
|
+
organizeFailed: '无法读取文件进行整理,请检查文件权限。',
|
|
474
478
|
},
|
|
475
479
|
pulse: {
|
|
476
480
|
title: '你的 Agent',
|
|
@@ -521,7 +525,8 @@ export const knowledgeZh = {
|
|
|
521
525
|
title: '收藏文件',
|
|
522
526
|
addedToast: '已添加到收藏',
|
|
523
527
|
removedToast: '已取消收藏',
|
|
524
|
-
empty: '
|
|
528
|
+
empty: '还没有收藏文件',
|
|
529
|
+
emptyHint: '点击任何文件上的星标图标即可收藏',
|
|
525
530
|
},
|
|
526
531
|
trash: {
|
|
527
532
|
title: '回收站',
|
|
@@ -541,6 +546,9 @@ export const knowledgeZh = {
|
|
|
541
546
|
movedToTrash: '已删除',
|
|
542
547
|
undo: '撤销',
|
|
543
548
|
undoFailed: '撤销失败',
|
|
549
|
+
restoreFailed: '无法恢复文件,请检查磁盘空间后重试。',
|
|
550
|
+
deleteFailed: '无法彻底删除,请重试。',
|
|
551
|
+
emptyFailed: '无法清空回收站,请重试。',
|
|
544
552
|
emptied: (count: number) => `已清空 ${count} 个项目`,
|
|
545
553
|
restoreConflict: '原位置已有同名文件。',
|
|
546
554
|
overwrite: '覆盖',
|
|
@@ -577,7 +585,7 @@ export const knowledgeZh = {
|
|
|
577
585
|
downloadAgain: '再次下载',
|
|
578
586
|
fileCount: (n: number) => `${n} 个文件`,
|
|
579
587
|
downloaded: '已下载',
|
|
580
|
-
error: '
|
|
588
|
+
error: '导出失败,请检查磁盘空间后重试。',
|
|
581
589
|
retry: '重试',
|
|
582
590
|
},
|
|
583
591
|
fileImport: {
|
|
@@ -11,7 +11,7 @@ export const onboardingEn = {
|
|
|
11
11
|
importHint: 'Already have notes? Set MIND_ROOT to your existing directory in Settings.',
|
|
12
12
|
syncHint: 'Want cross-device sync? Run',
|
|
13
13
|
syncHintSuffix: 'in the terminal after setup.',
|
|
14
|
-
initError: 'Initialization failed. Please try
|
|
14
|
+
initError: 'Initialization failed. Please refresh the page or try a different template.',
|
|
15
15
|
dismiss: 'Dismiss',
|
|
16
16
|
},
|
|
17
17
|
setup: {
|
|
@@ -233,7 +233,7 @@ export const onboardingZh = {
|
|
|
233
233
|
importHint: '已有笔记?在设置中将 MIND_ROOT 指向已有目录即可。',
|
|
234
234
|
syncHint: '需要跨设备同步?完成初始化后在终端运行',
|
|
235
235
|
syncHintSuffix: '即可。',
|
|
236
|
-
initError: '
|
|
236
|
+
initError: '初始化失败。请刷新页面或尝试其他模板。',
|
|
237
237
|
dismiss: '关闭',
|
|
238
238
|
},
|
|
239
239
|
setup: {
|
|
@@ -12,6 +12,8 @@ export const settingsEn = {
|
|
|
12
12
|
baseUrlHint: 'Optional. Use for proxies or custom API endpoints.',
|
|
13
13
|
keyHint: 'Stored locally in ~/.mindos/config.json',
|
|
14
14
|
keyOptionalHint: 'Optional for local providers. Stored in ~/.mindos/config.json',
|
|
15
|
+
keyChange: 'Change',
|
|
16
|
+
keyCancel: 'Cancel',
|
|
15
17
|
envHint: 'Fields marked env have a value from environment variables. You can override them here, or restore all to env defaults.',
|
|
16
18
|
envFieldNote: (key: string) => `Env var ${key} is set. Clear this field to fall back to it.`,
|
|
17
19
|
resetToEnv: 'Reset to env value',
|
|
@@ -458,6 +460,8 @@ export const settingsZh = {
|
|
|
458
460
|
envFieldNote: (key: string) => `环境变量 ${key} 已设置。清空此字段将回退到环境变量值。`,
|
|
459
461
|
resetToEnv: '恢复为环境变量',
|
|
460
462
|
restoreFromEnv: '从环境变量恢复',
|
|
463
|
+
keyChange: '更改',
|
|
464
|
+
keyCancel: '取消',
|
|
461
465
|
noApiKey: 'API 密钥未设置,AI 功能暂不可用,请在此填写。',
|
|
462
466
|
testKey: '测试',
|
|
463
467
|
testKeyTesting: '测试中...',
|
package/package.json
CHANGED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=1975,exports.ids=[1975],exports.modules={1160:(a,b,c)=>{c.d(b,{GL:()=>d,_l:()=>e,e1:()=>f}),c(29021),c(33873);let d=a=>`# ${a} Instruction Set
|
|
2
|
-
|
|
3
|
-
## Goal
|
|
4
|
-
|
|
5
|
-
- Define local execution rules for this directory.
|
|
6
|
-
|
|
7
|
-
## Local Rules
|
|
8
|
-
|
|
9
|
-
- Read root \`INSTRUCTION.md\` first.
|
|
10
|
-
- Then read this directory \`README.md\` for navigation.
|
|
11
|
-
- Keep edits minimal, structured, and traceable.
|
|
12
|
-
|
|
13
|
-
## Execution Order
|
|
14
|
-
|
|
15
|
-
1. Root \`INSTRUCTION.md\`
|
|
16
|
-
2. This directory \`INSTRUCTION.md\`
|
|
17
|
-
3. This directory \`README.md\` and target files
|
|
18
|
-
|
|
19
|
-
## Boundary
|
|
20
|
-
|
|
21
|
-
- Root rules win on conflict.
|
|
22
|
-
`,e=a=>`# ${a}
|
|
23
|
-
|
|
24
|
-
## 📁 Structure
|
|
25
|
-
|
|
26
|
-
\`\`\`bash
|
|
27
|
-
${a}/
|
|
28
|
-
├── INSTRUCTION.md
|
|
29
|
-
├── README.md
|
|
30
|
-
└── (your files here)
|
|
31
|
-
\`\`\`
|
|
32
|
-
|
|
33
|
-
## 💡 Usage
|
|
34
|
-
|
|
35
|
-
(Describe the purpose and usage of this space.)
|
|
36
|
-
`;function f(a){return a.replace(/^[\p{Emoji_Presentation}\p{Extended_Pictographic}\s]+/u,"")||a}},4120:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{kh:()=>o});var e=c(29021),f=c.n(e),g=c(33873),h=c.n(g),i=c(21820),j=c.n(i),k=c(61374),l=c(27313),m=a([l]);l=(m.then?(await m)():m)[0];let p=h().join(j().homedir(),".mindos","config.json"),q={ai:{provider:"anthropic",providers:{anthropic:{apiKey:"",model:"claude-sonnet-4-6"},openai:{apiKey:"",model:"gpt-5.4",baseUrl:""}}},mindRoot:""};function n(a,b,c){if(a&&"object"==typeof a){let c=a[b];if("string"==typeof c&&""!==c.trim())return c}return c}function o(){return function(){try{var a;let b=f().readFileSync(p,"utf-8"),c=JSON.parse(b);return{ai:function(a){let b=a.ai;if(!b)return{...q.ai};let c="string"==typeof b.provider?b.provider:"anthropic",d=(0,l.rl)(c)?c:"anthropic";if(b.providers&&"object"==typeof b.providers){let a=b.providers,c={};for(let b of Object.keys(a)){var e;if(!(0,l.rl)(b))continue;let d=l.T_[b],f=q.ai.providers[b]??{apiKey:"",model:d.defaultModel};c[b]=(e=a[b],{apiKey:n(e,"apiKey",f.apiKey),model:n(e,"model",f.model),...void 0!==f.baseUrl?{baseUrl:n(e,"baseUrl",f.baseUrl)}:{}})}return c.anthropic||(c.anthropic=q.ai.providers.anthropic),c.openai||(c.openai=q.ai.providers.openai),{provider:d,providers:c}}return{provider:d,providers:{anthropic:{apiKey:n(b,"anthropicApiKey",""),model:n(b,"anthropicModel","claude-sonnet-4-6")},openai:{apiKey:n(b,"openaiApiKey",""),model:n(b,"openaiModel","gpt-5.4"),baseUrl:n(b,"openaiBaseUrl","")}}}}(c),agent:function(a){if(!a||"object"!=typeof a)return;let b={};return"number"==typeof a.maxSteps&&(b.maxSteps=Math.min(30,Math.max(1,a.maxSteps))),"boolean"==typeof a.enableThinking&&(b.enableThinking=a.enableThinking),"number"==typeof a.thinkingBudget&&(b.thinkingBudget=Math.min(5e4,Math.max(1e3,a.thinkingBudget))),("auto"===a.contextStrategy||"off"===a.contextStrategy)&&(b.contextStrategy=a.contextStrategy),"number"==typeof a.reconnectRetries&&(b.reconnectRetries=Math.min(10,Math.max(0,a.reconnectRetries))),Object.keys(b).length>0?b:void 0}(c.agent),acpAgents:(a=c.acpAgents,(0,k.gG)(a)),mindRoot:c.mindRoot??q.mindRoot,webPassword:"string"==typeof c.webPassword?c.webPassword:void 0,authToken:"string"==typeof c.authToken?c.authToken:void 0,mcpPort:"number"==typeof c.mcpPort?c.mcpPort:void 0,port:"number"==typeof c.port?c.port:void 0,startMode:"string"==typeof c.startMode?c.startMode:void 0,setupPending:!0===c.setupPending||void 0,disabledSkills:Array.isArray(c.disabledSkills)?c.disabledSkills:void 0,guideState:function(a){if(!a||"object"!=typeof a||!0!==a.active)return;let b="en"===a.template||"zh"===a.template||"empty"===a.template?a.template:"en";return{active:!0,dismissed:!0===a.dismissed,template:b,step1Done:!0===a.step1Done,askedAI:!0===a.askedAI,nextStepIndex:"number"==typeof a.nextStepIndex?a.nextStepIndex:0,walkthroughStep:"number"==typeof a.walkthroughStep?a.walkthroughStep:void 0,walkthroughDismissed:"boolean"==typeof a.walkthroughDismissed?a.walkthroughDismissed:void 0}}(c.guideState)}}catch{return{...q,ai:{...q.ai,providers:{...q.ai.providers}},setupPending:!0}}}().mindRoot||process.env.MIND_ROOT||h().join(j().homedir(),"MindOS","mind")}d()}catch(a){d(a)}})},14432:(a,b,c)=>{c.d(b,{Xs:()=>z,As:()=>v,rt:()=>d.rt,x3:()=>d.x3,_E:()=>u,H5:()=>d.H5,OV:()=>d.OV}),c(99863);var d=c(18451),e=c(29021),f=c.n(e);c(79748);var g=c(33873),h=c.n(g);let i=new Set([".git","node_modules","app",".next",".DS_Store","mcp"]),j=new Set([".md",".csv"]),k=new Set(["INSTRUCTION.md","README.md","CONFIG.json","CHANGELOG.md"]);function l(a,b,c={}){let d,e=h().resolve(a),g=b??e,m=c.ignoredDirs??i,n=c.allowedExtensions??j;try{d=f().readdirSync(g,{withFileTypes:!0})}catch{return[]}let o=[];for(let b of d){let d=h().join(g,b.name);if(b.isDirectory()){if(m.has(b.name))continue;o.push(...l(a,d,c))}else if(b.isFile()){if(g===e&&k.has(b.name))continue;let a=h().extname(b.name).toLowerCase();n.has(a)&&o.push(h().relative(e,d))}}return o}var m=c(21820),n=c.n(m);let o=/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]/,p="u">typeof Intl&&Intl.Segmenter?new Intl.Segmenter("zh",{granularity:"word"}):null;function q(a){let b=new Set,c=a.toLowerCase(),d=c.match(/[a-z0-9_$@#]+/g);if(d)for(let a of d)a.length>=2&&b.add(a);if(o.test(c))if(p)for(let{segment:a,isWordLike:d}of p.segment(c)){if(!d)continue;let c=a.trim();if(c)for(let a of(b.add(c),c))o.test(a)&&b.add(a)}else{let a=[];for(let d of c)o.test(d)?a.push(d):a.length>0&&(r(a,b),a.length=0);a.length>0&&r(a,b)}return b}function r(a,b){for(let c=0;c<a.length;c++)b.add(a[c]),c+1<a.length&&b.add(a[c]+a[c+1])}class s{rebuild(a){let b=l(a),c=new Map,e=new Map,f=new Map,g=0;for(let h of b){let b;try{b=(0,d.TA)(a,h)}catch{continue}e.set(h,b.length),g+=b.length,b.length>5e4&&(b=b.slice(0,5e4));let i=q(h+"\n"+b);for(let a of(f.set(h,i),i)){let b=c.get(a);b||(b=new Set,c.set(a,b)),b.add(h)}}this.invertedIndex=c,this.builtForRoot=a,this.fileCount=b.length,this.docLengths=e,this.totalChars=g,this.fileTokens=f}invalidate(){this.invertedIndex=null,this.builtForRoot=null,this.fileCount=0,this.docLengths.clear(),this.totalChars=0,this.fileTokens.clear()}removeFile(a){if(!this.invertedIndex)return;let b=this.fileTokens.get(a);if(b){for(let c of b)this.invertedIndex.get(c)?.delete(a);this.fileTokens.delete(a)}let c=this.docLengths.get(a)??0;this.totalChars-=c,this.docLengths.delete(a),this.fileCount=Math.max(0,this.fileCount-1)}addFile(a,b){let c;if(!this.invertedIndex)return;try{c=(0,d.TA)(a,b)}catch{return}this.docLengths.set(b,c.length),this.totalChars+=c.length,this.fileCount++,c.length>5e4&&(c=c.slice(0,5e4));let e=q(b+"\n"+c);for(let a of(this.fileTokens.set(b,e),e)){let c=this.invertedIndex.get(a);c||(c=new Set,this.invertedIndex.set(a,c)),c.add(b)}}updateFile(a,b){this.invertedIndex&&(this.removeFile(b),this.addFile(a,b))}isBuiltFor(a){return null!==this.invertedIndex&&this.builtForRoot===a}isBuilt(){return null!==this.invertedIndex}getFileCount(){return this.fileCount}getAvgDocLength(){return this.fileCount>0?this.totalChars/this.fileCount:0}getDocLength(a){return this.docLengths.get(a)??0}getDocFrequency(a){return this.invertedIndex?this.invertedIndex.get(a)?.size??0:0}getCandidatesUnion(a){if(!a.trim()||!this.invertedIndex)return null;let b=q(a.toLowerCase().trim());if(0===b.size)return null;let c=new Map;for(let a of b){let b=this.invertedIndex.get(a);if(b)for(let a of b)c.set(a,(c.get(a)??0)+1)}if(0===c.size)return[];let d=b.size;if(d>=3){let a=Math.max(1,Math.floor(d/2)),b=[...c.entries()].filter(([,b])=>b>=a).map(([a])=>a);if(b.length>0)return b}return[...c.keys()]}getCandidates(a){if(!a.trim()||!this.invertedIndex)return null;let b=q(a.toLowerCase().trim());if(0===b.size)return null;let c=null;for(let a of b){let b=this.invertedIndex.get(a);if(!b)return[];if(null===c)c=new Set(b);else{for(let a of c)b.has(a)||c.delete(a);if(0===c.size)return[]}}return c?Array.from(c):[]}persist(a){if(!this.invertedIndex)return;let b={version:1,builtForRoot:this.builtForRoot??"",fileCount:this.fileCount,totalChars:this.totalChars,docLengths:Object.fromEntries(this.docLengths),invertedIndex:{},timestamp:Date.now()};for(let[a,c]of this.invertedIndex)b.invertedIndex[a]=[...c];let c=h().join(a,"search-index.json");try{f().mkdirSync(a,{recursive:!0}),f().writeFileSync(c,JSON.stringify(b),"utf-8")}catch{}}load(a,b){let c,d,e=h().join(a,"search-index.json");try{c=f().readFileSync(e,"utf-8")}catch{return!1}try{d=JSON.parse(c)}catch{return!1}if(1!==d.version||d.builtForRoot!==b||l(b).length!==d.fileCount)return!1;let g=Object.keys(d.docLengths);if(Math.min(50,g.length)===g.length)for(let a of g)try{if(f().statSync(h().join(b,a)).mtimeMs>d.timestamp)return!1}catch{return!1}else{let a=Math.max(1,Math.floor(g.length/40)),c=new Set;for(let b=0;b<g.length;b+=a)c.add(b);for(let a=Math.max(0,g.length-10);a<g.length;a++)c.add(a);for(let a of c)try{if(f().statSync(h().join(b,g[a])).mtimeMs>d.timestamp)return!1}catch{return!1}}this.builtForRoot=d.builtForRoot,this.fileCount=d.fileCount,this.totalChars=d.totalChars,this.docLengths=new Map(Object.entries(d.docLengths).map(([a,b])=>[a,b]));let i=new Map,j=new Map;for(let[a,b]of Object.entries(d.invertedIndex)){let c=new Set(b);for(let b of(i.set(a,c),c)){let c=j.get(b);c||(c=new Set,j.set(b,c)),c.add(a)}}return this.invertedIndex=i,this.fileTokens=j,!0}constructor(){this.invertedIndex=null,this.builtForRoot=null,this.fileCount=0,this.docLengths=new Map,this.totalChars=0,this.fileTokens=new Map}}let t=new s;function u(){t.invalidate()}function v(a,b){t.isBuilt()&&(t.addFile(a,b),x=!0,w&&clearTimeout(w),w=setTimeout(y,5e3))}let w=null,x=!1;function y(){if(w&&(clearTimeout(w),w=null),x){x=!1;try{t.persist(h().join(n().homedir(),".mindos"))}catch{}}}"u">typeof process&&(process.on("beforeExit",y),process.on("SIGTERM",()=>{y(),process.exit(0)}),process.on("SIGINT",()=>{y(),process.exit(0)}));class z{rebuild(a){let b=l(a).filter(a=>a.endsWith(".md")),c=new Set(b),e=function(a){let b=new Map;for(let c of a){let a=h().basename(c).toLowerCase();b.has(a)||b.set(a,[]),b.get(a).push(c)}return b}(b),f=new Map,g=new Map;for(let h of b){let b;try{b=(0,d.TA)(a,h)}catch{continue}let i=A(b,h,c,e),j=new Set;for(let a of i)a!==h&&j.add(a);for(let a of(f.set(h,j),j)){let b=g.get(a);b||(b=new Set,g.set(a,b)),b.add(h)}}this.forwardLinks=f,this.backwardLinks=g,this.builtForRoot=a,this.fileSet=c,this.basenameMap=e}invalidate(){this.forwardLinks.clear(),this.backwardLinks.clear(),this.builtForRoot=null,this.fileSet.clear(),this.basenameMap.clear()}isBuiltFor(a){return this.builtForRoot===a}isBuilt(){return null!==this.builtForRoot}getForwardLinks(a){return[...this.forwardLinks.get(a)??[]]}getBacklinks(a){return[...this.backwardLinks.get(a)??[]]}getAllEdges(){let a=[];for(let[b,c]of this.forwardLinks)for(let d of c)a.push({source:b,target:d});return a}removeFile(a){let b=this.forwardLinks.get(a);if(b){for(let c of b)this.backwardLinks.get(c)?.delete(a);this.forwardLinks.delete(a)}let c=this.backwardLinks.get(a);if(c){for(let b of c)this.forwardLinks.get(b)?.delete(a);this.backwardLinks.delete(a)}this.fileSet.delete(a);let d=h().basename(a).toLowerCase(),e=this.basenameMap.get(d);if(e){let b=e.indexOf(a);b>=0&&e.splice(b,1),0===e.length&&this.basenameMap.delete(d)}}updateFile(a,b){let c;if(!this.builtForRoot||!b.endsWith(".md"))return;let e=this.forwardLinks.get(b);if(e)for(let a of e)this.backwardLinks.get(a)?.delete(b);try{c=(0,d.TA)(a,b)}catch{return}if(!this.fileSet.has(b)){this.fileSet.add(b);let a=h().basename(b).toLowerCase();this.basenameMap.has(a)||this.basenameMap.set(a,[]),this.basenameMap.get(a).push(b)}let f=A(c,b,this.fileSet,this.basenameMap),g=new Set;for(let a of f)a!==b&&g.add(a);for(let a of(this.forwardLinks.set(b,g),g)){let c=this.backwardLinks.get(a);c||(c=new Set,this.backwardLinks.set(a,c)),c.add(b)}}constructor(){this.forwardLinks=new Map,this.backwardLinks=new Map,this.builtForRoot=null,this.fileSet=new Set,this.basenameMap=new Map}}function A(a,b,c,d){let e,f=[],g=h().dirname(b),i=/\[\[([^\]|#]+)(?:[|#][^\]]*)?/g;for(;null!==(e=i.exec(a));){let a=e[1].trim();if(!a)continue;if(c.has(a)){f.push(a);continue}let b=a.endsWith(".md")?a:a+".md";if(c.has(b)){f.push(b);continue}let g=h().basename(b).toLowerCase(),i=d.get(g);i&&1===i.length&&f.push(i[0])}let j=/\[[^\]]+\]\(([^)]+\.md)(?:#[^)]*)?\)/g;for(;null!==(e=j.exec(a));){let a=e[1].trim();if(!a||a.startsWith("http"))continue;let b=h().normalize(h().join(g,a));c.has(b)&&f.push(b)}return f}c(20018),c(79646),c(15872)},15872:(a,b,c)=>{c.d(b,{_:()=>l,c:()=>k});var d=c(29021),e=c.n(d),f=c(33873),g=c.n(f),h=c(20018),i=c(18451),j=c(1160);function k(a,b,c){let d=b.replace(/^[\p{Emoji_Presentation}\p{Extended_Pictographic}\s]+/u,"")||b,e=c.trim()||"(Describe the purpose and usage of this space.)";return`# ${d}
|
|
37
|
-
|
|
38
|
-
${e}
|
|
39
|
-
|
|
40
|
-
## 📁 Structure
|
|
41
|
-
|
|
42
|
-
\`\`\`bash
|
|
43
|
-
${a}/
|
|
44
|
-
├── INSTRUCTION.md
|
|
45
|
-
├── README.md
|
|
46
|
-
└── (your files here)
|
|
47
|
-
\`\`\`
|
|
48
|
-
|
|
49
|
-
## 💡 Usage
|
|
50
|
-
|
|
51
|
-
(Add usage guidelines for this space.)
|
|
52
|
-
`}function l(a,b,c,d=""){let f=b.trim();if(!f)throw new h.Vt(h.tG.INVALID_REQUEST,"Space name is required",{name:b});if(f.includes("/")||f.includes("\\"))throw new h.Vt(h.tG.INVALID_PATH,"Space name must not contain path separators",{name:f});let m=d.replace(/\/+$/,"").trim();if(m.includes("..")||m.startsWith("/")||m.includes("\\"))throw new h.Vt(h.tG.INVALID_PATH,"Invalid parent path",{parentPath:d});let n=m?`${m}/`:"",o=`${n}${f}`,p=k(o,f,c);(0,i.x3)(a,`${o}/README.md`,p);let q=g().resolve(a,o),r=g().join(q,"INSTRUCTION.md");return e().existsSync(r)||e().writeFileSync(r,(0,j.GL)((0,j.e1)(f)),"utf-8"),{path:o}}},16081:(a,b,c)=>{c.d(b,{F0:()=>o,JI:()=>u,Lr:()=>p,YN:()=>t,hQ:()=>s,kz:()=>q,vn:()=>r});var d=c(29021),e=c.n(d),f=c(33873),g=c.n(f);function h(a,b){return g().join(g().dirname(a),b)}function i(a){return h(a,".trash")}function j(a){return h(a,".trash-meta")}function k(a){e().mkdirSync(i(a),{recursive:!0}),e().mkdirSync(j(a),{recursive:!0})}function l(a,b){let c=g().join(j(a),`${b}.json`);if(!e().existsSync(c))return null;try{return JSON.parse(e().readFileSync(c,"utf-8"))}catch{return null}}function m(a,b){let c=g().join(j(a),`${b}.json`);try{e().unlinkSync(c)}catch{}}function n(a,b,c){if(c)e().cpSync(a,b,{recursive:!0}),e().rmSync(a,{recursive:!0,force:!0});else try{e().renameSync(a,b)}catch(c){if("EXDEV"===c.code)e().copyFileSync(a,b),e().unlinkSync(a);else throw c}}function o(a,b){let c,d;k(a);let f=g().join(a,b);if(!e().existsSync(f))throw Error(`File not found: ${b}`);let h=e().statSync(f).isDirectory(),l=g().basename(b),m=(c=l.replace(/[^a-zA-Z0-9._\-\u4e00-\u9fff]/g,"_"),`${Date.now()}_${c}`),o=g().join(i(a),m);e().mkdirSync(g().dirname(o),{recursive:!0}),n(f,o,h);let p=new Date,q={id:m,originalPath:b,deletedAt:p.toISOString(),expiresAt:new Date(p.getTime()+2592e6).toISOString(),fileName:l,isDirectory:h};return d=g().join(j(a),`${q.id}.json`),e().writeFileSync(d,JSON.stringify(q,null,2),"utf-8"),q}function p(a,b,c=!1){let d=l(a,b);if(!d)throw Error("Item not found in trash");let f=g().join(i(a),b);if(!e().existsSync(f))throw Error("Trash file missing from disk");let h=g().join(a,d.originalPath);if(e().existsSync(h)&&!c)throw Object.assign(Error("Restore conflict: file exists at original location"),{code:"RESTORE_CONFLICT"});return e().mkdirSync(g().dirname(h),{recursive:!0}),d.isDirectory?c&&e().existsSync(h)&&e().rmSync(h,{recursive:!0,force:!0}):c&&e().existsSync(h)&&e().unlinkSync(h),n(f,h,d.isDirectory),m(a,b),{restoredPath:d.originalPath}}function q(a,b){let c=l(a,b);if(!c)throw Error("Item not found in trash");let d=g().join(i(a),b);if(!e().existsSync(d))throw Error("Trash file missing from disk");let f=g().dirname(c.originalPath),h=g().extname(c.fileName),j=g().basename(c.fileName,h),k=g().join(f,`${j} (copy)${h}`),o=2;for(;e().existsSync(g().join(a,k));)k=g().join(f,`${j} (copy ${o})${h}`),o++;let p=g().join(a,k);return e().mkdirSync(g().dirname(p),{recursive:!0}),n(d,p,c.isDirectory),m(a,b),{restoredPath:k}}function r(a,b){let c=g().join(i(a),b);try{e().existsSync(c)&&(e().statSync(c).isDirectory()?e().rmSync(c,{recursive:!0,force:!0}):e().unlinkSync(c))}catch{}m(a,b)}function s(a){let b;k(a);let c=j(a);try{b=e().readdirSync(c).filter(a=>a.endsWith(".json"))}catch{return[]}let d=[];for(let f of b)try{let b=JSON.parse(e().readFileSync(g().join(c,f),"utf-8")),h=g().join(i(a),b.id);if(e().existsSync(h))d.push(b);else try{e().unlinkSync(g().join(c,f))}catch{}}catch{}return d.sort((a,b)=>new Date(b.deletedAt).getTime()-new Date(a.deletedAt).getTime()),d}function t(a){let b=s(a);for(let c of b)r(a,c.id);return b.length}function u(a){let b=s(a),c=Date.now(),d=0;for(let e of b)new Date(e.expiresAt).getTime()<=c&&(r(a,e.id),d++);return d}},18451:(a,b,c)=>{c.d(b,{H5:()=>n,OV:()=>o,TA:()=>k,rt:()=>m,x3:()=>l});var d=c(29021),e=c.n(d),f=c(33873),g=c.n(f),h=c(99863),i=c(20018),j=c(1160);function k(a,b){let c=(0,h.eX)(a,b);return e().readFileSync(c,"utf-8")}function l(a,b,c=""){let d=(0,h.eX)(a,b);e().mkdirSync(g().dirname(d),{recursive:!0});try{e().writeFileSync(d,c,{encoding:"utf-8",flag:"wx"})}catch(a){if(a instanceof Error&&"code"in a&&"EEXIST"===a.code)throw new i.Vt(i.tG.FILE_ALREADY_EXISTS,`File already exists: ${b}`,{filePath:b});throw a}}function m(a,b){let c=(0,h.eX)(a,b);if(!e().existsSync(c))throw new i.Vt(i.tG.FILE_NOT_FOUND,`Directory not found: ${b}`,{dirPath:b});if(!e().statSync(c).isDirectory())throw new i.Vt(i.tG.INVALID_PATH,`Not a directory: ${b}`,{dirPath:b});let d=g().basename(c),f=(0,j.e1)(d),k=g().join(c,"INSTRUCTION.md");e().existsSync(k)||e().writeFileSync(k,(0,j.GL)(f),"utf-8");let l=g().join(c,"README.md");e().existsSync(l)||e().writeFileSync(l,(0,j._l)(f),"utf-8")}function n(a,b,c){if(c.includes("/")||c.includes("\\"))throw new i.Vt(i.tG.INVALID_PATH,"Invalid filename: must not contain path separators",{newName:c});let d=g().resolve(a),f=g().resolve(g().join(d,b));(0,h.cP)(f,d);let j=g().dirname(f),k=g().join(j,c);if((0,h.cP)(k,d),e().existsSync(k))throw new i.Vt(i.tG.FILE_ALREADY_EXISTS,"A file with that name already exists",{newName:c});return e().renameSync(f,k),g().relative(d,k)}function o(a,b,c){let d=c.trim();if(!d||d.includes("/")||d.includes("\\"))throw new i.Vt(i.tG.INVALID_PATH,"Invalid space name: must not contain path separators",{newName:c});let f=b.replace(/\/+$/g,"").trim();if(!f)throw new i.Vt(i.tG.INVALID_PATH,"Space path is required",{spacePath:b});let j=g().resolve(a),k=(0,h.eX)(a,f);if(!e().existsSync(k))throw new i.Vt(i.tG.FILE_NOT_FOUND,`Space not found: ${f}`,{spacePath:f});if(!e().statSync(k).isDirectory())throw new i.Vt(i.tG.INVALID_PATH,`Not a directory: ${f}`,{spacePath:f});let l=g().dirname(k),m=g().join(l,d);if((0,h.cP)(m,j),e().existsSync(m))throw new i.Vt(i.tG.FILE_ALREADY_EXISTS,"A space with that name already exists",{newName:d});return e().renameSync(k,m),g().relative(j,m)}},20018:(a,b,c)=>{c.d(b,{Vt:()=>d,tG:()=>e}),c(20457);class d extends Error{constructor(a,b,c,d){super(b),this.code=a,this.context=c,this.userMessage=d,this.name="MindOSError"}}let e={FILE_NOT_FOUND:"FILE_NOT_FOUND",FILE_ALREADY_EXISTS:"FILE_ALREADY_EXISTS",PATH_OUTSIDE_ROOT:"PATH_OUTSIDE_ROOT",PROTECTED_FILE:"PROTECTED_FILE",INVALID_PATH:"INVALID_PATH",INVALID_RANGE:"INVALID_RANGE",HEADING_NOT_FOUND:"HEADING_NOT_FOUND",INVALID_FILE_TYPE:"INVALID_FILE_TYPE",INVALID_REQUEST:"INVALID_REQUEST",MODEL_INIT_FAILED:"MODEL_INIT_FAILED",INTERNAL_ERROR:"INTERNAL_ERROR",PERMISSION_DENIED:"PERMISSION_DENIED"}},27114:(a,b,c)=>{c.d(b,{A:()=>d});let d=new Set(["TODO.md"])},27313:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{T_:()=>h,rl:()=>g});var e=c(14270),f=a([e]);e=(f.then?(await f)():f)[0];let h={anthropic:{id:"anthropic",name:"Anthropic",nameZh:"Anthropic",defaultModel:"claude-sonnet-4-6",supportsBaseUrl:!0,supportsThinking:!0,supportsListModels:!0,signupUrl:"https://console.anthropic.com/settings/keys",category:"primary"},openai:{id:"openai",name:"OpenAI",nameZh:"OpenAI",defaultModel:"gpt-5.4",supportsBaseUrl:!0,supportsThinking:!0,supportsListModels:!0,signupUrl:"https://platform.openai.com/api-keys",category:"primary"},google:{id:"google",name:"Google Gemini",nameZh:"Google Gemini",defaultModel:"gemini-2.5-flash",supportsBaseUrl:!1,supportsThinking:!0,supportsListModels:!1,signupUrl:"https://aistudio.google.com/apikey",category:"primary"},groq:{id:"groq",name:"Groq",nameZh:"Groq",defaultModel:"llama-3.3-70b-versatile",supportsBaseUrl:!1,supportsThinking:!1,supportsListModels:!0,signupUrl:"https://console.groq.com/keys",category:"more"},xai:{id:"xai",name:"xAI (Grok)",nameZh:"xAI (Grok)",defaultModel:"grok-3",supportsBaseUrl:!1,supportsThinking:!1,supportsListModels:!0,category:"more"},openrouter:{id:"openrouter",name:"OpenRouter",nameZh:"OpenRouter",defaultModel:"anthropic/claude-sonnet-4",supportsBaseUrl:!1,supportsThinking:!1,supportsListModels:!0,category:"more"},mistral:{id:"mistral",name:"Mistral",nameZh:"Mistral",defaultModel:"mistral-large-latest",supportsBaseUrl:!1,supportsThinking:!1,supportsListModels:!0,category:"more"},deepseek:{id:"deepseek",name:"DeepSeek",nameZh:"DeepSeek",defaultModel:"deepseek-chat",piProviderOverride:"openai",fixedBaseUrl:"https://api.deepseek.com/v1",supportsBaseUrl:!0,supportsThinking:!0,supportsListModels:!0,signupUrl:"https://platform.deepseek.com/api_keys",category:"more"},zai:{id:"zai",name:"ZhipuAI (GLM)",nameZh:"智谱 AI (GLM)",defaultModel:"glm-4-plus",supportsBaseUrl:!1,supportsThinking:!0,supportsListModels:!1,category:"more"},"kimi-coding":{id:"kimi-coding",name:"Kimi Coding",nameZh:"Kimi Coding (月之暗面)",defaultModel:"kimi-k2-thinking",supportsBaseUrl:!1,supportsThinking:!0,supportsListModels:!1,category:"more"},cerebras:{id:"cerebras",name:"Cerebras",nameZh:"Cerebras",defaultModel:"llama-4-scout-17b-16e",supportsBaseUrl:!1,supportsThinking:!1,supportsListModels:!0,category:"more"},minimax:{id:"minimax",name:"MiniMax",nameZh:"MiniMax",defaultModel:"MiniMax-M1",supportsBaseUrl:!1,supportsThinking:!1,supportsListModels:!1,category:"more"},huggingface:{id:"huggingface",name:"Hugging Face",nameZh:"Hugging Face",defaultModel:"Qwen/Qwen3-235B-A22B-Thinking-2507",supportsBaseUrl:!1,supportsThinking:!0,supportsListModels:!1,category:"more"},ollama:{id:"ollama",name:"Ollama",nameZh:"Ollama (本地)",defaultModel:"llama3.2",piProviderOverride:"openai",fixedBaseUrl:"http://localhost:11434/v1",apiKeyFallback:"ollama",supportsBaseUrl:!0,supportsThinking:!1,supportsListModels:!0,signupUrl:"https://ollama.com/download",category:"more"}};function g(a){return a in h}Object.keys(h),d()}catch(a){d(a)}})},41975:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{"00124fbbb2d54822bb55e40ccb308d9ffbd79c4545":()=>e.Dg,"0016ccf9852ddf2df73119740f2a0f9d19d954ea76":()=>e.EG,"00bc98fb0074c29ab21bb23527b08463902d5b7b81":()=>e.GB,"00c3ada322f442c0323aad727e3b951d909e82ffdb":()=>e.Bn,"402909e188515f875e85642c1be0a610fae6e1954c":()=>e.Ar,"4044d8a936a0e405b92c536edec0923fdaeca0c7d7":()=>e.jW,"4051c47e1e704574d45142df485b7e024c50db7624":()=>e.ku,"4053ca35175914c5f1d2ffef7a6e7ad2064466db82":()=>e.iJ,"405f39a457927c579b69db7aa1f9466621e5a30f97":()=>e.Ye,"4089bc37efa49e0fd2ddcf39df67de8e099e1c214f":()=>e.VO,"409da9654f31d49ca1698290723beb577d4d7071e1":()=>e.bC,"602795d93a4b2b9c441528b89eb955c5380ab674c4":()=>e.f,"6031f72b04accf221d1b9a1bac1b1cf492e6e96f16":()=>e.pG,"603c49469eb0740a9920076daa879d0f7ab172b2a2":()=>e.X3,"605a421d86eb41a6e61ba0376bf0af4a506ba96f08":()=>e.NN,"700a18381ccae4cd6d27f4edf5a7e63c1c9c2f917a":()=>e.pX,"70dfff642bee2c35399989b22c8ad41ab96d7fc665":()=>e.FZ});var e=c(85224),f=a([e]);e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},53134:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{H5:()=>r,JX:()=>l,Jh:()=>s,f:()=>p,gm:()=>m,rt:()=>t,x3:()=>q});var e=c(29021),f=c.n(e),g=c(33873),h=c.n(g);c(20018);var i=c(14432),j=c(4120);c(16081);var k=a([j]);function l(){return(0,j.kh)()}j=(k.then?(await k)():k)[0];let u=new Set([".git","node_modules","app",".next",".DS_Store"]),v=new Set([".md",".csv",".json"]),w=null,x=0,y=new i.Xs;function m(){w=null,x++,(0,i._E)(),y.invalidate()}let z=null,A=null;function n(a,b){try{let c=f().readFileSync(a,"utf-8"),d=[];for(let a of c.split("\n")){let c=a.trim();if(!(!c||c.startsWith("#"))&&(d.push(c),d.length>=b))break}return d}catch{return[]}}let B=["Define local execution rules for this directory.","(your files here)","(Describe the purpose and usage of this space.)","(Add usage guidelines for this space.)"];function o(a){try{let b=f().readFileSync(a,"utf-8");return B.some(a=>b.includes(a))}catch{return!1}}function p(){var a;let b,c;return(null!==w&&Date.now()-w.timestamp<5e3?w:(a=l(),b=function a(b,c){let d,e=c??l();try{d=f().readdirSync(b,{withFileTypes:!0})}catch{return[]}let g=[];for(let c of d){let d=h().join(b,c.name),f=h().relative(e,d);if(c.isDirectory()){if(u.has(c.name))continue;let b=a(d,e);if(b.length>0){let a=b.some(a=>"file"===a.type&&"INSTRUCTION.md"===a.name),e={name:c.name,path:f,type:"directory",children:b};a&&(e.isSpace=!0,e.spacePreview=function(a){let b=h().join(a,"INSTRUCTION.md"),c=h().join(a,"README.md");return{instructionLines:n(b,3),readmeLines:n(c,3),isTemplate:o(b)&&o(c)}}(d)),g.push(e)}}else if(c.isFile()){let a=h().extname(c.name).toLowerCase();v.has(a)&&g.push({name:c.name,path:f,type:"file",extension:a})}}return g.sort((a,b)=>a.type!==b.type?"directory"===a.type?-1:1:a.name.localeCompare(b.name)),g}(a),c=[],function a(b){for(let d of b)"file"===d.type?c.push(d.path):d.children&&a(d.children)}(b),w={tree:b,allFiles:c,timestamp:Date.now()},z||function(){let a;if(!z){try{a=l()}catch{return}try{(z=f().watch(a,{recursive:!0},(a,b)=>{!b||b.startsWith(".git")||b.includes("node_modules")||b.includes(".next")||(A&&clearTimeout(A),A=setTimeout(()=>{w=null,A=null},500))})).on("error",()=>{A&&(clearTimeout(A),A=null),z&&(z.close(),z=null)})}catch{z=null}}}(),w)).allFiles}function q(a,b=""){(0,i.x3)(l(),a,b),w=null,x++,(0,i.As)(l(),a),y.isBuilt()&&y.updateFile(l(),a)}function r(a,b){let c=(0,i.H5)(l(),a,b);return m(),c}function s(a,b){let c=(0,i.OV)(l(),a,b);return m(),c}function t(a){(0,i.rt)(l(),a),m()}d()}catch(a){d(a)}})},61374:(a,b,c)=>{c.d(b,{gG:()=>d});function d(a){if(!a||"object"!=typeof a||Array.isArray(a))return;let b={},c=!1;for(let[d,e]of Object.entries(a)){if(!e||"object"!=typeof e||Array.isArray(e))continue;let a={};if("string"==typeof e.command&&e.command.trim()&&(a.command=e.command.trim()),Array.isArray(e.args)&&(a.args=e.args.filter(a=>"string"==typeof a)),e.env&&"object"==typeof e.env&&!Array.isArray(e.env)){let b={};for(let[a,c]of Object.entries(e.env))"string"==typeof c&&(b[a]=c);Object.keys(b).length>0&&(a.env=b)}"boolean"==typeof e.enabled&&(a.enabled=e.enabled),Object.keys(a).length>0&&(b[d]=a,c=!0)}return c?b:void 0}},85224:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Ar:()=>v,Bn:()=>E,Dg:()=>B,EG:()=>C,FZ:()=>A,GB:()=>H,NN:()=>F,VO:()=>D,X3:()=>r,Ye:()=>y,bC:()=>G,f:()=>t,iJ:()=>s,jW:()=>u,ku:()=>x,pG:()=>w,pX:()=>z});var e=c(95349),f=c(29021),g=c.n(f),h=c(33873),i=c.n(h),j=c(53134),k=c(16081),l=c(15872),m=c(1160),n=c(42650),o=c(27114),p=c(89337),q=a([j]);async function r(a,b){try{let c=b.trim();if(!c)return{success:!1,error:"File name is required"};let d=c.endsWith(".md")||c.endsWith(".csv")?c:`${c}.md`,e=a?`${a}/${d}`:d;return(0,j.x3)(e),(0,n.revalidatePath)("/","layout"),{success:!0,filePath:e}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to create file"}}}async function s(a){try{let b=i().posix.basename(a);if(!a.includes("/")&&o.A.has(b))return{success:!1,error:`"${b}" is protected and cannot be deleted`};let c=(0,k.F0)((0,j.JX)(),a);return(0,j.gm)(),(0,n.revalidatePath)("/","layout"),{success:!0,trashId:c.id}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to delete file"}}}async function t(a,b){try{let c=(0,j.H5)(a,b);return(0,n.revalidatePath)("/","layout"),{success:!0,newPath:c}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to rename file"}}}async function u(a){try{return(0,j.rt)(a),(0,n.revalidatePath)("/","layout"),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to convert to space"}}}async function v(a){try{let b=(0,k.F0)((0,j.JX)(),a);return(0,j.gm)(),(0,n.revalidatePath)("/","layout"),{success:!0,trashId:b.id}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to delete folder"}}}async function w(a,b){try{let c=(0,j.Jh)(a,b);return(0,n.revalidatePath)("/","layout"),{success:!0,newPath:c}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to rename space"}}}async function x(a){try{let b=(0,k.F0)((0,j.JX)(),a);return(0,j.gm)(),(0,n.revalidatePath)("/","layout"),{success:!0,trashId:b.id}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to delete space"}}}async function y(a){try{return(0,k.Lr)((0,j.JX)(),a,!1),(0,j.gm)(),(0,n.revalidatePath)("/","layout"),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Undo failed"}}}async function z(a,b,c=""){try{let{path:d}=(0,l._)((0,j.JX)(),a,b,c);return(0,j.gm)(),(0,n.revalidatePath)("/","layout"),{success:!0,path:d}}catch(b){let a=b instanceof Error?b.message:"Failed to create space";if(a.includes("already exists"))return{success:!1,error:"A space with this name already exists"};return{success:!1,error:a}}}async function A(a,b,c){try{let d=(0,j.JX)(),e=i().resolve(d,a);if(!e.startsWith(d))return{success:!1,error:"Invalid path"};let f=i().join(e,"README.md"),h=i().join(e,"INSTRUCTION.md"),k=(0,l.c)(a,b,c);g().writeFileSync(f,k,"utf-8");let o=(0,m.e1)(b);return g().writeFileSync(h,(0,m.GL)(o),"utf-8"),(0,j.gm)(),(0,n.revalidatePath)("/","layout"),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to revert"}}}async function B(){return{files:(0,j.f)().filter(a=>i().basename(a).startsWith("\uD83E\uDDEA_example_"))}}async function C(){try{let{files:a}=await B();if(0===a.length)return{success:!0,deleted:0};let b=(0,j.JX)();for(let c of a){let a=i().resolve(b,c);a.startsWith(b)&&g().existsSync(a)&&g().unlinkSync(a)}for(let c of[...new Set(a.map(a=>i().dirname(i().resolve(b,a))))].sort((a,b)=>b.length-a.length))try{if(c.startsWith(b)&&c!==b){let a=g().readdirSync(c);0===a.length&&g().rmdirSync(c)}}catch{}return(0,j.gm)(),(0,n.revalidatePath)("/","layout"),{success:!0,deleted:a.length}}catch(a){return{success:!1,deleted:0,error:a instanceof Error?a.message:"Failed to cleanup"}}}async function D(a){let b=(0,j.f)(),c=a.endsWith("/")?a:a+"/";return b.filter(a=>a.startsWith(c))}async function E(){return(0,k.JI)((0,j.JX)()),(0,k.hQ)((0,j.JX)())}async function F(a,b="restore"){try{let c,d=(0,j.JX)();return c="copy"===b?(0,k.kz)(d,a):(0,k.Lr)(d,a,"overwrite"===b),(0,j.gm)(),(0,n.revalidatePath)("/","layout"),{success:!0,restoredPath:c.restoredPath}}catch(a){if("RESTORE_CONFLICT"===a.code)return{success:!1,error:a.message,conflict:!0};return{success:!1,error:a.message??"Failed to restore"}}}async function G(a){try{return(0,k.vn)((0,j.JX)(),a),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to delete"}}}async function H(){try{let a=(0,k.YN)((0,j.JX)());return{success:!0,count:a}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to empty trash"}}}j=(q.then?(await q)():q)[0],(0,p.D)([r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H]),(0,e.A)(r,"603c49469eb0740a9920076daa879d0f7ab172b2a2",null),(0,e.A)(s,"4053ca35175914c5f1d2ffef7a6e7ad2064466db82",null),(0,e.A)(t,"602795d93a4b2b9c441528b89eb955c5380ab674c4",null),(0,e.A)(u,"4044d8a936a0e405b92c536edec0923fdaeca0c7d7",null),(0,e.A)(v,"402909e188515f875e85642c1be0a610fae6e1954c",null),(0,e.A)(w,"6031f72b04accf221d1b9a1bac1b1cf492e6e96f16",null),(0,e.A)(x,"4051c47e1e704574d45142df485b7e024c50db7624",null),(0,e.A)(y,"405f39a457927c579b69db7aa1f9466621e5a30f97",null),(0,e.A)(z,"700a18381ccae4cd6d27f4edf5a7e63c1c9c2f917a",null),(0,e.A)(A,"70dfff642bee2c35399989b22c8ad41ab96d7fc665",null),(0,e.A)(B,"00124fbbb2d54822bb55e40ccb308d9ffbd79c4545",null),(0,e.A)(C,"0016ccf9852ddf2df73119740f2a0f9d19d954ea76",null),(0,e.A)(D,"4089bc37efa49e0fd2ddcf39df67de8e099e1c214f",null),(0,e.A)(E,"00c3ada322f442c0323aad727e3b951d909e82ffdb",null),(0,e.A)(F,"605a421d86eb41a6e61ba0376bf0af4a506ba96f08",null),(0,e.A)(G,"409da9654f31d49ca1698290723beb577d4d7071e1",null),(0,e.A)(H,"00bc98fb0074c29ab21bb23527b08463902d5b7b81",null),d()}catch(a){d(a)}})},99863:(a,b,c)=>{c.d(b,{cP:()=>g,eX:()=>h});var d=c(33873),e=c.n(d),f=c(20018);function g(a,b){if(!a.startsWith(b+e().sep)&&a!==b)throw new f.Vt(f.tG.PATH_OUTSIDE_ROOT,"Access denied: path outside MIND_ROOT",{resolved:a,root:b})}function h(a,b){let c=e().resolve(a),d=e().resolve(e().join(c,b));return g(d,c),d}}};
|