@geminilight/mindos 0.6.67 → 0.6.70
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 +26 -25
- package/_standalone/.next/build-manifest.json +3 -3
- package/_standalone/.next/cache/.previewinfo +1 -1
- package/_standalone/.next/cache/.rscinfo +1 -1
- package/_standalone/.next/cache/config.json +3 -3
- package/_standalone/.next/prerender-manifest.json +3 -3
- package/_standalone/.next/react-loadable-manifest.json +7 -7
- 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 +1 -1
- 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.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.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.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +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.nft.json +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask/route.js +17 -17
- package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/channels/verify/route.js +1 -0
- package/_standalone/.next/server/app/api/channels/verify/route.js.nft.json +1 -0
- package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -0
- package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.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.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.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +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.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/direct-tools/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/tools/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/route_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/space-overview/route.js +2 -2
- package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/space-overview/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.nft.json +1 -1
- package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/changelog/page.js +1 -1
- package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/changes/page.js +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +26 -25
- package/_standalone/.next/server/chunks/3437.js +2 -2
- package/_standalone/.next/server/chunks/5299.js +1 -0
- package/_standalone/.next/server/chunks/6022.js +39 -39
- package/_standalone/.next/server/chunks/6133.js +54 -0
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/8326.js +1 -0
- package/_standalone/.next/server/chunks/8388.js +5 -3
- package/_standalone/.next/server/chunks/953.js +6 -4
- package/_standalone/.next/server/chunks/9938.js +24 -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/chunks/1814.8a1fef15856dce84.js +1 -0
- package/_standalone/.next/static/chunks/2654-e07c692d6c99f25b.js +1 -0
- package/_standalone/.next/static/chunks/{2935.7d75923daaf448d3.js → 2935.9b08eeade3644806.js} +1 -1
- package/_standalone/.next/static/chunks/3269.a7343771e3f0ff58.js +48 -0
- package/_standalone/.next/static/chunks/3637.2b2697198968d83f.js +1 -0
- package/_standalone/.next/static/chunks/{5550-b7c97fc13628db15.js → 4327-d70a8d457e2d03fe.js} +1 -1
- package/_standalone/.next/static/chunks/48-c88ea6a2a45f15b4.js +28 -0
- package/_standalone/.next/static/chunks/5581-6d403608b5dfb20b.js +29 -0
- package/_standalone/.next/static/chunks/6902-edc5c487c696bd0b.js +3 -0
- package/_standalone/.next/static/chunks/808.72eb7bdd399e9a24.js +1 -0
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/_global-error/{page-e0c1e2c67572781c.js → page-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/page-3dc2bf2f6bc7334c.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/channels/verify/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/connect/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/raw/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/im/config/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/im/status/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/im/test/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/clip/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/lint/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/tools/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/space-overview/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/changes/page-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-75a6330292613587.js +157 -0
- package/_standalone/.next/static/chunks/app/echo/page-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/{layout-9bb19a959ffb87ac.js → layout-8aa53b34ef34a246.js} +28 -28
- package/_standalone/.next/static/chunks/app/loading-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/{page-c3be6477dbcf182d.js → page-318332501426ef5b.js} +1 -1
- package/_standalone/.next/static/chunks/app/trash/page-17bd5aedcfea9b65.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/page-d5c37c41c556013d.js +12 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/webpack-1c2d44f6d86f3986.js +1 -0
- package/_standalone/.next/static/css/a8cadde78aea8585.css +1 -0
- package/_standalone/.next/static/ixCTELNH6V05Z00pC6ZMO/_buildManifest.js +1 -0
- package/_standalone/.next/trace +72 -71
- package/_standalone/.next/types/routes.d.ts +2 -1
- package/_standalone/.next/types/validator.ts +9 -0
- package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
- package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
- package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
- package/_standalone/__tests__/acp/agent-descriptors.test.ts +101 -3
- package/_standalone/__tests__/acp/registry.test.ts +34 -5
- package/_standalone/__tests__/acp/session.test.ts +346 -167
- package/_standalone/__tests__/agent/provider-endpoints.test.ts +70 -0
- package/_standalone/__tests__/api/channels-verify.test.ts +75 -0
- package/_standalone/__tests__/api/extract-pdf.test.ts +265 -0
- package/_standalone/__tests__/api/test-key.test.ts +15 -3
- package/_standalone/__tests__/channel-mgmt.test.js +11 -0
- package/_standalone/__tests__/components/breadcrumb-header-ux.test.ts +14 -0
- package/_standalone/__tests__/components/header-toc-vertical-alignment.test.ts +23 -0
- package/_standalone/__tests__/components/table-of-contents-header-layout.test.ts +15 -0
- package/_standalone/__tests__/components/view-page-header-layout.test.ts +13 -0
- package/_standalone/__tests__/components/view-page-header-scroll-stability.test.ts +34 -0
- package/_standalone/__tests__/core/hybrid-search.test.ts +109 -0
- package/_standalone/components/Breadcrumb.tsx +10 -10
- package/_standalone/components/FindInPage.tsx +1 -1
- package/_standalone/components/MarkdownView.tsx +4 -0
- package/_standalone/components/Panel.tsx +17 -10
- package/_standalone/components/TableOfContents.tsx +9 -9
- package/_standalone/components/agents/AgentsContentChannelDetail.tsx +168 -54
- package/_standalone/components/agents/AgentsContentChannels.tsx +22 -22
- package/_standalone/components/ask/AskContent.tsx +68 -28
- package/_standalone/components/ask/AskHeader.tsx +6 -2
- package/_standalone/components/ask/ProviderModelCapsule.tsx +11 -9
- package/_standalone/components/ask/SessionHistoryPanel.tsx +398 -0
- package/_standalone/components/panels/AgentsPanel.tsx +8 -1
- package/_standalone/components/settings/AiTab.tsx +5 -1
- package/_standalone/components/settings/KnowledgeTab.tsx +92 -1
- package/_standalone/components/settings/McpConnectGuides.tsx +4 -0
- package/_standalone/components/settings/McpPortSection.tsx +207 -0
- package/_standalone/components/settings/McpTab.tsx +1 -5
- package/_standalone/components/settings/TestButton.tsx +1 -0
- package/_standalone/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
- package/_standalone/components/settings/types.ts +12 -0
- package/_standalone/components/settings/useCustomProviderForm.ts +2 -2
- package/_standalone/data/skills/mindos/SKILL.md +45 -1
- package/_standalone/hooks/useAcpDetection.ts +1 -1
- package/_standalone/hooks/useAcpRegistry.ts +1 -1
- package/_standalone/hooks/useFileImport.ts +7 -2
- package/_standalone/hooks/useFileUpload.ts +17 -10
- package/_standalone/lib/acp/index.ts +4 -6
- package/_standalone/lib/acp/types.ts +0 -29
- package/_standalone/lib/im/platforms.ts +6 -2
- package/_standalone/lib/pdf-extract.ts +6 -2
- package/_standalone/package-lock.json +12 -2
- package/_standalone/package.json +2 -1
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
- package/app/MINDOS_EXPLORATION_SUMMARY.md +229 -0
- package/app/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
- package/app/app/api/acp/detect/route.ts +9 -15
- package/app/app/api/channels/verify/route.ts +54 -0
- package/app/app/api/extract-pdf/route.ts +17 -3
- package/app/app/api/settings/list-models/route.ts +40 -44
- package/app/app/api/settings/route.ts +16 -0
- package/app/app/api/settings/test-key/route.ts +5 -2
- package/app/app/view/[...path]/ViewPageClient.tsx +1 -1
- package/app/components/Breadcrumb.tsx +10 -10
- package/app/components/DirView.tsx +1 -1
- package/app/components/FindInPage.tsx +1 -1
- package/app/components/InboxView.tsx +2 -2
- package/app/components/MarkdownView.tsx +4 -0
- package/app/components/Panel.tsx +17 -10
- package/app/components/TableOfContents.tsx +9 -9
- package/app/components/agents/AgentsContentChannelDetail.tsx +168 -54
- package/app/components/agents/AgentsContentChannels.tsx +22 -22
- package/app/components/ask/AskContent.tsx +68 -28
- package/app/components/ask/AskHeader.tsx +6 -2
- package/app/components/ask/ProviderModelCapsule.tsx +11 -9
- package/app/components/ask/SessionHistoryPanel.tsx +398 -0
- package/app/components/panels/AgentsPanel.tsx +8 -1
- package/app/components/settings/AiTab.tsx +5 -1
- package/app/components/settings/KnowledgeTab.tsx +92 -1
- package/app/components/settings/McpConnectGuides.tsx +4 -0
- package/app/components/settings/McpPortSection.tsx +207 -0
- package/app/components/settings/McpTab.tsx +1 -5
- package/app/components/settings/TestButton.tsx +1 -0
- package/app/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
- package/app/components/settings/types.ts +12 -0
- package/app/components/settings/useCustomProviderForm.ts +2 -2
- package/app/data/skills/mindos/SKILL.md +45 -1
- package/app/hooks/useAcpDetection.ts +1 -1
- package/app/hooks/useAcpRegistry.ts +1 -1
- package/app/hooks/useFileImport.ts +7 -2
- package/app/hooks/useFileUpload.ts +17 -10
- package/app/lib/acp/agent-descriptors.ts +69 -29
- package/app/lib/acp/index.ts +4 -6
- package/app/lib/acp/registry.ts +43 -47
- package/app/lib/acp/session.ts +253 -517
- package/app/lib/acp/subprocess.ts +249 -414
- package/app/lib/acp/types.ts +0 -29
- package/app/lib/agent/model.ts +20 -4
- package/app/lib/agent/non-streaming.ts +37 -20
- package/app/lib/agent/providers.ts +31 -0
- package/app/lib/agent/tools.ts +5 -3
- package/app/lib/core/embedding-index.ts +285 -0
- package/app/lib/core/embedding-provider.ts +164 -0
- package/app/lib/core/hybrid-search.ts +160 -0
- package/app/lib/core/search.ts +11 -21
- package/app/lib/i18n/modules/ai-chat.ts +26 -0
- package/app/lib/i18n/modules/panels.ts +14 -0
- package/app/lib/i18n/modules/settings.ts +2 -0
- package/app/lib/im/platforms.ts +6 -2
- package/app/lib/im/verify.ts +94 -0
- package/app/lib/pdf-extract.ts +6 -2
- package/app/lib/settings.ts +23 -0
- package/app/package.json +2 -1
- package/bin/cli.js +3 -1
- package/bin/commands/channel.js +342 -0
- package/bin/commands/update.js +11 -4
- package/bin/lib/build.js +34 -16
- package/bin/lib/channel-config.js +168 -0
- package/bin/lib/channel-constants.js +88 -0
- package/bin/lib/channel-mgmt.js +244 -0
- package/bin/lib/channel-prompts.js +72 -0
- package/bin/lib/channel-validate.js +57 -0
- package/bin/lib/safe-rm.js +165 -0
- package/package.json +1 -1
- package/skills/mindos/SKILL.md +45 -1
- package/_standalone/.next/server/chunks/1750.js +0 -1
- package/_standalone/.next/server/chunks/8947.js +0 -52
- package/_standalone/.next/static/0JtsgqDZLSJ6MrIZIV6gC/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
- package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +0 -1
- package/_standalone/.next/static/chunks/4351-9ab695985bb808ad.js +0 -1
- package/_standalone/.next/static/chunks/476.463546c195b89cce.js +0 -48
- package/_standalone/.next/static/chunks/5133-3779d65f4fdfb041.js +0 -30
- package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
- package/_standalone/.next/static/chunks/5998.7bd28de9747440b5.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/page-4c0637183e46c8d3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/connect/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/raw/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/im/config/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/im/status/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/im/test/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/clip/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/lint/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/tools/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/space-overview/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/changes/page-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-5333ab47257fab7f.js +0 -159
- package/_standalone/.next/static/chunks/app/echo/page-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-bebb28bf472cf691.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-dd5698f3df138835.js +0 -12
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/webpack-043f40ef7816d8c4.js +0 -1
- package/_standalone/.next/static/css/8b1f248d6540e52f.css +0 -1
- package/_standalone/lib/core/__tests__/synonym-dict.test.ts +0 -82
- package/app/lib/core/__tests__/synonym-dict.test.ts +0 -82
- package/app/lib/core/synonym-dict.ts +0 -139
- /package/_standalone/.next/static/{0JtsgqDZLSJ6MrIZIV6gC → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid search: BM25 + Embedding with Reciprocal Rank Fusion (RRF).
|
|
3
|
+
*
|
|
4
|
+
* When embedding is enabled and ready, runs both BM25 and embedding search,
|
|
5
|
+
* then merges results using RRF. When embedding is disabled or not ready,
|
|
6
|
+
* falls back to pure BM25 — zero overhead.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { searchFiles as bm25Search } from './search';
|
|
10
|
+
import { EmbeddingIndex } from './embedding-index';
|
|
11
|
+
import { getEmbeddingConfig } from './embedding-provider';
|
|
12
|
+
import { effectiveSopRoot } from '@/lib/settings';
|
|
13
|
+
import type { SearchResult, SearchOptions } from './types';
|
|
14
|
+
|
|
15
|
+
/** Module-level embedding index singleton — lazily initialized. */
|
|
16
|
+
const embeddingIndex = new EmbeddingIndex();
|
|
17
|
+
|
|
18
|
+
/** RRF constant (standard value from the original paper). */
|
|
19
|
+
const RRF_K = 60;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Hybrid search combining BM25 keyword search with embedding semantic search.
|
|
23
|
+
*
|
|
24
|
+
* Flow:
|
|
25
|
+
* 1. Always run BM25 (fast, synchronous).
|
|
26
|
+
* 2. If embedding is enabled:
|
|
27
|
+
* a. Ensure index is loaded/built (async, non-blocking on first call).
|
|
28
|
+
* b. If ready, run embedding search.
|
|
29
|
+
* c. Merge results with RRF.
|
|
30
|
+
* 3. If embedding is disabled or not ready, return pure BM25 results.
|
|
31
|
+
*/
|
|
32
|
+
export async function hybridSearch(
|
|
33
|
+
mindRoot: string,
|
|
34
|
+
query: string,
|
|
35
|
+
opts: SearchOptions = {},
|
|
36
|
+
): Promise<SearchResult[]> {
|
|
37
|
+
const limit = opts.limit ?? 20;
|
|
38
|
+
|
|
39
|
+
// Step 1: BM25 (always runs — synchronous, fast)
|
|
40
|
+
const bm25Results = bm25Search(mindRoot, query, { ...opts, limit: limit * 2 });
|
|
41
|
+
|
|
42
|
+
// Step 2: Check if embedding is available
|
|
43
|
+
const embeddingConfig = getEmbeddingConfig();
|
|
44
|
+
if (!embeddingConfig) {
|
|
45
|
+
// Embedding disabled — pure BM25
|
|
46
|
+
return bm25Results.slice(0, limit);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Step 3: Ensure embedding index is loaded/building
|
|
50
|
+
if (!embeddingIndex.isBuiltFor(mindRoot)) {
|
|
51
|
+
// Try loading from disk
|
|
52
|
+
const loaded = embeddingIndex.load(mindRoot);
|
|
53
|
+
if (!loaded && !embeddingIndex.isBuilding()) {
|
|
54
|
+
// Trigger async rebuild — don't await, return BM25 for now
|
|
55
|
+
embeddingIndex.rebuild(mindRoot).catch(() => {});
|
|
56
|
+
return bm25Results.slice(0, limit);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (!embeddingIndex.isReady()) {
|
|
61
|
+
// Still building — return BM25 only
|
|
62
|
+
return bm25Results.slice(0, limit);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Step 4: Run embedding search
|
|
66
|
+
const embeddingResults = await embeddingIndex.search(query, limit * 2);
|
|
67
|
+
|
|
68
|
+
if (embeddingResults.length === 0) {
|
|
69
|
+
// Embedding search failed or returned nothing — pure BM25
|
|
70
|
+
return bm25Results.slice(0, limit);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Step 5: RRF merge
|
|
74
|
+
return rrfMerge(bm25Results, embeddingResults, limit);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Reciprocal Rank Fusion — merges two ranked lists.
|
|
79
|
+
*
|
|
80
|
+
* score(doc) = 1/(k + rank_bm25) + 1/(k + rank_embedding)
|
|
81
|
+
*
|
|
82
|
+
* Documents appearing in only one list get only that term.
|
|
83
|
+
* This naturally balances exact keyword matches with semantic matches.
|
|
84
|
+
*/
|
|
85
|
+
function rrfMerge(
|
|
86
|
+
bm25Results: SearchResult[],
|
|
87
|
+
embeddingResults: { path: string; similarity: number }[],
|
|
88
|
+
limit: number,
|
|
89
|
+
): SearchResult[] {
|
|
90
|
+
const rrfScores = new Map<string, number>();
|
|
91
|
+
const snippets = new Map<string, string>();
|
|
92
|
+
const bm25Scores = new Map<string, number>();
|
|
93
|
+
|
|
94
|
+
// BM25 ranks
|
|
95
|
+
for (let i = 0; i < bm25Results.length; i++) {
|
|
96
|
+
const r = bm25Results[i];
|
|
97
|
+
const rank = i + 1;
|
|
98
|
+
rrfScores.set(r.path, (rrfScores.get(r.path) ?? 0) + 1 / (RRF_K + rank));
|
|
99
|
+
snippets.set(r.path, r.snippet);
|
|
100
|
+
bm25Scores.set(r.path, r.score);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Embedding ranks
|
|
104
|
+
for (let i = 0; i < embeddingResults.length; i++) {
|
|
105
|
+
const r = embeddingResults[i];
|
|
106
|
+
const rank = i + 1;
|
|
107
|
+
rrfScores.set(r.path, (rrfScores.get(r.path) ?? 0) + 1 / (RRF_K + rank));
|
|
108
|
+
// If embedding found a doc that BM25 didn't, we need a snippet
|
|
109
|
+
if (!snippets.has(r.path)) {
|
|
110
|
+
snippets.set(r.path, `[semantic match, similarity: ${r.similarity.toFixed(3)}]`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Sort by RRF score
|
|
115
|
+
const merged = [...rrfScores.entries()]
|
|
116
|
+
.sort(([, a], [, b]) => b - a)
|
|
117
|
+
.slice(0, limit)
|
|
118
|
+
.map(([filePath, rrfScore]) => ({
|
|
119
|
+
path: filePath,
|
|
120
|
+
snippet: snippets.get(filePath) ?? '',
|
|
121
|
+
score: rrfScore,
|
|
122
|
+
occurrences: bm25Scores.has(filePath) ? 1 : 0, // mark whether BM25 contributed
|
|
123
|
+
}));
|
|
124
|
+
|
|
125
|
+
return merged;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ── Incremental index management (called from search.ts on file mutations) ──
|
|
129
|
+
|
|
130
|
+
/** Update embedding for a single file after write. Non-blocking. */
|
|
131
|
+
export function updateEmbeddingFile(mindRoot: string, filePath: string): void {
|
|
132
|
+
if (!embeddingIndex.isReady()) return;
|
|
133
|
+
embeddingIndex.updateFile(mindRoot, filePath).catch(() => {});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Remove a file from the embedding index after delete. */
|
|
137
|
+
export function removeEmbeddingFile(filePath: string): void {
|
|
138
|
+
embeddingIndex.removeFile(filePath);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Invalidate the embedding index entirely. */
|
|
142
|
+
export function invalidateEmbeddingIndex(): void {
|
|
143
|
+
embeddingIndex.invalidate();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Get embedding index status (for diagnostics/UI). */
|
|
147
|
+
export function getEmbeddingStatus(): {
|
|
148
|
+
enabled: boolean;
|
|
149
|
+
ready: boolean;
|
|
150
|
+
building: boolean;
|
|
151
|
+
docCount: number;
|
|
152
|
+
} {
|
|
153
|
+
const config = getEmbeddingConfig();
|
|
154
|
+
return {
|
|
155
|
+
enabled: !!config,
|
|
156
|
+
ready: embeddingIndex.isReady(),
|
|
157
|
+
building: embeddingIndex.isBuilding(),
|
|
158
|
+
docCount: embeddingIndex.getDocCount(),
|
|
159
|
+
};
|
|
160
|
+
}
|
package/app/lib/core/search.ts
CHANGED
|
@@ -5,8 +5,7 @@ import { collectAllFiles } from './tree';
|
|
|
5
5
|
import { readFile } from './fs-ops';
|
|
6
6
|
import { SearchIndex } from './search-index';
|
|
7
7
|
import type { SearchResult, SearchOptions } from './types';
|
|
8
|
-
import {
|
|
9
|
-
|
|
8
|
+
import { updateEmbeddingFile, removeEmbeddingFile, invalidateEmbeddingIndex } from './hybrid-search';
|
|
10
9
|
/**
|
|
11
10
|
* Module-level search index singleton.
|
|
12
11
|
* Lazily built on first search, invalidated by `invalidateSearchIndex()`.
|
|
@@ -21,6 +20,7 @@ function getMindosDir(): string {
|
|
|
21
20
|
/** Invalidate the core search index. Called from `lib/fs.ts` on write operations. */
|
|
22
21
|
export function invalidateSearchIndex(): void {
|
|
23
22
|
searchIndex.invalidate();
|
|
23
|
+
invalidateEmbeddingIndex();
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/** Incrementally update a single file in the search index (after write/edit). */
|
|
@@ -28,6 +28,8 @@ export function updateSearchIndexFile(mindRoot: string, filePath: string): void
|
|
|
28
28
|
if (!searchIndex.isBuilt()) return;
|
|
29
29
|
searchIndex.updateFile(mindRoot, filePath);
|
|
30
30
|
schedulePersist();
|
|
31
|
+
// Also update embedding index (async, non-blocking)
|
|
32
|
+
updateEmbeddingFile(mindRoot, filePath);
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
/** Incrementally add a new file to the search index (after create). */
|
|
@@ -35,6 +37,8 @@ export function addSearchIndexFile(mindRoot: string, filePath: string): void {
|
|
|
35
37
|
if (!searchIndex.isBuilt()) return;
|
|
36
38
|
searchIndex.addFile(mindRoot, filePath);
|
|
37
39
|
schedulePersist();
|
|
40
|
+
// Also update embedding index (async, non-blocking)
|
|
41
|
+
updateEmbeddingFile(mindRoot, filePath);
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
/** Incrementally remove a file from the search index (after delete). */
|
|
@@ -42,6 +46,7 @@ export function removeSearchIndexFile(filePath: string): void {
|
|
|
42
46
|
if (!searchIndex.isBuilt()) return;
|
|
43
47
|
searchIndex.removeFile(filePath);
|
|
44
48
|
schedulePersist();
|
|
49
|
+
removeEmbeddingFile(filePath);
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
/** Debounced persist — writes index to disk 5s after last write operation. */
|
|
@@ -151,13 +156,10 @@ function countTermOccurrences(term: string, text: string): number {
|
|
|
151
156
|
* Candidate narrowing: uses an in-memory inverted index with UNION semantics
|
|
152
157
|
* for multi-term queries (a document matching ANY term is a candidate).
|
|
153
158
|
*
|
|
154
|
-
* Synonym expansion: queries are expanded via the synonym dictionary so that
|
|
155
|
-
* "架构" automatically searches for "系统设计", "技术方案", etc.
|
|
156
|
-
*
|
|
157
159
|
* NOTE: The App also has a separate Fuse.js fuzzy search in `lib/fs.ts` for the
|
|
158
160
|
* browser `⌘K` search overlay. The two coexist intentionally:
|
|
159
|
-
* - Core search (here):
|
|
160
|
-
* - App search (lib/fs.ts): Fuse.js fuzzy match
|
|
161
|
+
* - Core search (here): BM25 ranking, used by MCP/API/Agent
|
|
162
|
+
* - App search (lib/fs.ts): Fuse.js fuzzy match, used by frontend ⌘K
|
|
161
163
|
*/
|
|
162
164
|
export function searchFiles(mindRoot: string, query: string, opts: SearchOptions = {}): SearchResult[] {
|
|
163
165
|
if (!query.trim()) return [];
|
|
@@ -176,20 +178,8 @@ export function searchFiles(mindRoot: string, query: string, opts: SearchOptions
|
|
|
176
178
|
|
|
177
179
|
const totalDocs = searchIndex.getFileCount();
|
|
178
180
|
const avgDocLength = searchIndex.getAvgDocLength();
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
const expandedTerms = expandQueryWithSynonyms(query);
|
|
182
|
-
|
|
183
|
-
// If synonym expansion produced new terms, use the expanded set.
|
|
184
|
-
// Otherwise fall back to the original query term splitting behavior.
|
|
185
|
-
let queryTerms: string[];
|
|
186
|
-
if (expandedTerms.length > 0 && expandedTerms.length !== 1) {
|
|
187
|
-
queryTerms = expandedTerms;
|
|
188
|
-
} else if (expandedTerms.length === 1) {
|
|
189
|
-
queryTerms = splitQueryTerms(query);
|
|
190
|
-
} else {
|
|
191
|
-
queryTerms = splitQueryTerms(query);
|
|
192
|
-
}
|
|
181
|
+
|
|
182
|
+
const queryTerms = splitQueryTerms(query);
|
|
193
183
|
|
|
194
184
|
// Use UNION index to get candidate files (any file matching any term)
|
|
195
185
|
const candidates = searchIndex.getCandidatesUnion(query);
|
|
@@ -122,6 +122,19 @@ export const aiChatEn = {
|
|
|
122
122
|
fileName: 'Filename',
|
|
123
123
|
saveGenerating: 'Generating summary...',
|
|
124
124
|
saveRetry: 'Retry',
|
|
125
|
+
historySearch: 'Search conversations...',
|
|
126
|
+
historyStats: (n: number) => `${n} conversation${n === 1 ? '' : 's'}`,
|
|
127
|
+
historyPinned: 'Pinned',
|
|
128
|
+
historyToday: 'Today',
|
|
129
|
+
historyYesterday: 'Yesterday',
|
|
130
|
+
historyThisWeek: 'This week',
|
|
131
|
+
historyOlder: 'Older',
|
|
132
|
+
historyExport: 'Export',
|
|
133
|
+
historyEmpty: 'No conversations yet',
|
|
134
|
+
historyEmptyHint: 'Start a new chat to begin',
|
|
135
|
+
historyCapacity: (n: number) => `${n} of 30`,
|
|
136
|
+
historyDeleteConfirm: 'Delete this conversation?',
|
|
137
|
+
historyMsgs: (n: number) => `${n} msg${n === 1 ? '' : 's'}`,
|
|
125
138
|
},
|
|
126
139
|
changes: {
|
|
127
140
|
unreadBanner: (n: number) => `${n} content change${n === 1 ? '' : 's'} unread`,
|
|
@@ -347,6 +360,19 @@ export const aiChatZh = {
|
|
|
347
360
|
fileName: '文件名',
|
|
348
361
|
saveGenerating: '正在生成摘要...',
|
|
349
362
|
saveRetry: '重试',
|
|
363
|
+
historySearch: '搜索对话...',
|
|
364
|
+
historyStats: (n: number) => `${n} 个对话`,
|
|
365
|
+
historyPinned: '已固定',
|
|
366
|
+
historyToday: '今天',
|
|
367
|
+
historyYesterday: '昨天',
|
|
368
|
+
historyThisWeek: '本周',
|
|
369
|
+
historyOlder: '更早',
|
|
370
|
+
historyExport: '导出',
|
|
371
|
+
historyEmpty: '暂无对话',
|
|
372
|
+
historyEmptyHint: '开始新对话吧',
|
|
373
|
+
historyCapacity: (n: number) => `${n} / 30`,
|
|
374
|
+
historyDeleteConfirm: '确定删除此对话?',
|
|
375
|
+
historyMsgs: (n: number) => `${n} 条消息`,
|
|
350
376
|
},
|
|
351
377
|
changes: {
|
|
352
378
|
unreadBanner: (n: number) => `${n} 条内容变更未读`,
|
|
@@ -223,6 +223,13 @@ export const panelsEn = {
|
|
|
223
223
|
backToChannels: 'Back to Channels',
|
|
224
224
|
setupGuide: 'Setup Guide',
|
|
225
225
|
disconnectHint: 'Remove credentials and disconnect this platform.',
|
|
226
|
+
editCredentials: 'Update credentials',
|
|
227
|
+
editCredentialsHint: 'Need to rotate tokens or fix a broken connection? Update and save here.',
|
|
228
|
+
guideLink: 'Open setup guide',
|
|
229
|
+
recipientHint: 'Use the platform-specific recipient ID.',
|
|
230
|
+
savedValuesHint: 'Saved values stay hidden. To update credentials, paste the full replacement values and save.',
|
|
231
|
+
required: 'required',
|
|
232
|
+
saving: 'Saving...',
|
|
226
233
|
},
|
|
227
234
|
},
|
|
228
235
|
echoPages: {
|
|
@@ -951,6 +958,13 @@ export const panelsZh = {
|
|
|
951
958
|
backToChannels: '返回频道',
|
|
952
959
|
setupGuide: '配置指南',
|
|
953
960
|
disconnectHint: '移除凭证并断开此平台的连接。',
|
|
961
|
+
editCredentials: '更新凭证',
|
|
962
|
+
editCredentialsHint: '如果需要轮换密钥或修复连接,可直接在这里更新并保存。',
|
|
963
|
+
guideLink: '打开配置指南',
|
|
964
|
+
recipientHint: '请输入平台对应的接收者 ID。',
|
|
965
|
+
savedValuesHint: '已保存的值会保持隐藏。若要更新凭证,请重新粘贴完整的新值后再保存。',
|
|
966
|
+
required: '必填',
|
|
967
|
+
saving: '保存中...',
|
|
954
968
|
},
|
|
955
969
|
},
|
|
956
970
|
echoPages: {
|
|
@@ -24,6 +24,7 @@ export const settingsEn = {
|
|
|
24
24
|
testKeyOk: (ms: number) => `\u2713 ${ms}ms`,
|
|
25
25
|
testKeyAuthError: 'Invalid API key',
|
|
26
26
|
testKeyModelNotFound: 'Model not found',
|
|
27
|
+
testKeyEndpointError: 'Endpoint or protocol mismatch',
|
|
27
28
|
testKeyRateLimited: 'Rate limited, try again later',
|
|
28
29
|
testKeyNetworkError: 'Network error',
|
|
29
30
|
testKeyNoKey: 'No API key configured',
|
|
@@ -547,6 +548,7 @@ export const settingsZh = {
|
|
|
547
548
|
testKeyOk: (ms: number) => `\u2713 ${ms}ms`,
|
|
548
549
|
testKeyAuthError: 'API Key 无效',
|
|
549
550
|
testKeyModelNotFound: '模型不存在',
|
|
551
|
+
testKeyEndpointError: '接口地址或协议不匹配',
|
|
550
552
|
testKeyRateLimited: '请求频率限制,稍后重试',
|
|
551
553
|
testKeyNetworkError: '网络错误',
|
|
552
554
|
testKeyNoKey: '未配置 API Key',
|
package/app/lib/im/platforms.ts
CHANGED
|
@@ -13,6 +13,8 @@ export interface PlatformDef {
|
|
|
13
13
|
icon: string;
|
|
14
14
|
fields: PlatformField[];
|
|
15
15
|
guide?: string;
|
|
16
|
+
guideUrl?: string;
|
|
17
|
+
editHint?: string;
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
export type PlatformStatus = {
|
|
@@ -33,9 +35,11 @@ export const PLATFORMS: PlatformDef[] = [
|
|
|
33
35
|
{
|
|
34
36
|
id: 'feishu', name: 'Feishu', icon: '🐦',
|
|
35
37
|
guide: '1. open.feishu.cn → Create App\n2. Credentials page → copy App ID & Secret\n3. Enable Bot capability + add permissions',
|
|
38
|
+
guideUrl: 'https://open.feishu.cn/',
|
|
39
|
+
editHint: 'Need to update credentials? Edit and save below — MindOS will reconnect automatically.',
|
|
36
40
|
fields: [
|
|
37
|
-
{ key: 'app_id', label: 'App ID', placeholder: '
|
|
38
|
-
{ key: 'app_secret', label: 'App Secret', placeholder: '
|
|
41
|
+
{ key: 'app_id', label: 'App ID', placeholder: 'CLI_XXXXXXXXXXXXXXXXX', hint: 'From Credentials page on open.feishu.cn' },
|
|
42
|
+
{ key: 'app_secret', label: 'App Secret', placeholder: 'XXXXXXXXXXXXXXXXXXXXXXXX', hint: 'Keep this secret — do not share' },
|
|
39
43
|
],
|
|
40
44
|
},
|
|
41
45
|
{
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { IMAdapter, IMPlatform } from './types';
|
|
2
|
+
import { validatePlatformConfig } from './config';
|
|
3
|
+
|
|
4
|
+
export interface IMVerifyResult {
|
|
5
|
+
ok: boolean;
|
|
6
|
+
botName?: string;
|
|
7
|
+
botId?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function verifyIMCredentials(platform: IMPlatform, credentials: unknown): Promise<IMVerifyResult> {
|
|
12
|
+
const validation = validatePlatformConfig(platform, credentials);
|
|
13
|
+
if (!validation.valid) {
|
|
14
|
+
return {
|
|
15
|
+
ok: false,
|
|
16
|
+
error: `Missing required fields: ${validation.missing?.join(', ') || 'unknown'}`,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const adapter = await createAdapter(platform, credentials);
|
|
21
|
+
try {
|
|
22
|
+
const ok = await adapter.verify();
|
|
23
|
+
if (!ok) {
|
|
24
|
+
return { ok: false, error: 'Credential verification failed' };
|
|
25
|
+
}
|
|
26
|
+
const info = extractAdapterIdentity(adapter);
|
|
27
|
+
return { ok: true, ...info };
|
|
28
|
+
} catch (error) {
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
error: error instanceof Error ? error.message : String(error),
|
|
32
|
+
};
|
|
33
|
+
} finally {
|
|
34
|
+
await adapter.dispose().catch(() => {});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function createAdapter(platform: IMPlatform, credentials: unknown): Promise<IMAdapter> {
|
|
39
|
+
switch (platform) {
|
|
40
|
+
case 'telegram': {
|
|
41
|
+
const { TelegramAdapter } = await import('./adapters/telegram');
|
|
42
|
+
return new TelegramAdapter(credentials as ConstructorParameters<typeof TelegramAdapter>[0]);
|
|
43
|
+
}
|
|
44
|
+
case 'feishu': {
|
|
45
|
+
const { FeishuAdapter } = await import('./adapters/feishu');
|
|
46
|
+
return new FeishuAdapter(credentials as ConstructorParameters<typeof FeishuAdapter>[0]);
|
|
47
|
+
}
|
|
48
|
+
case 'discord': {
|
|
49
|
+
const { DiscordAdapter } = await import('./adapters/discord');
|
|
50
|
+
return new DiscordAdapter(credentials as ConstructorParameters<typeof DiscordAdapter>[0]);
|
|
51
|
+
}
|
|
52
|
+
case 'slack': {
|
|
53
|
+
const { SlackAdapter } = await import('./adapters/slack');
|
|
54
|
+
return new SlackAdapter(credentials as ConstructorParameters<typeof SlackAdapter>[0]);
|
|
55
|
+
}
|
|
56
|
+
case 'wecom': {
|
|
57
|
+
const { WeComAdapter } = await import('./adapters/wecom');
|
|
58
|
+
return new WeComAdapter(credentials as ConstructorParameters<typeof WeComAdapter>[0]);
|
|
59
|
+
}
|
|
60
|
+
case 'dingtalk': {
|
|
61
|
+
const { DingTalkAdapter } = await import('./adapters/dingtalk');
|
|
62
|
+
return new DingTalkAdapter(credentials as ConstructorParameters<typeof DingTalkAdapter>[0]);
|
|
63
|
+
}
|
|
64
|
+
case 'wechat': {
|
|
65
|
+
const { WeChatAdapter } = await import('./adapters/wechat');
|
|
66
|
+
return new WeChatAdapter(credentials as ConstructorParameters<typeof WeChatAdapter>[0]);
|
|
67
|
+
}
|
|
68
|
+
case 'qq': {
|
|
69
|
+
const { QQAdapter } = await import('./adapters/qq');
|
|
70
|
+
return new QQAdapter(credentials as ConstructorParameters<typeof QQAdapter>[0]);
|
|
71
|
+
}
|
|
72
|
+
default:
|
|
73
|
+
throw new Error(`Unsupported platform: ${platform}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function extractAdapterIdentity(adapter: IMAdapter): Pick<IMVerifyResult, 'botName' | 'botId'> {
|
|
78
|
+
if ('getBotInfo' in adapter && typeof adapter.getBotInfo === 'function') {
|
|
79
|
+
const info = adapter.getBotInfo() as { id?: string | number; username?: string | null } | null;
|
|
80
|
+
if (info) {
|
|
81
|
+
return {
|
|
82
|
+
botId: info.id ? String(info.id) : undefined,
|
|
83
|
+
botName: info.username ? String(info.username) : undefined,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if ('getAppName' in adapter && typeof adapter.getAppName === 'function') {
|
|
89
|
+
const appName = adapter.getAppName() as string | null;
|
|
90
|
+
return { botName: appName ?? undefined };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return {};
|
|
94
|
+
}
|
package/app/lib/pdf-extract.ts
CHANGED
|
@@ -18,7 +18,7 @@ export async function extractPdfText(file: File): Promise<string> {
|
|
|
18
18
|
body: JSON.stringify({ name: file.name, dataBase64 }),
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
-
let payload: { text?: string; extracted?:
|
|
21
|
+
let payload: { text?: string; extracted?: 'success' | 'empty' | 'error'; extractionError?: string; error?: string } = {};
|
|
22
22
|
try {
|
|
23
23
|
payload = await res.json();
|
|
24
24
|
} catch {
|
|
@@ -29,5 +29,9 @@ export async function extractPdfText(file: File): Promise<string> {
|
|
|
29
29
|
throw new Error(payload.error || `PDF extraction failed (${res.status})`);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
if (payload.extracted === 'error') {
|
|
33
|
+
throw new Error(payload.extractionError || 'Failed to parse PDF');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return payload.extracted === 'success' ? (payload.text || '') : '';
|
|
33
37
|
}
|
package/app/lib/settings.ts
CHANGED
|
@@ -40,9 +40,17 @@ export interface GuideState {
|
|
|
40
40
|
walkthroughDismissed?: boolean; // user skipped walkthrough
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
export interface EmbeddingConfig {
|
|
44
|
+
enabled: boolean;
|
|
45
|
+
baseUrl: string; // e.g. "https://api.openai.com/v1"
|
|
46
|
+
apiKey: string;
|
|
47
|
+
model: string; // e.g. "text-embedding-3-small"
|
|
48
|
+
}
|
|
49
|
+
|
|
43
50
|
export interface ServerSettings {
|
|
44
51
|
ai: AiConfig;
|
|
45
52
|
agent?: AgentConfig;
|
|
53
|
+
embedding?: EmbeddingConfig;
|
|
46
54
|
mindRoot: string; // empty = use env var / default
|
|
47
55
|
port?: number;
|
|
48
56
|
mcpPort?: number;
|
|
@@ -120,6 +128,19 @@ function parseAgent(raw: unknown): AgentConfig | undefined {
|
|
|
120
128
|
return Object.keys(result).length > 0 ? result : undefined;
|
|
121
129
|
}
|
|
122
130
|
|
|
131
|
+
/** Parse embedding config from unknown input */
|
|
132
|
+
function parseEmbedding(raw: unknown): EmbeddingConfig | undefined {
|
|
133
|
+
if (!raw || typeof raw !== 'object') return undefined;
|
|
134
|
+
const obj = raw as Record<string, unknown>;
|
|
135
|
+
if (typeof obj.enabled !== 'boolean') return undefined;
|
|
136
|
+
return {
|
|
137
|
+
enabled: obj.enabled,
|
|
138
|
+
baseUrl: typeof obj.baseUrl === 'string' ? obj.baseUrl : '',
|
|
139
|
+
apiKey: typeof obj.apiKey === 'string' ? obj.apiKey : '',
|
|
140
|
+
model: typeof obj.model === 'string' ? obj.model : '',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
123
144
|
/** Parse acpAgents config field, delegates to agent-descriptors.ts */
|
|
124
145
|
function parseAcpAgentsField(raw: unknown): Record<string, import('./acp/agent-descriptors').AcpAgentOverride> | undefined {
|
|
125
146
|
return parseAcpAgentOverrides(raw);
|
|
@@ -176,6 +197,7 @@ export function readSettings(): ServerSettings {
|
|
|
176
197
|
const settings: ServerSettings = {
|
|
177
198
|
ai: migrateAi(parsed),
|
|
178
199
|
agent: parseAgent(parsed.agent),
|
|
200
|
+
embedding: parseEmbedding(parsed.embedding),
|
|
179
201
|
acpAgents: parseAcpAgentsField(parsed.acpAgents),
|
|
180
202
|
mindRoot: (parsed.mindRoot ?? DEFAULTS.mindRoot) as string,
|
|
181
203
|
webPassword: typeof parsed.webPassword === 'string' ? parsed.webPassword : undefined,
|
|
@@ -224,6 +246,7 @@ export function writeSettings(settings: ServerSettings): void {
|
|
|
224
246
|
try { existing = JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf-8')); } catch { /* ignore */ }
|
|
225
247
|
const merged: Record<string, unknown> = { ...existing, ai: settings.ai, mindRoot: settings.mindRoot };
|
|
226
248
|
if (settings.agent !== undefined) merged.agent = settings.agent;
|
|
249
|
+
if (settings.embedding !== undefined) merged.embedding = settings.embedding;
|
|
227
250
|
if (settings.webPassword !== undefined) merged.webPassword = settings.webPassword;
|
|
228
251
|
if (settings.authToken !== undefined) merged.authToken = settings.authToken;
|
|
229
252
|
if (settings.port !== undefined) merged.port = settings.port;
|
package/app/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wiki-app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.70",
|
|
4
4
|
"private": true,
|
|
5
5
|
"scripts": {
|
|
6
6
|
"generate": "npx tsx scripts/generate-explore.ts",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"postinstall": "node ../scripts/fix-postcss-deps.cjs"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
+
"@agentclientprotocol/sdk": "^0.18.2",
|
|
18
19
|
"@base-ui/react": "^1.2.0",
|
|
19
20
|
"@codemirror/lang-markdown": "^6.5.0",
|
|
20
21
|
"@codemirror/state": "^6.5.4",
|
package/bin/cli.js
CHANGED
|
@@ -39,6 +39,7 @@ import * as uninstallCmd from './commands/uninstall.js';
|
|
|
39
39
|
import * as logsCmd from './commands/logs.js';
|
|
40
40
|
import * as apiCmd from './commands/api.js';
|
|
41
41
|
import * as initSkillsCmd from './commands/init-skills.js';
|
|
42
|
+
import * as channelCmd from './commands/channel.js';
|
|
42
43
|
|
|
43
44
|
// ── Command registry ──────────────────────────────────────────────────────────
|
|
44
45
|
|
|
@@ -49,7 +50,7 @@ const modules = [
|
|
|
49
50
|
mcpCmd, tokenCmd,
|
|
50
51
|
syncCmd,
|
|
51
52
|
gatewayCmd,
|
|
52
|
-
onboardCmd, configCmd, doctorCmd, updateCmd, uninstallCmd, logsCmd, apiCmd,
|
|
53
|
+
onboardCmd, configCmd, channelCmd, doctorCmd, updateCmd, uninstallCmd, logsCmd, apiCmd,
|
|
53
54
|
initSkillsCmd,
|
|
54
55
|
];
|
|
55
56
|
|
|
@@ -88,6 +89,7 @@ const coreEntries = [
|
|
|
88
89
|
['mcp', mcpCmd],
|
|
89
90
|
['init', onboardCmd],
|
|
90
91
|
['config', configCmd],
|
|
92
|
+
['channel', channelCmd],
|
|
91
93
|
['doctor', doctorCmd],
|
|
92
94
|
['update', updateCmd],
|
|
93
95
|
];
|