@geminilight/mindos 0.6.58 → 0.6.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_standalone/.mindos-build-version +1 -1
- package/_standalone/.next/BUILD_ID +1 -1
- package/_standalone/.next/app-path-routes-manifest.json +23 -22
- package/_standalone/.next/build-manifest.json +3 -3
- package/_standalone/.next/cache/.previewinfo +1 -1
- package/_standalone/.next/cache/.rscinfo +1 -1
- package/_standalone/.next/cache/config.json +3 -3
- package/_standalone/.next/prerender-manifest.json +3 -3
- package/_standalone/.next/react-loadable-manifest.json +1 -1
- package/_standalone/.next/routes-manifest.json +6 -0
- package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error.html +2 -2
- package/_standalone/.next/server/app/_global-error.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/_standalone/.next/server/app/_not-found/page.js +1 -1
- package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/page.js +2 -2
- package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route.js +1 -0
- package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -0
- package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -0
- package/_standalone/.next/server/app/api/agents/custom/detect/route.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/route.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask/route.js +18 -7
- package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
- package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/changes/page.js +2 -2
- package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page.js +3 -3
- package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/page.js +1 -1
- package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/explore/page.js +2 -2
- package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/help/page.js +2 -2
- package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/login/page.js +2 -2
- package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/page.js +2 -8
- package/_standalone/.next/server/app/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/setup/page.js +2 -2
- package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/trash/page.js +3 -3
- package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
- package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/wiki/page.js +2 -2
- package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app-paths-manifest.json +23 -22
- package/_standalone/.next/server/chunks/1550.js +1 -1
- package/_standalone/.next/server/chunks/3484.js +1 -1
- package/_standalone/.next/server/chunks/530.js +70 -71
- package/_standalone/.next/server/chunks/{6793.js → 9753.js} +2 -2
- package/_standalone/.next/server/chunks/9787.js +2 -0
- package/_standalone/.next/server/middleware-build-manifest.js +1 -1
- package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/_standalone/.next/server/pages/500.html +2 -2
- package/_standalone/.next/server/server-reference-manifest.js +1 -1
- package/_standalone/.next/server/server-reference-manifest.json +1 -1
- package/_standalone/.next/static/K3wZNf5bj_AFYwtqcRXIf/_buildManifest.js +1 -0
- package/_standalone/.next/static/chunks/1369-7d0ac5d1564eed1e.js +1 -0
- package/_standalone/.next/static/chunks/{1814.a7c127b2c73d1f70.js → 1814.a79b84d37df75c43.js} +1 -1
- package/_standalone/.next/static/chunks/3427-2e61a5df1f5e55fb.js +1 -0
- package/_standalone/.next/static/chunks/{1053-fe009233cff06e72.js → 5581-974dfb26d1d1b38f.js} +3 -3
- package/_standalone/.next/static/chunks/6297-085daa21037d5f81.js +1 -0
- package/_standalone/.next/static/chunks/7249-b0a9c77b9a84b11c.js +11 -0
- package/_standalone/.next/static/chunks/7637-904b0a381dc3ec02.js +1 -0
- package/_standalone/.next/static/chunks/8520-76d1b05072178b43.js +22 -0
- package/_standalone/.next/static/chunks/9186-ead47513192f658b.js +1 -0
- package/_standalone/.next/static/chunks/9905-a19d379cb225246e.js +1 -0
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-2f4705aa66819b86.js → route-2ceea6eabf25b1f2.js} +1 -1
- package/_standalone/.next/static/chunks/app/_global-error/{page-2f4705aa66819b86.js → page-2ceea6eabf25b1f2.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-0ea3571c8fbae823.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/page-66858acbcd1d4bf8.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-2f4705aa66819b86.js → route-2ceea6eabf25b1f2.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-2f4705aa66819b86.js → route-2ceea6eabf25b1f2.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/raw/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/changes/page-dd0b00a7b81f74e2.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-bf5c290fa3ccff09.js +11 -0
- package/_standalone/.next/static/chunks/app/echo/page-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/explore/{page-d3d99308146c2240.js → page-d9f58000bc445360.js} +2 -2
- package/_standalone/.next/static/chunks/app/help/{page-222df603080b5fab.js → page-f8cb806371b3175f.js} +1 -1
- package/_standalone/.next/static/chunks/app/inbox/history/{page-07819cf95cb0805f.js → page-3279585360df132c.js} +1 -1
- package/_standalone/.next/static/chunks/app/layout-6a0169582db11a08.js +164 -0
- package/_standalone/.next/static/chunks/app/loading-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/login/{page-0eeef685052869a6.js → page-18fb00d568cd1f0e.js} +1 -1
- package/_standalone/.next/static/chunks/app/page-6a1f8d21c12b829e.js +1 -0
- package/_standalone/.next/static/chunks/app/setup/{page-99fcfc460fa29733.js → page-821714e7477be46c.js} +1 -1
- package/_standalone/.next/static/chunks/app/trash/page-ed7ba3b0b50223a6.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/{not-found-fc04c2bd4f35bc6f.js → not-found-6e0c75ad26ce8572.js} +1 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-678139779971cfcb.js +12 -0
- package/_standalone/.next/static/chunks/app/wiki/page-194ae9af2d461481.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2ceea6eabf25b1f2.js +1 -0
- package/_standalone/.next/static/chunks/{webpack-2c19436659aa657b.js → webpack-72e8d9e9073fd1f9.js} +1 -1
- package/_standalone/.next/static/css/9c558c42831fae58.css +1 -0
- package/_standalone/.next/trace +65 -64
- package/_standalone/.next/types/routes.d.ts +2 -1
- package/_standalone/.next/types/validator.ts +9 -0
- package/_standalone/__tests__/api/mcp-install.test.ts +4 -2
- package/_standalone/app/globals.css +2 -1
- package/_standalone/components/AskFab.tsx +11 -5
- package/_standalone/components/AskModal.tsx +1 -1
- package/_standalone/components/FileTree.tsx +83 -1
- package/_standalone/components/GuideCard.tsx +101 -152
- package/_standalone/components/Panel.tsx +6 -1
- package/_standalone/components/RightAskPanel.tsx +2 -2
- package/_standalone/components/agents/AgentsOverviewSection.tsx +13 -11
- package/_standalone/components/agents/CustomAgentModal.tsx +72 -18
- package/_standalone/components/ask/AskContent.tsx +109 -54
- package/_standalone/components/ask/AskHeader.tsx +218 -18
- package/_standalone/components/ask/FileChip.tsx +93 -12
- package/_standalone/components/ask/MessageList.tsx +66 -47
- package/_standalone/components/ask/SessionHistory.tsx +86 -60
- package/_standalone/components/ask/SessionTabBar.tsx +29 -21
- package/_standalone/components/ask/ThinkingBlock.tsx +6 -5
- package/_standalone/components/ask/ToolCallBlock.tsx +10 -9
- package/_standalone/components/changes/ChangesBanner.tsx +1 -1
- package/_standalone/components/settings/SettingsContent.tsx +1 -1
- package/_standalone/components/walkthrough/WalkthroughTooltip.tsx +3 -1
- package/_standalone/components/walkthrough/steps.ts +1 -1
- package/_standalone/data/skills/mindos/SKILL.md +67 -15
- package/_standalone/data/skills/mindos-zh/SKILL.md +67 -11
- package/_standalone/hooks/useAskChat.ts +10 -8
- package/_standalone/hooks/useAskSession.ts +23 -1
- package/_standalone/hooks/useFileUpload.ts +97 -43
- package/_standalone/hooks/useImageUpload.ts +1 -1
- package/_standalone/lib/inbox-upload.ts +86 -0
- package/_standalone/lib/stores/locale-store.ts +20 -6
- package/_standalone/package-lock.json +2 -2
- package/_standalone/package.json +1 -1
- package/_standalone/scripts/extract-pdf.cjs +110 -3
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/api/agents/copy-skill/route.ts +110 -0
- package/app/app/api/agents/custom/detect/route.ts +16 -1
- package/app/app/api/ask/route.ts +7 -1
- package/app/app/api/extract-pdf/route.ts +12 -5
- package/app/app/api/mcp/agents/route.ts +64 -2
- package/app/app/globals.css +2 -1
- package/app/app/layout.tsx +16 -4
- package/app/components/AskFab.tsx +11 -5
- package/app/components/AskModal.tsx +1 -1
- package/app/components/FileTree.tsx +83 -1
- package/app/components/GuideCard.tsx +101 -152
- package/app/components/HomeContent.tsx +123 -574
- package/app/components/Panel.tsx +6 -1
- package/app/components/RightAskPanel.tsx +2 -2
- package/app/components/WikiHomeContent.tsx +151 -3
- package/app/components/agents/AgentDetailContent.tsx +58 -1
- package/app/components/agents/AgentsOverviewSection.tsx +13 -11
- package/app/components/agents/CustomAgentModal.tsx +72 -18
- package/app/components/ask/AskContent.tsx +109 -54
- package/app/components/ask/AskHeader.tsx +218 -18
- package/app/components/ask/FileChip.tsx +93 -12
- package/app/components/ask/MessageList.tsx +66 -47
- package/app/components/ask/SessionHistory.tsx +86 -60
- package/app/components/ask/SessionTabBar.tsx +29 -21
- package/app/components/ask/ThinkingBlock.tsx +6 -5
- package/app/components/ask/ToolCallBlock.tsx +10 -9
- package/app/components/changes/ChangesBanner.tsx +1 -1
- package/app/components/changes/ChangesContentPage.tsx +368 -168
- package/app/components/settings/SettingsContent.tsx +1 -1
- package/app/components/walkthrough/WalkthroughTooltip.tsx +3 -1
- package/app/components/walkthrough/steps.ts +1 -1
- package/app/data/skills/mindos/SKILL.md +67 -15
- package/app/data/skills/mindos-zh/SKILL.md +67 -11
- package/app/hooks/useAskChat.ts +10 -8
- package/app/hooks/useAskSession.ts +23 -1
- package/app/hooks/useFileUpload.ts +97 -43
- package/app/hooks/useImageUpload.ts +1 -1
- package/app/lib/agent/prompt.ts +15 -4
- package/app/lib/custom-agents.ts +109 -1
- package/app/lib/file-ops.ts +58 -0
- package/app/lib/i18n/modules/ai-chat.ts +134 -10
- package/app/lib/i18n/modules/knowledge.ts +2 -0
- package/app/lib/i18n/modules/onboarding.ts +12 -12
- package/app/lib/inbox-upload.ts +86 -0
- package/app/lib/mcp-agents.ts +21 -1
- package/app/lib/stores/LocaleStoreInit.tsx +24 -1
- package/app/lib/stores/locale-store.ts +20 -6
- package/app/lib/types.ts +13 -0
- package/app/package.json +1 -1
- package/app/scripts/extract-pdf.cjs +110 -3
- package/package.json +1 -1
- package/skills/mindos/SKILL.md +67 -15
- package/skills/mindos/references/knowledge-health.md +120 -0
- package/skills/mindos-max/SKILL.md +52 -5
- package/skills/mindos-max-zh/SKILL.md +55 -6
- package/skills/mindos-zh/SKILL.md +67 -11
- package/_standalone/.next/server/chunks/2364.js +0 -2
- package/_standalone/.next/server/chunks/357.js +0 -1
- package/_standalone/.next/static/2ksXveDzEcnCMRIElDkLq/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/178-105779afb62d36d9.js +0 -1
- package/_standalone/.next/static/chunks/2218-d54538000574ffef.js +0 -1
- package/_standalone/.next/static/chunks/2549-e63cf57fa927a41d.js +0 -1
- package/_standalone/.next/static/chunks/4237-ffc6e7c15d4007b6.js +0 -1
- package/_standalone/.next/static/chunks/6878-e2c5459e1c608f89.js +0 -1
- package/_standalone/.next/static/chunks/7249-fa98ca10e9a10f39.js +0 -11
- package/_standalone/.next/static/chunks/9274-296ab35f9f09e42e.js +0 -1
- package/_standalone/.next/static/chunks/9286-5b09baa5200318c2.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-7bdeab5af8e4f5f2.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/page-5d1446665ddb3801.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/raw/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/changes/page-5a72144d1080a699.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-b0103509ce34444b.js +0 -11
- package/_standalone/.next/static/chunks/app/echo/page-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/layout-7e02ddf4144b01f1.js +0 -186
- package/_standalone/.next/static/chunks/app/loading-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/page-6a6a12bd6d6812d0.js +0 -7
- package/_standalone/.next/static/chunks/app/trash/page-54cbd5c98d9de69b.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-ca7bdcbf27f88a46.js +0 -12
- package/_standalone/.next/static/chunks/app/wiki/page-d492256a93f0b8bc.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2f4705aa66819b86.js +0 -1
- package/_standalone/.next/static/css/fd84c8316ead16eb.css +0 -1
- /package/_standalone/.next/static/{2ksXveDzEcnCMRIElDkLq → K3wZNf5bj_AFYwtqcRXIf}/_ssgManifest.js +0 -0
package/app/lib/custom-agents.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import fs from 'fs';
|
|
10
10
|
import path from 'path';
|
|
11
|
-
import { expandHome, MCP_AGENTS } from './mcp-agents';
|
|
11
|
+
import { expandHome, MCP_AGENTS, parseJsonc } from './mcp-agents';
|
|
12
12
|
import type { AgentDef } from './mcp-agents';
|
|
13
13
|
import { readSettings, writeSettings } from './settings';
|
|
14
14
|
|
|
@@ -39,6 +39,8 @@ export interface DetectResult {
|
|
|
39
39
|
detectedSkillDir?: string;
|
|
40
40
|
skillCount?: number;
|
|
41
41
|
skillNames?: string[];
|
|
42
|
+
mcpServers?: string[];
|
|
43
|
+
mcpParseError?: string;
|
|
42
44
|
suggestedName?: string;
|
|
43
45
|
}
|
|
44
46
|
|
|
@@ -282,6 +284,112 @@ export function scanCustomAgentSkills(custom: CustomAgentDef): { skills: string[
|
|
|
282
284
|
}
|
|
283
285
|
}
|
|
284
286
|
|
|
287
|
+
/* ─── Enhanced Skill & MCP Detection ─── */
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Parse JSON config to extract MCP server names from a config key.
|
|
291
|
+
*/
|
|
292
|
+
function parseJsonMcpServers(content: string, key: string): string[] {
|
|
293
|
+
try {
|
|
294
|
+
const config = parseJsonc(content);
|
|
295
|
+
const servers = config[key];
|
|
296
|
+
if (servers && typeof servers === 'object') {
|
|
297
|
+
return Object.keys(servers).sort();
|
|
298
|
+
}
|
|
299
|
+
} catch {
|
|
300
|
+
return [];
|
|
301
|
+
}
|
|
302
|
+
return [];
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Parse TOML config to extract MCP server names from a section key.
|
|
307
|
+
*/
|
|
308
|
+
function parseTomlMcpServers(content: string, sectionKey: string): string[] {
|
|
309
|
+
const names = new Set<string>();
|
|
310
|
+
const lines = content.split('\n');
|
|
311
|
+
const sectionPrefix = `${sectionKey}.`;
|
|
312
|
+
|
|
313
|
+
for (const line of lines) {
|
|
314
|
+
const trimmed = line.trim();
|
|
315
|
+
if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
|
|
316
|
+
const section = trimmed.slice(1, -1).trim();
|
|
317
|
+
if (section.startsWith(sectionPrefix)) {
|
|
318
|
+
const name = section.slice(sectionPrefix.length).split('.')[0];
|
|
319
|
+
if (name) names.add(name);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return [...names].sort();
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Detect config format from file extension.
|
|
329
|
+
*/
|
|
330
|
+
function detectConfigFormat(configPath: string): 'json' | 'toml' {
|
|
331
|
+
return configPath.toLowerCase().endsWith('.toml') ? 'toml' : 'json';
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Comprehensive profile detection for a custom agent.
|
|
336
|
+
* Returns MCP servers, skills, and any parse errors.
|
|
337
|
+
*/
|
|
338
|
+
export function detectCustomAgentProfile(
|
|
339
|
+
baseDir: string,
|
|
340
|
+
configPath: string,
|
|
341
|
+
configKey: string,
|
|
342
|
+
): {
|
|
343
|
+
mcpServers: string[];
|
|
344
|
+
skillNames: string[];
|
|
345
|
+
skillDir: string;
|
|
346
|
+
configFormat: 'json' | 'toml';
|
|
347
|
+
parseError?: string;
|
|
348
|
+
} {
|
|
349
|
+
const expanded = expandHome(baseDir);
|
|
350
|
+
const configAbsPath = expandHome(configPath);
|
|
351
|
+
|
|
352
|
+
const result = {
|
|
353
|
+
mcpServers: [] as string[],
|
|
354
|
+
skillNames: [] as string[],
|
|
355
|
+
skillDir: '',
|
|
356
|
+
configFormat: detectConfigFormat(configPath) as 'json' | 'toml',
|
|
357
|
+
parseError: undefined as string | undefined,
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
// 1. Read MCP servers from config
|
|
361
|
+
if (fs.existsSync(configAbsPath)) {
|
|
362
|
+
try {
|
|
363
|
+
const content = fs.readFileSync(configAbsPath, 'utf-8');
|
|
364
|
+
result.mcpServers =
|
|
365
|
+
result.configFormat === 'json'
|
|
366
|
+
? parseJsonMcpServers(content, configKey)
|
|
367
|
+
: parseTomlMcpServers(content, configKey);
|
|
368
|
+
} catch (err) {
|
|
369
|
+
result.parseError = `Failed to parse MCP config: ${err instanceof Error ? err.message : 'Unknown error'}`;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// 2. Scan Skill directory
|
|
374
|
+
const skillDirPath = path.join(expanded, 'skills');
|
|
375
|
+
if (fs.existsSync(skillDirPath)) {
|
|
376
|
+
result.skillDir = baseDir.endsWith('/') ? baseDir + 'skills/' : baseDir + '/skills/';
|
|
377
|
+
try {
|
|
378
|
+
const entries = fs.readdirSync(skillDirPath, { withFileTypes: true });
|
|
379
|
+
result.skillNames = entries
|
|
380
|
+
.filter(e => (e.isDirectory() || e.isSymbolicLink()) && !e.name.startsWith('.'))
|
|
381
|
+
.map(e => e.name)
|
|
382
|
+
.sort((a, b) => a.localeCompare(b));
|
|
383
|
+
} catch {
|
|
384
|
+
// Skill dir exists but not readable, continue
|
|
385
|
+
}
|
|
386
|
+
} else {
|
|
387
|
+
result.skillDir = baseDir.endsWith('/') ? baseDir + 'skills/' : baseDir + '/skills/';
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return result;
|
|
391
|
+
}
|
|
392
|
+
|
|
285
393
|
/* ─── Validation ─── */
|
|
286
394
|
|
|
287
395
|
export function validateCustomAgentInput(input: {
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File operations utilities.
|
|
3
|
+
* Used for recursive directory copying and other file system tasks.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import fs from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Recursively copy a directory and all its contents.
|
|
11
|
+
*
|
|
12
|
+
* @param src Source directory path
|
|
13
|
+
* @param dst Destination directory path
|
|
14
|
+
* @throws Error if source doesn't exist or copy fails
|
|
15
|
+
*/
|
|
16
|
+
export async function copyDir(src: string, dst: string): Promise<void> {
|
|
17
|
+
// Create destination directory
|
|
18
|
+
await fs.promises.mkdir(dst, { recursive: true });
|
|
19
|
+
|
|
20
|
+
// Read source directory
|
|
21
|
+
const entries = await fs.promises.readdir(src, { withFileTypes: true });
|
|
22
|
+
|
|
23
|
+
for (const entry of entries) {
|
|
24
|
+
const srcPath = path.join(src, entry.name);
|
|
25
|
+
const dstPath = path.join(dst, entry.name);
|
|
26
|
+
|
|
27
|
+
if (entry.isDirectory()) {
|
|
28
|
+
// Recursively copy subdirectory
|
|
29
|
+
await copyDir(srcPath, dstPath);
|
|
30
|
+
} else if (entry.isFile()) {
|
|
31
|
+
// Copy file
|
|
32
|
+
await fs.promises.copyFile(srcPath, dstPath);
|
|
33
|
+
} else if (entry.isSymbolicLink()) {
|
|
34
|
+
// Copy symbolic link target
|
|
35
|
+
const linkTarget = await fs.promises.readlink(srcPath);
|
|
36
|
+
await fs.promises.symlink(linkTarget, dstPath);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Check if a directory exists.
|
|
43
|
+
*/
|
|
44
|
+
export function dirExists(dir: string): boolean {
|
|
45
|
+
try {
|
|
46
|
+
const stat = fs.statSync(dir);
|
|
47
|
+
return stat.isDirectory();
|
|
48
|
+
} catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Create a directory recursively.
|
|
55
|
+
*/
|
|
56
|
+
export async function ensureDir(dir: string): Promise<void> {
|
|
57
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
58
|
+
}
|
|
@@ -6,7 +6,12 @@ export const aiChatEn = {
|
|
|
6
6
|
fabLabel: 'Ask AI',
|
|
7
7
|
placeholder: 'Ask a question... @ files, / skills',
|
|
8
8
|
emptyPrompt: 'How can I help?',
|
|
9
|
-
emptyHint: 'Type @ to reference files · / to use skills',
|
|
9
|
+
emptyHint: 'Type @ to reference files · / to use skills · drag images',
|
|
10
|
+
executingTool: 'Executing tool…',
|
|
11
|
+
toolRunning: 'Running...',
|
|
12
|
+
copyMessage: 'Copy',
|
|
13
|
+
toolInput: 'Input',
|
|
14
|
+
toolOutput: 'Output',
|
|
10
15
|
send: 'send',
|
|
11
16
|
newlineHint: 'new line',
|
|
12
17
|
panelComposerResize: 'Drag up to enlarge the input area',
|
|
@@ -36,10 +41,49 @@ export const aiChatEn = {
|
|
|
36
41
|
proxyCompatAlsoFailed: (err: string) => `Compatibility mode also failed: ${err}. Please check your Base URL, API key, and model name.`,
|
|
37
42
|
retry: 'Retry',
|
|
38
43
|
suggestions: [
|
|
39
|
-
'
|
|
40
|
-
'
|
|
41
|
-
'
|
|
42
|
-
'
|
|
44
|
+
{ label: 'Organize inbox', prompt: 'Organize my inbox files into the right spaces' },
|
|
45
|
+
{ label: 'Research a topic', prompt: 'Research the latest trends in AI agents' },
|
|
46
|
+
{ label: 'Draft weekly review', prompt: 'Draft a weekly review based on my recent notes' },
|
|
47
|
+
{ label: 'Brainstorm ideas', prompt: 'Brainstorm 3 creative ideas for my next project' },
|
|
48
|
+
],
|
|
49
|
+
/** Categorized prompts for homepage explore section */
|
|
50
|
+
homeCategories: [
|
|
51
|
+
{
|
|
52
|
+
label: 'Knowledge',
|
|
53
|
+
items: [
|
|
54
|
+
{ label: 'Organize into Spaces', desc: 'Sort scattered notes by topic', prompt: 'Help me organize my recent unstructured notes into appropriate spaces with proper tags' },
|
|
55
|
+
{ label: 'Sync & Deduplicate', desc: 'Clean up cross-platform overlap', prompt: 'Find duplicate or overlapping content across my spaces and help me consolidate them' },
|
|
56
|
+
{ label: 'Auto-tag & Categorize', desc: 'Add structure to raw notes', prompt: 'Review my untagged notes and suggest categories and tags for each' },
|
|
57
|
+
{ label: 'Weekly Digest', desc: 'Summarize this week\'s changes', prompt: 'Summarize everything I added or changed this week across all spaces' },
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
label: 'Writing',
|
|
62
|
+
items: [
|
|
63
|
+
{ label: 'Blog from Notes', desc: 'Turn drafts into polished posts', prompt: 'Turn my draft notes into a polished blog post with clear structure' },
|
|
64
|
+
{ label: 'Product Copy', desc: 'Landing page & descriptions', prompt: 'Write compelling product description and landing page copy based on my notes' },
|
|
65
|
+
{ label: 'Polish & Refine', desc: 'Improve clarity and tone', prompt: 'Review this document for clarity, tone, and structure, then rewrite the weak parts' },
|
|
66
|
+
{ label: 'Slide Deck Outline', desc: 'Presentation structure from notes', prompt: 'Create a slide deck outline from my notes on this topic' },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
label: 'Analysis',
|
|
71
|
+
items: [
|
|
72
|
+
{ label: 'Competitive Overview', desc: 'Compare products & differentiators', prompt: 'Compare the products in my research notes and identify key differentiators' },
|
|
73
|
+
{ label: 'Extract Insights', desc: 'Patterns across reading notes', prompt: 'What are the most important insights and patterns across my reading notes?' },
|
|
74
|
+
{ label: 'Decision Framework', desc: 'Pros, cons, recommendation', prompt: 'Help me structure this decision with pros, cons, risks, and a recommendation' },
|
|
75
|
+
{ label: 'GTM Strategy', desc: 'Go-to-market from research', prompt: 'Help me build a go-to-market plan based on my product and market research notes' },
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
label: 'Innovation',
|
|
80
|
+
items: [
|
|
81
|
+
{ label: 'Challenge My Assumptions', desc: 'Find blind spots in my thinking', prompt: 'Review my notes and challenge the key assumptions I\'m making. What am I missing?' },
|
|
82
|
+
{ label: 'What If Scenarios', desc: 'Explore alternative futures', prompt: 'Based on my research, generate 3 contrarian "what if" scenarios I haven\'t considered' },
|
|
83
|
+
{ label: 'Combine & Remix Ideas', desc: 'Cross-pollinate across domains', prompt: 'Find unexpected connections between ideas in different spaces and suggest novel combinations' },
|
|
84
|
+
{ label: 'Spot the Opportunity', desc: 'Gaps others are missing', prompt: 'Analyze my market research notes and identify underserved niches or emerging opportunities' },
|
|
85
|
+
],
|
|
86
|
+
},
|
|
43
87
|
],
|
|
44
88
|
modeChat: 'Chat',
|
|
45
89
|
modeAgent: 'Agent',
|
|
@@ -81,6 +125,7 @@ export const aiChatEn = {
|
|
|
81
125
|
},
|
|
82
126
|
loading: 'Loading changes...',
|
|
83
127
|
empty: 'No content changes yet.',
|
|
128
|
+
emptyHint: 'Changes made to your files will appear here when you or an agent edits content.',
|
|
84
129
|
open: 'Open',
|
|
85
130
|
unchangedLines: (n: number) => `... ${n} unchanged lines ...`,
|
|
86
131
|
operations: {
|
|
@@ -100,6 +145,24 @@ export const aiChatEn = {
|
|
|
100
145
|
import_file: 'Import file',
|
|
101
146
|
legacy_agent_diff_import: 'Import from Agent Diff',
|
|
102
147
|
},
|
|
148
|
+
/** Frontend-side summary translations for known backend summary patterns */
|
|
149
|
+
summaries: {
|
|
150
|
+
updatedFileContent: 'Updated file content',
|
|
151
|
+
appendedContent: 'Appended content to file',
|
|
152
|
+
insertedLines: (n: number) => `Inserted ${n} line(s)`,
|
|
153
|
+
updatedLines: (start: number, end: number) => `Updated lines ${start}-${end}`,
|
|
154
|
+
insertedAfterHeading: (h: string) => `Inserted content after heading "${h}"`,
|
|
155
|
+
updatedSection: (h: string) => `Updated section "${h}"`,
|
|
156
|
+
movedToTrash: 'Moved to trash',
|
|
157
|
+
renamedFile: (name: string) => `Renamed file to ${name}`,
|
|
158
|
+
createdFile: 'Created file',
|
|
159
|
+
movedFile: (p: string) => `Moved file to ${p}`,
|
|
160
|
+
createdSpace: 'Created space',
|
|
161
|
+
renamedSpace: (name: string) => `Renamed space to ${name}`,
|
|
162
|
+
appendedCsvRow: (n: number) => `Appended CSV row (${n} cell${n === 1 ? '' : 's'})`,
|
|
163
|
+
importedFile: 'Imported file into knowledge base',
|
|
164
|
+
importedLegacyDiff: 'Imported legacy agent diff',
|
|
165
|
+
},
|
|
103
166
|
relativeTime: {
|
|
104
167
|
justNow: 'just now',
|
|
105
168
|
minutesAgo: (n: number) => `${n}m ago`,
|
|
@@ -145,7 +208,12 @@ export const aiChatZh = {
|
|
|
145
208
|
fabLabel: 'AI 助手',
|
|
146
209
|
placeholder: '输入问题… @ 附加文件,/ 技能',
|
|
147
210
|
emptyPrompt: '有什么可以帮你?',
|
|
148
|
-
emptyHint: '输入 @ 引用文件 · / 使用技能',
|
|
211
|
+
emptyHint: '输入 @ 引用文件 · / 使用技能 · 拖拽图片',
|
|
212
|
+
executingTool: '正在执行工具…',
|
|
213
|
+
toolRunning: '运行中...',
|
|
214
|
+
copyMessage: '复制',
|
|
215
|
+
toolInput: '输入',
|
|
216
|
+
toolOutput: '输出',
|
|
149
217
|
send: '发送',
|
|
150
218
|
newlineHint: '换行',
|
|
151
219
|
panelComposerResize: '向上拖拽以拉高输入区',
|
|
@@ -175,10 +243,48 @@ export const aiChatZh = {
|
|
|
175
243
|
proxyCompatAlsoFailed: (err: string) => `兼容模式也失败了:${err}。请检查 Base URL、API Key 和模型名称。`,
|
|
176
244
|
retry: '重试',
|
|
177
245
|
suggestions: [
|
|
178
|
-
'
|
|
179
|
-
'
|
|
180
|
-
'
|
|
181
|
-
'
|
|
246
|
+
{ label: '整理收件箱', prompt: '把收件箱的文件整理到对应空间' },
|
|
247
|
+
{ label: '调研一个话题', prompt: '调研一下 AI Agent 的最新趋势' },
|
|
248
|
+
{ label: '起草周报', prompt: '根据最近的笔记起草一份周报' },
|
|
249
|
+
{ label: '想新 idea', prompt: '为我的下一个项目想 3 个新 idea' },
|
|
250
|
+
],
|
|
251
|
+
homeCategories: [
|
|
252
|
+
{
|
|
253
|
+
label: '知识管理',
|
|
254
|
+
items: [
|
|
255
|
+
{ label: '整理到 Space', desc: '按主题归类零散笔记', prompt: '帮我把最近的零散笔记整理到合适的 Space,并打好标签' },
|
|
256
|
+
{ label: '同步去重', desc: '清理跨平台重复内容', prompt: '找出我各个 Space 中重复或重叠的内容,帮我合并整理' },
|
|
257
|
+
{ label: '自动打标签', desc: '给未分类笔记加结构', prompt: '检查我未标记的笔记,建议合适的分类和标签' },
|
|
258
|
+
{ label: '每周摘要', desc: '汇总本周变更', prompt: '总结我这周在所有 Space 中新增和修改的内容' },
|
|
259
|
+
],
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
label: '内容创作',
|
|
263
|
+
items: [
|
|
264
|
+
{ label: '笔记变博客', desc: '草稿变成精修文章', prompt: '把我的草稿笔记改写成一篇结构清晰的博客文章' },
|
|
265
|
+
{ label: '产品文案', desc: '落地页与产品描述', prompt: '根据我的笔记写一段有吸引力的产品描述和落地页文案' },
|
|
266
|
+
{ label: '润色优化', desc: '提升清晰度和语气', prompt: '审阅这篇文档的清晰度、语气和结构,重写不好的部分' },
|
|
267
|
+
{ label: '演示大纲', desc: '从笔记生成演讲结构', prompt: '根据我关于这个主题的笔记,创建一个演示文稿大纲' },
|
|
268
|
+
],
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
label: '分析洞察',
|
|
272
|
+
items: [
|
|
273
|
+
{ label: '竞品对比', desc: '比较产品差异化', prompt: '对比我调研笔记中的产品,找出关键差异点' },
|
|
274
|
+
{ label: '提炼洞察', desc: '发现阅读笔记中的规律', prompt: '我的阅读笔记中有哪些最重要的见解和规律?' },
|
|
275
|
+
{ label: '决策框架', desc: '利弊分析与建议', prompt: '帮我用利弊、风险和建议来结构化这个决策' },
|
|
276
|
+
{ label: 'GTM 策略', desc: '从调研到上市方案', prompt: '根据我的产品和市场调研笔记,帮我制定一份上市计划' },
|
|
277
|
+
],
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
label: '启发创新',
|
|
281
|
+
items: [
|
|
282
|
+
{ label: '挑战假设', desc: '找出思维盲点', prompt: '审视我的笔记,挑战我正在做的关键假设。我遗漏了什么?' },
|
|
283
|
+
{ label: '反常识探索', desc: '探索替代可能性', prompt: '根据我的调研,生成 3 个我没考虑过的反常识场景' },
|
|
284
|
+
{ label: '跨域融合', desc: '不同领域的创意碰撞', prompt: '在我不同 Space 的想法中找到意想不到的联系,并建议新颖的组合' },
|
|
285
|
+
{ label: '发现机会', desc: '别人没看到的空白', prompt: '分析我的市场调研笔记,找出未被充分服务的小众市场或新兴机会' },
|
|
286
|
+
],
|
|
287
|
+
},
|
|
182
288
|
],
|
|
183
289
|
modeChat: '对话',
|
|
184
290
|
modeAgent: 'Agent',
|
|
@@ -220,6 +326,7 @@ export const aiChatZh = {
|
|
|
220
326
|
},
|
|
221
327
|
loading: '正在加载变更...',
|
|
222
328
|
empty: '暂无内容变更。',
|
|
329
|
+
emptyHint: '你或 Agent 编辑文件时,变更会显示在这里。',
|
|
223
330
|
open: '打开',
|
|
224
331
|
unchangedLines: (n: number) => `... ${n} 行未变更 ...`,
|
|
225
332
|
operations: {
|
|
@@ -239,6 +346,23 @@ export const aiChatZh = {
|
|
|
239
346
|
import_file: '导入文件',
|
|
240
347
|
legacy_agent_diff_import: '从 Agent Diff 导入',
|
|
241
348
|
},
|
|
349
|
+
summaries: {
|
|
350
|
+
updatedFileContent: '更新了文件内容',
|
|
351
|
+
appendedContent: '追加了文件内容',
|
|
352
|
+
insertedLines: (n: number) => `插入了 ${n} 行`,
|
|
353
|
+
updatedLines: (start: number, end: number) => `更新了第 ${start}-${end} 行`,
|
|
354
|
+
insertedAfterHeading: (h: string) => `在标题「${h}」后插入了内容`,
|
|
355
|
+
updatedSection: (h: string) => `更新了章节「${h}」`,
|
|
356
|
+
movedToTrash: '移到了回收站',
|
|
357
|
+
renamedFile: (name: string) => `重命名为 ${name}`,
|
|
358
|
+
createdFile: '创建了文件',
|
|
359
|
+
movedFile: (p: string) => `移动到了 ${p}`,
|
|
360
|
+
createdSpace: '创建了空间',
|
|
361
|
+
renamedSpace: (name: string) => `重命名空间为 ${name}`,
|
|
362
|
+
appendedCsvRow: (n: number) => `追加了 CSV 行(${n} 个单元格)`,
|
|
363
|
+
importedFile: '导入了文件到知识库',
|
|
364
|
+
importedLegacyDiff: '从 Agent Diff 导入了变更',
|
|
365
|
+
},
|
|
242
366
|
relativeTime: {
|
|
243
367
|
justNow: '刚刚',
|
|
244
368
|
minutesAgo: (n: number) => `${n} 分钟前`,
|
|
@@ -103,6 +103,7 @@ export const knowledgeEn = {
|
|
|
103
103
|
viewAllHistory: (n: number) => `View all ${n} records →`,
|
|
104
104
|
agingHint: '7+ days',
|
|
105
105
|
savedToast: (n: number) => `${n} file${n === 1 ? '' : 's'} saved to Capture`,
|
|
106
|
+
savedToDir: (n: number, dir: string) => `${n} file${n === 1 ? '' : 's'} saved to ${dir}`,
|
|
106
107
|
savedWithSkipped: (saved: number, skipped: number) =>
|
|
107
108
|
saved > 0
|
|
108
109
|
? `${saved} saved, ${skipped} skipped (unsupported format)`
|
|
@@ -481,6 +482,7 @@ export const knowledgeZh = {
|
|
|
481
482
|
viewAllHistory: (n: number) => `查看全部 ${n} 条记录 →`,
|
|
482
483
|
agingHint: '7天+',
|
|
483
484
|
savedToast: (n: number) => `${n} 个文件已保存到暂存台`,
|
|
485
|
+
savedToDir: (n: number, dir: string) => `${n} 个文件已保存到 ${dir}`,
|
|
484
486
|
savedWithSkipped: (saved: number, skipped: number) =>
|
|
485
487
|
saved > 0
|
|
486
488
|
? `已保存 ${saved} 个,跳过 ${skipped} 个(格式不支持)`
|
|
@@ -174,17 +174,17 @@ export const onboardingEn = {
|
|
|
174
174
|
button: 'Import Files',
|
|
175
175
|
},
|
|
176
176
|
ai: {
|
|
177
|
-
title: '
|
|
177
|
+
title: 'Save with AI',
|
|
178
178
|
cta: 'Try it',
|
|
179
|
-
desc: '
|
|
180
|
-
prompt: '
|
|
179
|
+
desc: 'Ask MindOS Agent to capture knowledge from this conversation into your KB:',
|
|
180
|
+
prompt: 'Help me distill the key takeaways from our conversation into a reusable SOP in my knowledge base.',
|
|
181
181
|
promptEmpty: 'Help me design a knowledge base folder structure that fits my needs',
|
|
182
182
|
},
|
|
183
183
|
agent: {
|
|
184
|
-
title: '
|
|
184
|
+
title: 'Connect other Agents',
|
|
185
185
|
cta: 'Copy prompt',
|
|
186
|
-
desc: 'Open Cursor, Claude Code, or any
|
|
187
|
-
copyPrompt: '
|
|
186
|
+
desc: 'Open Cursor, Claude Code, or any Agent with MindOS CLI and paste:',
|
|
187
|
+
copyPrompt: 'Summarize what we discussed and save it to my MindOS knowledge base as a reusable SOP.',
|
|
188
188
|
copy: 'Copy',
|
|
189
189
|
copied: 'Copied!',
|
|
190
190
|
},
|
|
@@ -396,17 +396,17 @@ export const onboardingZh = {
|
|
|
396
396
|
button: '导入文件',
|
|
397
397
|
},
|
|
398
398
|
ai: {
|
|
399
|
-
title: '
|
|
399
|
+
title: 'AI 帮你沉淀',
|
|
400
400
|
cta: '试试',
|
|
401
|
-
desc: '
|
|
402
|
-
prompt: '
|
|
401
|
+
desc: '让 MindOS Agent 把对话中的经验沉淀到知识库:',
|
|
402
|
+
prompt: '帮我把这次对话的关键收获整理成一份可复用的 SOP,存到我的知识库里。',
|
|
403
403
|
promptEmpty: '帮我设计一个适合我的知识库目录结构',
|
|
404
404
|
},
|
|
405
405
|
agent: {
|
|
406
|
-
title: '
|
|
406
|
+
title: '连接其他 Agent',
|
|
407
407
|
cta: '复制提示词',
|
|
408
|
-
desc: '打开 Cursor、Claude Code
|
|
409
|
-
copyPrompt: '
|
|
408
|
+
desc: '打开 Cursor、Claude Code 或任意 MCP Agent,粘贴以下提示词,让知识流入 MindOS:',
|
|
409
|
+
copyPrompt: '把我们刚才讨论的内容总结一下,存到我的 MindOS 知识库里,形成可复用的 SOP。',
|
|
410
410
|
copy: '复制',
|
|
411
411
|
copied: '已复制!',
|
|
412
412
|
},
|
package/app/lib/inbox-upload.ts
CHANGED
|
@@ -91,3 +91,89 @@ export async function quickDropToInbox(
|
|
|
91
91
|
toast.error(t.inbox.saveFailed, 4000);
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Drop files into a specific directory via /api/file/import.
|
|
97
|
+
* Used when user drags external files onto a directory in the file tree.
|
|
98
|
+
*/
|
|
99
|
+
export async function quickDropToDirectory(
|
|
100
|
+
files: File[],
|
|
101
|
+
targetDir: string,
|
|
102
|
+
t: ReturnType<typeof useLocale>['t'],
|
|
103
|
+
) {
|
|
104
|
+
const payload: Array<{ name: string; content: string; encoding?: string }> = [];
|
|
105
|
+
let oversizedCount = 0;
|
|
106
|
+
|
|
107
|
+
const BINARY_EXTS = new Set([
|
|
108
|
+
'pdf', 'png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp', 'ico',
|
|
109
|
+
'mp3', 'wav', 'm4a', 'ogg', 'flac', 'aac', 'mp4', 'webm', 'mov', 'mkv',
|
|
110
|
+
]);
|
|
111
|
+
|
|
112
|
+
for (const file of files) {
|
|
113
|
+
if (file.size > MAX_FILE_SIZE) {
|
|
114
|
+
oversizedCount++;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const ext = (file.name.split('.').pop() ?? '').toLowerCase();
|
|
119
|
+
if (BINARY_EXTS.has(ext)) {
|
|
120
|
+
const buf = await file.arrayBuffer();
|
|
121
|
+
payload.push({ name: file.name, content: arrayBufferToBase64(buf), encoding: 'base64' });
|
|
122
|
+
} else {
|
|
123
|
+
const text = await file.text();
|
|
124
|
+
payload.push({ name: file.name, content: text });
|
|
125
|
+
}
|
|
126
|
+
} catch {
|
|
127
|
+
/* skip unreadable files */
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (payload.length === 0) {
|
|
132
|
+
if (oversizedCount > 0) {
|
|
133
|
+
toast.error(t.inbox.tooLarge(oversizedCount), 4000);
|
|
134
|
+
} else if (files.length > 0) {
|
|
135
|
+
toast.error(t.inbox.saveFailed, 4000);
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const dirName = targetDir.split('/').pop() || targetDir;
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
const res = await fetch('/api/file/import', {
|
|
144
|
+
method: 'POST',
|
|
145
|
+
headers: { 'Content-Type': 'application/json' },
|
|
146
|
+
body: JSON.stringify({
|
|
147
|
+
files: payload,
|
|
148
|
+
targetSpace: targetDir,
|
|
149
|
+
organize: false,
|
|
150
|
+
conflict: 'rename',
|
|
151
|
+
}),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
if (!res.ok) {
|
|
155
|
+
const data = await res.json().catch(() => ({}));
|
|
156
|
+
console.error('[TreeDrop] Save failed:', data.error);
|
|
157
|
+
toast.error(t.inbox.saveFailed, 4000);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const result = await res.json();
|
|
162
|
+
const saved = result.created?.length ?? 0;
|
|
163
|
+
const skipped = result.skipped?.length ?? 0;
|
|
164
|
+
|
|
165
|
+
if (saved > 0 && (skipped + oversizedCount) > 0) {
|
|
166
|
+
toast.success(t.inbox.savedWithSkipped(saved, skipped + oversizedCount), 4000);
|
|
167
|
+
} else if (saved > 0) {
|
|
168
|
+
toast.success(t.inbox.savedToDir(saved, dirName), 3000);
|
|
169
|
+
} else {
|
|
170
|
+
if (oversizedCount > 0) toast.error(t.inbox.tooLarge(oversizedCount), 4000);
|
|
171
|
+
if (skipped > 0) toast.error(t.inbox.savedWithSkipped(0, skipped), 4000);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
window.dispatchEvent(new Event('mindos:files-changed'));
|
|
175
|
+
} catch (err) {
|
|
176
|
+
console.error('[TreeDrop] Network error:', err);
|
|
177
|
+
toast.error(t.inbox.saveFailed, 4000);
|
|
178
|
+
}
|
|
179
|
+
}
|
package/app/lib/mcp-agents.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { execSync } from 'child_process';
|
|
|
5
5
|
|
|
6
6
|
/** Parse JSONC — strips single-line (//) and block comments before JSON.parse */
|
|
7
7
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
-
function parseJsonc(text: string): any {
|
|
8
|
+
export function parseJsonc(text: string): any {
|
|
9
9
|
let stripped = text.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*$)/gm, (m, g) => g ? '' : m);
|
|
10
10
|
stripped = stripped.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
11
11
|
if (!stripped.trim()) return {};
|
|
@@ -244,6 +244,24 @@ export const MCP_AGENTS: Record<string, AgentDef> = {
|
|
|
244
244
|
presenceCli: 'agy',
|
|
245
245
|
presenceDirs: ['~/.gemini/antigravity/'],
|
|
246
246
|
},
|
|
247
|
+
'qclaw': {
|
|
248
|
+
name: 'QClaw',
|
|
249
|
+
project: null,
|
|
250
|
+
global: '~/.qclaw/mcp.json',
|
|
251
|
+
key: 'mcpServers',
|
|
252
|
+
preferredTransport: 'stdio',
|
|
253
|
+
presenceCli: 'qclaw',
|
|
254
|
+
presenceDirs: ['~/.qclaw/'],
|
|
255
|
+
},
|
|
256
|
+
'workbuddy': {
|
|
257
|
+
name: 'WorkBuddy',
|
|
258
|
+
project: null,
|
|
259
|
+
global: '~/.workbuddy/mcp.json',
|
|
260
|
+
key: 'mcpServers',
|
|
261
|
+
preferredTransport: 'stdio',
|
|
262
|
+
presenceCli: 'workbuddy',
|
|
263
|
+
presenceDirs: ['~/.workbuddy/'],
|
|
264
|
+
},
|
|
247
265
|
};
|
|
248
266
|
|
|
249
267
|
/**
|
|
@@ -271,6 +289,8 @@ export const SKILL_AGENT_REGISTRY: Record<string, SkillAgentRegistration> = {
|
|
|
271
289
|
'github-copilot': { mode: 'universal' },
|
|
272
290
|
'codex': { mode: 'universal' },
|
|
273
291
|
'antigravity': { mode: 'additional', skillAgentName: 'antigravity' },
|
|
292
|
+
'qclaw': { mode: 'unsupported' },
|
|
293
|
+
'workbuddy': { mode: 'unsupported' },
|
|
274
294
|
};
|
|
275
295
|
|
|
276
296
|
export interface SkillWorkspaceProfile {
|
|
@@ -1,14 +1,37 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useEffect } from 'react';
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
4
|
import { useLocaleStore } from '@/lib/stores/locale-store';
|
|
5
5
|
import type { Locale } from '@/lib/i18n';
|
|
6
|
+
import { messages } from '@/lib/i18n';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Initializes locale store with SSR value and attaches event listeners.
|
|
9
10
|
* Renders nothing. Place once near the root.
|
|
11
|
+
*
|
|
12
|
+
* During the first client render, synchronously updates the Zustand store
|
|
13
|
+
* to match ssrLocale (from server cookie). This ensures the first client
|
|
14
|
+
* render produces identical HTML to the server, preventing hydration mismatch.
|
|
15
|
+
* After hydration, _init() reconciles with localStorage/navigator for
|
|
16
|
+
* the true client preference.
|
|
10
17
|
*/
|
|
11
18
|
export default function LocaleStoreInit({ ssrLocale }: { ssrLocale: Locale }) {
|
|
19
|
+
const didSync = useRef(false);
|
|
20
|
+
|
|
21
|
+
// Synchronous store update during first render — before React commits.
|
|
22
|
+
// The store defaults to 'en'; if ssrLocale is 'zh' (from cookie), update
|
|
23
|
+
// immediately so all sibling/child components read 'zh' in the same pass.
|
|
24
|
+
if (!didSync.current) {
|
|
25
|
+
didSync.current = true;
|
|
26
|
+
const state = useLocaleStore.getState();
|
|
27
|
+
if (state.locale !== ssrLocale) {
|
|
28
|
+
useLocaleStore.setState({
|
|
29
|
+
locale: ssrLocale,
|
|
30
|
+
t: messages[ssrLocale] as unknown as typeof state.t,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
12
35
|
useEffect(() => {
|
|
13
36
|
const cleanup = useLocaleStore.getState()._init(ssrLocale);
|
|
14
37
|
return cleanup;
|
|
@@ -22,23 +22,37 @@ function getLocaleSnapshot(): Locale {
|
|
|
22
22
|
return navigator.language.startsWith('zh') ? 'zh' : 'en';
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Read the locale that the inline <script> in layout.tsx already resolved.
|
|
27
|
+
* Returns 'en' to match SSR default — the LocaleStoreInit component
|
|
28
|
+
* reconciles to the real locale synchronously before first commit.
|
|
29
|
+
*/
|
|
30
|
+
function getPreHydrateLocale(): Locale {
|
|
31
|
+
return 'en';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const initialLocale = getPreHydrateLocale();
|
|
35
|
+
|
|
25
36
|
export const useLocaleStore = create<LocaleStoreState>((set) => ({
|
|
26
|
-
locale:
|
|
27
|
-
t: messages[
|
|
37
|
+
locale: initialLocale,
|
|
38
|
+
t: messages[initialLocale] as unknown as Messages,
|
|
28
39
|
|
|
29
40
|
setLocale: (l: Locale) => {
|
|
30
41
|
document.cookie = `locale=${l};path=/;max-age=31536000;SameSite=Lax`;
|
|
31
42
|
document.documentElement.lang = l === 'zh' ? 'zh' : 'en';
|
|
43
|
+
(window as any).__mindos_locale__ = l;
|
|
32
44
|
set({ locale: l, t: messages[l] as unknown as Messages });
|
|
33
45
|
window.dispatchEvent(new Event('mindos-locale-change'));
|
|
34
46
|
},
|
|
35
47
|
|
|
36
48
|
_init: (ssrLocale: Locale) => {
|
|
37
|
-
//
|
|
38
|
-
const clientLocale =
|
|
39
|
-
|
|
49
|
+
// Reconcile: if client localStorage disagrees with current store, update once
|
|
50
|
+
const clientLocale = getLocaleSnapshot();
|
|
51
|
+
const current = useLocaleStore.getState().locale;
|
|
52
|
+
if (clientLocale !== current) {
|
|
53
|
+
set({ locale: clientLocale, t: messages[clientLocale] as unknown as Messages });
|
|
54
|
+
}
|
|
40
55
|
|
|
41
|
-
// Listen for external changes (e.g. localStorage change in another tab, or pre-hydration script)
|
|
42
56
|
const handler = () => {
|
|
43
57
|
const l = getLocaleSnapshot();
|
|
44
58
|
set({ locale: l, t: messages[l] as unknown as Messages });
|