@geminilight/mindos 0.6.69 → 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 +22 -21
- 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_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 +13 -13
- 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 +22 -21
- 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 +42 -42
- 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-8aa53b34ef34a246.js +133 -0
- 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 +36 -0
- 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 +11 -11
- 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/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 +3 -7
- 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/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 +11 -11
- 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/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 +18 -0
- package/app/lib/acp/index.ts +3 -7
- package/app/lib/acp/registry.ts +1 -1
- package/app/lib/acp/session.ts +237 -530
- package/app/lib/acp/subprocess.ts +224 -427
- 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 +2 -1
- 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/7200.js +0 -52
- package/_standalone/.next/static/HL8b6d3NCfyoAXNuY2kcn/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
- package/_standalone/.next/static/chunks/3466.bc6ab3172ad66091.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/5133-3779d65f4fdfb041.js +0 -30
- package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
- package/_standalone/.next/static/chunks/8735.66a049abcf0971fb.js +0 -48
- 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/layout-bd0652768781e726.js +0 -133
- package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-8280ba2f5c20861e.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-b942374e2f88c53e.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-9e42857d6c44fe70.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/{HL8b6d3NCfyoAXNuY2kcn → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,732 @@
|
|
|
1
|
+
# MindOS Infrastructure Analysis: Settings, LLM API Management, and Search
|
|
2
|
+
|
|
3
|
+
## Executive Summary
|
|
4
|
+
|
|
5
|
+
MindOS uses a unified, extensible architecture for managing user settings (including API keys), LLM provider configurations, and search infrastructure. The system is designed to support optional features through modular plugin patterns and configuration-driven behavior. Below is a detailed analysis of the three pillars required for adding embedding-based RAG search.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. SETTINGS SYSTEM
|
|
10
|
+
|
|
11
|
+
### 1.1 Settings Storage Location & Format
|
|
12
|
+
|
|
13
|
+
**Path:** `~/.mindos/config.json` (platform-independent)
|
|
14
|
+
- Stored in user's home directory under `.mindos/` directory
|
|
15
|
+
- Single JSON file, atomic writes via rename (prevents corruption on crash)
|
|
16
|
+
- Synced from multiple sources (CLI, API, UI)
|
|
17
|
+
|
|
18
|
+
**Example structure:**
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mindRoot": "/path/to/mind",
|
|
22
|
+
"port": 3003,
|
|
23
|
+
"mcpPort": 8700,
|
|
24
|
+
"authToken": "token-here",
|
|
25
|
+
"webPassword": "password",
|
|
26
|
+
"ai": {
|
|
27
|
+
"activeProvider": "p_esc9eiuh",
|
|
28
|
+
"providers": [...]
|
|
29
|
+
},
|
|
30
|
+
"agent": {
|
|
31
|
+
"maxSteps": 20,
|
|
32
|
+
"enableThinking": true
|
|
33
|
+
},
|
|
34
|
+
"baseUrlCompat": {},
|
|
35
|
+
"connectionMode": {"cli": true, "mcp": true},
|
|
36
|
+
"guideState": {...},
|
|
37
|
+
"disabledSkills": [],
|
|
38
|
+
"installedSkillAgents": []
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 1.2 Settings API Surface
|
|
43
|
+
|
|
44
|
+
**File:** `lib/settings.ts` (core interface)
|
|
45
|
+
|
|
46
|
+
**Key Functions:**
|
|
47
|
+
```typescript
|
|
48
|
+
readSettings(): ServerSettings
|
|
49
|
+
// Reads from ~/.mindos/config.json, auto-migrates old formats
|
|
50
|
+
// Returns typed ServerSettings interface
|
|
51
|
+
// Handles corruption gracefully (returns defaults + setupPending=true)
|
|
52
|
+
|
|
53
|
+
writeSettings(settings: ServerSettings): void
|
|
54
|
+
// Atomic JSON write via temp file + rename
|
|
55
|
+
// Merges with existing config to preserve unknown fields
|
|
56
|
+
// Non-critical failures silently caught
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Key Types:**
|
|
60
|
+
```typescript
|
|
61
|
+
interface ServerSettings {
|
|
62
|
+
ai: AiConfig;
|
|
63
|
+
agent?: AgentConfig;
|
|
64
|
+
mindRoot: string;
|
|
65
|
+
port?: number;
|
|
66
|
+
mcpPort?: number;
|
|
67
|
+
authToken?: string;
|
|
68
|
+
webPassword?: string;
|
|
69
|
+
startMode?: 'dev' | 'start' | 'daemon';
|
|
70
|
+
setupPending?: boolean;
|
|
71
|
+
disabledSkills?: string[];
|
|
72
|
+
guideState?: GuideState;
|
|
73
|
+
acpAgents?: Record<string, AcpAgentOverride>;
|
|
74
|
+
baseUrlCompat?: Record<string, 'streaming' | 'non-streaming'>;
|
|
75
|
+
connectionMode?: { cli: boolean; mcp: boolean };
|
|
76
|
+
customAgents?: CustomAgentDef[];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface AiConfig {
|
|
80
|
+
activeProvider: string; // e.g., "p_esc9eiuh" (provider entry ID)
|
|
81
|
+
providers: Provider[]; // Unified array of all configured providers
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
interface AgentConfig {
|
|
85
|
+
maxSteps?: number; // 1-30, default 20
|
|
86
|
+
enableThinking?: boolean; // Anthropic only, default false
|
|
87
|
+
thinkingBudget?: number; // default 5000
|
|
88
|
+
contextStrategy?: 'auto' | 'off';
|
|
89
|
+
reconnectRetries?: number;
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 1.3 Settings I/O Patterns
|
|
94
|
+
|
|
95
|
+
**File:** `lib/sync-config.ts` (companion functions)
|
|
96
|
+
```typescript
|
|
97
|
+
atomicWriteJSON(filePath, data) // Temp file + rename pattern
|
|
98
|
+
loadConfig(): Record<string, any> // Load config.json
|
|
99
|
+
saveConfig(config) // Save config.json
|
|
100
|
+
loadSyncState(): Record<string, any> // Load sync-state.json
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Constants:**
|
|
104
|
+
```typescript
|
|
105
|
+
SETTINGS_PATH = ~/.mindos/config.json
|
|
106
|
+
SYNC_STATE_PATH = ~/.mindos/sync-state.json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 1.4 Settings UI Flow
|
|
110
|
+
|
|
111
|
+
**File:** `components/settings/AiTab.tsx` (example)
|
|
112
|
+
- Settings UI component (React)
|
|
113
|
+
- Fetches settings via `GET /api/settings`
|
|
114
|
+
- Updates settings via `POST /api/settings`
|
|
115
|
+
- Auto-saves individual field changes
|
|
116
|
+
|
|
117
|
+
**API Routes:**
|
|
118
|
+
```
|
|
119
|
+
GET /api/settings → Returns all settings + env overrides
|
|
120
|
+
POST /api/settings → Writes full settings object
|
|
121
|
+
POST /api/settings/test-key → Tests LLM provider connectivity
|
|
122
|
+
GET /api/settings/list-models → Lists available models for a provider
|
|
123
|
+
POST /api/settings/reset-token → Regenerates auth token
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**File:** `app/api/settings/route.ts`
|
|
127
|
+
```typescript
|
|
128
|
+
GET() // Returns settings + masking for tokens, env var detection
|
|
129
|
+
POST() // Validates, merges, writes to settings file
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 1.5 Extension Point: Adding New Settings Fields
|
|
133
|
+
|
|
134
|
+
**Pattern:**
|
|
135
|
+
1. Add new field to `ServerSettings` interface in `lib/settings.ts`
|
|
136
|
+
2. Add read/write logic in `readSettings()` / `writeSettings()`
|
|
137
|
+
3. Add parsing function (e.g., `parseNewField()`) with safe type coercion
|
|
138
|
+
4. Add default value to `DEFAULTS` object
|
|
139
|
+
5. Add UI component in `components/settings/` (e.g., `NewFeatureTab.tsx`)
|
|
140
|
+
6. Wire up API route `/api/settings` to pass field through
|
|
141
|
+
|
|
142
|
+
**Example for RAG embeddings:**
|
|
143
|
+
```typescript
|
|
144
|
+
interface RagConfig {
|
|
145
|
+
enabled: boolean;
|
|
146
|
+
embeddingModel: string; // e.g., "text-embedding-3-small"
|
|
147
|
+
embeddingProvider: ProviderId; // e.g., "openai"
|
|
148
|
+
embeddingApiKey: string;
|
|
149
|
+
indexType: 'bm25' | 'hybrid' | 'semantic'; // BM25 vs embeddings
|
|
150
|
+
chunkSize: number;
|
|
151
|
+
chunkOverlap: number;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
interface ServerSettings {
|
|
155
|
+
// ... existing fields
|
|
156
|
+
rag?: RagConfig;
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 2. LLM API KEY MANAGEMENT
|
|
163
|
+
|
|
164
|
+
### 2.1 Provider Configuration Architecture
|
|
165
|
+
|
|
166
|
+
**File:** `lib/agent/providers.ts`
|
|
167
|
+
|
|
168
|
+
**Provider Types:**
|
|
169
|
+
- `ProviderId`: Union type of all supported providers
|
|
170
|
+
- Primary: `'anthropic'`, `'openai'`, `'google'`, `'groq'`
|
|
171
|
+
- Extended: `'xai'`, `'openrouter'`, `'mistral'`, `'deepseek'`, `'zai'`, `'kimi-coding'`, `'cerebras'`, `'ollama'`, etc.
|
|
172
|
+
|
|
173
|
+
**Unified Provider Entry:**
|
|
174
|
+
```typescript
|
|
175
|
+
interface Provider {
|
|
176
|
+
id: string; // "p_" + 8 random chars (e.g., "p_esc9eiuh")
|
|
177
|
+
name: string; // User-visible name (e.g., "My OpenAI")
|
|
178
|
+
protocol: ProviderId; // Which API protocol to use
|
|
179
|
+
apiKey: string; // Actual API key
|
|
180
|
+
model: string; // Model ID (e.g., "gpt-5.4")
|
|
181
|
+
baseUrl: string; // Custom endpoint URL (for self-hosted, proxies)
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Provider Presets (Metadata):**
|
|
186
|
+
```typescript
|
|
187
|
+
interface ProviderPreset {
|
|
188
|
+
id: ProviderId;
|
|
189
|
+
name: string; // e.g., "Anthropic"
|
|
190
|
+
nameZh: string; // Chinese name
|
|
191
|
+
shortLabel: string; // Capsule label (3-8 chars)
|
|
192
|
+
defaultModel: string;
|
|
193
|
+
fixedBaseUrl?: string; // For Ollama, DeepSeek (can't override)
|
|
194
|
+
apiKeyFallback?: string; // For Ollama (no auth needed)
|
|
195
|
+
supportsBaseUrl: boolean;
|
|
196
|
+
supportsThinking: boolean;
|
|
197
|
+
supportsListModels: boolean;
|
|
198
|
+
signupUrl?: string;
|
|
199
|
+
category: 'primary' | 'more';
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Constants:**
|
|
204
|
+
```typescript
|
|
205
|
+
PROVIDER_PRESETS[ProviderId] // Registry of all provider metadata
|
|
206
|
+
ALL_PROVIDER_IDS: ProviderId[] // All supported IDs
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 2.2 API Key Resolution Priority Chain
|
|
210
|
+
|
|
211
|
+
**Function:** `effectiveAiConfig(providerOverride?: string)` in `lib/settings.ts`
|
|
212
|
+
|
|
213
|
+
**Resolution order (highest to lowest priority):**
|
|
214
|
+
1. Saved config file (`config.json` → `ai.providers[]`)
|
|
215
|
+
2. Environment variable (e.g., `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`)
|
|
216
|
+
3. Preset default/fallback (e.g., Ollama has `apiKeyFallback`)
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
effectiveAiConfig(providerOverride?: string): {
|
|
220
|
+
provider: ProviderId;
|
|
221
|
+
apiKey: string;
|
|
222
|
+
model: string;
|
|
223
|
+
baseUrl: string;
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 2.3 Environment Variable Mapping
|
|
228
|
+
|
|
229
|
+
**Function:** `getApiKeyEnvVar(providerId: ProviderId)` in `lib/agent/providers.ts`
|
|
230
|
+
|
|
231
|
+
**Examples:**
|
|
232
|
+
- `anthropic` → `ANTHROPIC_API_KEY`
|
|
233
|
+
- `openai` → `OPENAI_API_KEY`
|
|
234
|
+
- `google` → `GOOGLE_API_KEY`
|
|
235
|
+
- `groq` → `GROQ_API_KEY`
|
|
236
|
+
- etc.
|
|
237
|
+
|
|
238
|
+
**Detection:** `GET /api/settings` response includes:
|
|
239
|
+
```typescript
|
|
240
|
+
envOverrides: Record<string, boolean> // Which env vars are set
|
|
241
|
+
envValues: Record<string, string> // Values (masked if set)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 2.4 Provider Validation & Parsing
|
|
245
|
+
|
|
246
|
+
**Function:** `parseProviders(raw: unknown): Provider[]` in `lib/custom-endpoints.ts`
|
|
247
|
+
|
|
248
|
+
**Validation:**
|
|
249
|
+
- ID must start with `"p_"`
|
|
250
|
+
- name must be non-empty string
|
|
251
|
+
- protocol must be valid `ProviderId`
|
|
252
|
+
- Filters invalid entries (silent skip)
|
|
253
|
+
|
|
254
|
+
**Usage in API:**
|
|
255
|
+
```typescript
|
|
256
|
+
// POST /api/settings calls parseProviders on incoming data
|
|
257
|
+
const resolvedAi = body.ai ? {
|
|
258
|
+
activeProvider: body.ai.activeProvider,
|
|
259
|
+
providers: parseProviders(body.ai.providers)
|
|
260
|
+
} : current.ai;
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### 2.5 Migration from Old Format
|
|
264
|
+
|
|
265
|
+
**Function:** `migrateProviders(parsed)` in `lib/custom-endpoints.ts`
|
|
266
|
+
|
|
267
|
+
**Old format:**
|
|
268
|
+
```json
|
|
269
|
+
{ "ai": {
|
|
270
|
+
"provider": "openai",
|
|
271
|
+
"providers": { "openai": {...}, "anthropic": {...} }
|
|
272
|
+
}}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**New format:**
|
|
276
|
+
```json
|
|
277
|
+
{ "ai": {
|
|
278
|
+
"activeProvider": "p_abc12345",
|
|
279
|
+
"providers": [
|
|
280
|
+
{"id": "p_abc12345", "protocol": "openai", ...},
|
|
281
|
+
{"id": "p_xyz98765", "protocol": "anthropic", ...}
|
|
282
|
+
]
|
|
283
|
+
}}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**Auto-migration:** `readSettings()` detects old format and auto-migrates on first read, then persists new format back to disk.
|
|
287
|
+
|
|
288
|
+
### 2.6 Extension Point: Adding a New Embedding Provider
|
|
289
|
+
|
|
290
|
+
**Steps:**
|
|
291
|
+
1. Add to `ProviderId` type in `lib/agent/providers.ts`
|
|
292
|
+
2. Add entry to `PROVIDER_PRESETS` with metadata
|
|
293
|
+
3. Add env var mapping in `getApiKeyEnvVar()`
|
|
294
|
+
4. If OpenAI-compatible, use `deepseek` pattern (override via `baseUrl`)
|
|
295
|
+
5. If new protocol, add support to pi-ai (upstream dependency)
|
|
296
|
+
|
|
297
|
+
**Example for local Ollama embedding service:**
|
|
298
|
+
```typescript
|
|
299
|
+
// lib/agent/providers.ts
|
|
300
|
+
export type ProviderId = ... | 'ollama-embed';
|
|
301
|
+
|
|
302
|
+
PROVIDER_PRESETS.ollama-embed = {
|
|
303
|
+
id: 'ollama-embed',
|
|
304
|
+
name: 'Ollama (Local)',
|
|
305
|
+
nameZh: 'Ollama (本地)',
|
|
306
|
+
shortLabel: 'Ollama',
|
|
307
|
+
defaultModel: 'nomic-embed-text',
|
|
308
|
+
fixedBaseUrl: 'http://localhost:11434/api/embed',
|
|
309
|
+
apiKeyFallback: 'dummy', // No auth
|
|
310
|
+
supportsBaseUrl: false,
|
|
311
|
+
supportsThinking: false,
|
|
312
|
+
supportsListModels: false,
|
|
313
|
+
category: 'more',
|
|
314
|
+
};
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## 3. SEARCH INFRASTRUCTURE
|
|
320
|
+
|
|
321
|
+
### 3.1 Current Search Architecture
|
|
322
|
+
|
|
323
|
+
**Two parallel systems:**
|
|
324
|
+
|
|
325
|
+
1. **Core Search (BM25)** - Backend, MCP/API focused
|
|
326
|
+
- File: `lib/core/search.ts`
|
|
327
|
+
- Scoring: BM25 (Best Matching 25) algorithm
|
|
328
|
+
- Used by: MCP tools, agent search, REST API
|
|
329
|
+
|
|
330
|
+
2. **App Search (Fuse.js)** - Frontend, UI-focused
|
|
331
|
+
- File: `lib/fs.ts` → `searchFiles(query: string)`
|
|
332
|
+
- Scoring: Fuzzy matching
|
|
333
|
+
- Used by: ⌘K search overlay in UI
|
|
334
|
+
|
|
335
|
+
### 3.2 Core Search (BM25)
|
|
336
|
+
|
|
337
|
+
**File:** `lib/core/search.ts`
|
|
338
|
+
|
|
339
|
+
**API:**
|
|
340
|
+
```typescript
|
|
341
|
+
searchFiles(
|
|
342
|
+
mindRoot: string,
|
|
343
|
+
query: string,
|
|
344
|
+
opts?: SearchOptions
|
|
345
|
+
): SearchResult[]
|
|
346
|
+
|
|
347
|
+
interface SearchOptions {
|
|
348
|
+
limit?: number; // default 20
|
|
349
|
+
scope?: string; // directory prefix filter
|
|
350
|
+
file_type?: 'md' | 'csv' | 'all';
|
|
351
|
+
modified_after?: string; // ISO date filter
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
interface SearchResult {
|
|
355
|
+
path: string;
|
|
356
|
+
snippet: string;
|
|
357
|
+
score: number;
|
|
358
|
+
occurrences: number;
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**BM25 Parameters:**
|
|
363
|
+
```typescript
|
|
364
|
+
const BM25_K1 = 1.2; // Term frequency saturation
|
|
365
|
+
const BM25_B = 0.75; // Document length normalization
|
|
366
|
+
|
|
367
|
+
function bm25Score(
|
|
368
|
+
tf: number, // term frequency in doc
|
|
369
|
+
df: number, // document frequency
|
|
370
|
+
docLength: number,
|
|
371
|
+
avgDocLength: number,
|
|
372
|
+
totalDocs: number
|
|
373
|
+
): number
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**Features:**
|
|
377
|
+
- Multi-term queries (terms scored independently, summed)
|
|
378
|
+
- CJK support (word boundaries vs. substring matching)
|
|
379
|
+
- Latin term word boundaries (prevents partial matches)
|
|
380
|
+
- Snippet extraction around first match
|
|
381
|
+
|
|
382
|
+
### 3.3 Search Index (Inverted Index)
|
|
383
|
+
|
|
384
|
+
**File:** `lib/core/search-index.ts`
|
|
385
|
+
|
|
386
|
+
**Class:** `SearchIndex`
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
class SearchIndex {
|
|
390
|
+
rebuild(mindRoot: string): void
|
|
391
|
+
// Full rebuild: read all files, tokenize, invert
|
|
392
|
+
|
|
393
|
+
load(mindosDir, mindRoot): boolean
|
|
394
|
+
// Load from disk (~/.mindos/search-index.json)
|
|
395
|
+
// Returns false if stale/corrupt
|
|
396
|
+
|
|
397
|
+
persist(mindosDir: string): void
|
|
398
|
+
// Serialize to JSON for next cold start
|
|
399
|
+
|
|
400
|
+
// Incremental updates (O(tokens) instead of O(all-files))
|
|
401
|
+
addFile(mindRoot, filePath): void
|
|
402
|
+
updateFile(mindRoot, filePath): void
|
|
403
|
+
removeFile(filePath): void
|
|
404
|
+
|
|
405
|
+
// Query interface
|
|
406
|
+
getCandidatesUnion(query): string[] | null
|
|
407
|
+
// UNION semantics: any file matching any token
|
|
408
|
+
|
|
409
|
+
getCandidates(query): string[] | null
|
|
410
|
+
// INTERSECTION semantics: files matching all tokens
|
|
411
|
+
|
|
412
|
+
getFileCount(): number
|
|
413
|
+
getAvgDocLength(): number
|
|
414
|
+
getDocLength(filePath): number
|
|
415
|
+
getDocFrequency(token): number
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Persistence:**
|
|
420
|
+
- Stored at: `~/.mindos/search-index.json`
|
|
421
|
+
- Format: Serialized inverted index + BM25 stats
|
|
422
|
+
- Staleness detection: file count, mtime sampling
|
|
423
|
+
- Auto-rebuild on staleness
|
|
424
|
+
|
|
425
|
+
**Tokenization:**
|
|
426
|
+
```typescript
|
|
427
|
+
function tokenize(text: string): Set<string>
|
|
428
|
+
// Latin: split on non-alphanumeric, min 2 chars
|
|
429
|
+
// CJK: Intl.Segmenter word boundaries (or bigrams if unavailable)
|
|
430
|
+
// Combined: both strategies applied
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### 3.4 Search Index Lifecycle & Caching
|
|
434
|
+
|
|
435
|
+
**File:** `lib/fs.ts` (app layer)
|
|
436
|
+
|
|
437
|
+
**Module-level singleton:**
|
|
438
|
+
```typescript
|
|
439
|
+
// Private module state
|
|
440
|
+
let _cache: FileTreeCache | null = null;
|
|
441
|
+
let _searchIndex: SearchIndexState | null = null;
|
|
442
|
+
let _treeVersion = 0;
|
|
443
|
+
|
|
444
|
+
// Called after file mutations
|
|
445
|
+
invalidateCache(): void // Full invalidate
|
|
446
|
+
invalidateCacheForFile(filePath): void // Incremental
|
|
447
|
+
invalidateCacheForNewFile(filePath): void
|
|
448
|
+
invalidateCacheForDeletedFile(filePath): void
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
**Invalidation triggers:**
|
|
452
|
+
- Write/edit file → `updateSearchIndexFile()`
|
|
453
|
+
- Create file → `addSearchIndexFile()`
|
|
454
|
+
- Delete file → `removeSearchIndexFile()`
|
|
455
|
+
- Rename/move/delete dir → Full invalidate
|
|
456
|
+
|
|
457
|
+
**Persistence:**
|
|
458
|
+
- Debounced persist: 5s after last write operation
|
|
459
|
+
- Process exit hooks: flush immediately (SIGTERM, SIGINT, beforeExit)
|
|
460
|
+
|
|
461
|
+
### 3.5 App-Level Search (Fuse.js)
|
|
462
|
+
|
|
463
|
+
**File:** `lib/fs.ts`
|
|
464
|
+
|
|
465
|
+
```typescript
|
|
466
|
+
export function searchFiles(query: string): AppSearchResult[]
|
|
467
|
+
// Fuzzy search via Fuse.js, limit 20
|
|
468
|
+
|
|
469
|
+
interface AppSearchResult {
|
|
470
|
+
path: string;
|
|
471
|
+
snippet: string;
|
|
472
|
+
score: number; // 1 - fuse.score
|
|
473
|
+
matches?: Array<{
|
|
474
|
+
indices: [number, number][];
|
|
475
|
+
value: string;
|
|
476
|
+
key: string;
|
|
477
|
+
}>;
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
**Index building:**
|
|
482
|
+
- Lazy: built on first search
|
|
483
|
+
- TTL: 30s expiration
|
|
484
|
+
- Watches mindRoot for changes (immediate invalidation)
|
|
485
|
+
|
|
486
|
+
**Search queries:**
|
|
487
|
+
- Fuse.js fuzzy matching (no BM25)
|
|
488
|
+
- CJK support via same tokenization
|
|
489
|
+
|
|
490
|
+
### 3.6 API Search Route
|
|
491
|
+
|
|
492
|
+
**File:** `app/api/search/route.ts`
|
|
493
|
+
|
|
494
|
+
```typescript
|
|
495
|
+
GET /api/search?q=query_string
|
|
496
|
+
|
|
497
|
+
// Response: SearchResult[]
|
|
498
|
+
[
|
|
499
|
+
{
|
|
500
|
+
path: "Space/file.md",
|
|
501
|
+
snippet: "...context around match...",
|
|
502
|
+
score: 42.3,
|
|
503
|
+
occurrences: 5
|
|
504
|
+
}
|
|
505
|
+
]
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
**Implementation:**
|
|
509
|
+
```typescript
|
|
510
|
+
export async function GET(request: NextRequest) {
|
|
511
|
+
const q = request.nextUrl.searchParams.get('q') || '';
|
|
512
|
+
if (!q.trim()) return [];
|
|
513
|
+
|
|
514
|
+
const results = searchFiles(q);
|
|
515
|
+
return NextResponse.json(results);
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
### 3.7 Search Result Types
|
|
520
|
+
|
|
521
|
+
**File:** `lib/core/types.ts`
|
|
522
|
+
|
|
523
|
+
```typescript
|
|
524
|
+
export interface SearchResult {
|
|
525
|
+
path: string;
|
|
526
|
+
snippet: string;
|
|
527
|
+
score: number;
|
|
528
|
+
occurrences: number;
|
|
529
|
+
}
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### 3.8 PDF Support
|
|
533
|
+
|
|
534
|
+
**Current:**
|
|
535
|
+
- `searchFiles()` reads PDF text via `extractPdfText()`
|
|
536
|
+
- Uses pdfjs-dist for text extraction
|
|
537
|
+
- Included in BM25 search automatically
|
|
538
|
+
|
|
539
|
+
**Limits:**
|
|
540
|
+
- MAX_CONTENT_LENGTH = 50,000 chars per file
|
|
541
|
+
- Larger documents truncated for index
|
|
542
|
+
|
|
543
|
+
### 3.9 Extension Point: Adding Embedding-Based RAG
|
|
544
|
+
|
|
545
|
+
**Integration patterns:**
|
|
546
|
+
|
|
547
|
+
1. **Dual-search model:**
|
|
548
|
+
- Keep BM25 for full-text (fast, no AI needed)
|
|
549
|
+
- Add semantic search via embeddings (slower, uses LLM)
|
|
550
|
+
- Optionally combine results (hybrid search)
|
|
551
|
+
|
|
552
|
+
2. **New module structure:**
|
|
553
|
+
```
|
|
554
|
+
lib/core/
|
|
555
|
+
├── search.ts (existing BM25)
|
|
556
|
+
├── search-index.ts (existing inverted index)
|
|
557
|
+
├── embedding-index.ts (NEW: vector store)
|
|
558
|
+
├── embedding-client.ts (NEW: embedding API calls)
|
|
559
|
+
└── rag-search.ts (NEW: unified search interface)
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
3. **Configuration flow:**
|
|
563
|
+
```
|
|
564
|
+
~/.mindos/config.json
|
|
565
|
+
└── rag?: {
|
|
566
|
+
enabled: boolean,
|
|
567
|
+
embeddingModel: string,
|
|
568
|
+
embeddingProvider: ProviderId,
|
|
569
|
+
embeddingApiKey: string,
|
|
570
|
+
indexType: 'bm25' | 'hybrid' | 'semantic'
|
|
571
|
+
}
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
4. **Index persistence:**
|
|
575
|
+
- Store embeddings at `~/.mindos/embedding-index.json`
|
|
576
|
+
- Include version, model name, file metadata
|
|
577
|
+
- Invalidate on:
|
|
578
|
+
- File changes
|
|
579
|
+
- Model/provider change
|
|
580
|
+
- Config modification
|
|
581
|
+
|
|
582
|
+
5. **API extension:**
|
|
583
|
+
```
|
|
584
|
+
POST /api/search (existing, BM25 only)
|
|
585
|
+
POST /api/search/semantic
|
|
586
|
+
GET /api/search?type=hybrid (combined BM25 + semantic)
|
|
587
|
+
POST /api/settings/embedding-models (list available)
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
---
|
|
591
|
+
|
|
592
|
+
## 4. PACKAGE ECOSYSTEM
|
|
593
|
+
|
|
594
|
+
**File:** `package.json`
|
|
595
|
+
|
|
596
|
+
**Relevant dependencies:**
|
|
597
|
+
- `fuse.js@^7.1.0` - Fuzzy search (frontend)
|
|
598
|
+
- `pdfjs-dist@^4.10.38` - PDF text extraction
|
|
599
|
+
- `@mariozechner/pi-ai@^0.60.0` - LLM provider abstraction
|
|
600
|
+
- `zod@^3.23.8` - Schema validation
|
|
601
|
+
- `zustand@^5.0.12` - State management
|
|
602
|
+
|
|
603
|
+
**NO existing embedding/ML dependencies:**
|
|
604
|
+
- No `openai` SDK (would be needed for embeddings)
|
|
605
|
+
- No `transformers`, `onnx`, or `llm.js`
|
|
606
|
+
- No vector database (Pinecone, Qdrant, Weaviate, etc.)
|
|
607
|
+
|
|
608
|
+
**For embedding RAG, consider adding:**
|
|
609
|
+
- `@openai/embeddings` (OpenAI embeddings)
|
|
610
|
+
- `vectorstore-lite` or `sqlite-vss` (lightweight local vector store)
|
|
611
|
+
- Or: keep in-memory during session, JSON persistence
|
|
612
|
+
|
|
613
|
+
---
|
|
614
|
+
|
|
615
|
+
## 5. FEATURE ORGANIZATION PATTERNS
|
|
616
|
+
|
|
617
|
+
### 5.1 Optional Feature Example: Web Search
|
|
618
|
+
|
|
619
|
+
**Location:** `lib/agent/web-search.ts`
|
|
620
|
+
|
|
621
|
+
**Pattern:**
|
|
622
|
+
- Standalone module (not integrated by default)
|
|
623
|
+
- Called explicitly by agent when needed
|
|
624
|
+
- No settings UI (always available if agent uses it)
|
|
625
|
+
- No API key management (free, no auth)
|
|
626
|
+
|
|
627
|
+
**Structure:**
|
|
628
|
+
```
|
|
629
|
+
lib/agent/
|
|
630
|
+
├── web-search.ts (implementation)
|
|
631
|
+
├── providers.ts (provider metadata)
|
|
632
|
+
└── index.ts (exports)
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
### 5.2 Optional Settings Feature
|
|
636
|
+
|
|
637
|
+
**Pattern:**
|
|
638
|
+
1. Add `NewConfig` interface to `ServerSettings` (optional field)
|
|
639
|
+
2. Add parsing function (safe type coercion)
|
|
640
|
+
3. Add defaults to `DEFAULTS` object
|
|
641
|
+
4. Add UI tab in `components/settings/NewTab.tsx`
|
|
642
|
+
5. Wire up API route POST handler
|
|
643
|
+
6. Add validation tests
|
|
644
|
+
|
|
645
|
+
**Example: Knowledge Tab** (existing)
|
|
646
|
+
- File: `components/settings/KnowledgeTab.tsx`
|
|
647
|
+
- Settings: Git sync config, auto-pull interval, etc.
|
|
648
|
+
- API: Handles in `POST /api/settings`
|
|
649
|
+
|
|
650
|
+
### 5.3 Recommended RAG Feature Structure
|
|
651
|
+
|
|
652
|
+
```
|
|
653
|
+
lib/
|
|
654
|
+
├── core/
|
|
655
|
+
│ ├── search.ts (existing BM25)
|
|
656
|
+
│ ├── search-index.ts (existing inverted index)
|
|
657
|
+
│ ├── embedding-index.ts (NEW)
|
|
658
|
+
│ └── embedding-client.ts (NEW)
|
|
659
|
+
├── rag/
|
|
660
|
+
│ ├── config.ts (RAG config helpers)
|
|
661
|
+
│ ├── index-manager.ts (rebuild, persist, load)
|
|
662
|
+
│ └── search.ts (unified search API)
|
|
663
|
+
└── agent/
|
|
664
|
+
└── embedding-provider.ts (NEW provider abstraction)
|
|
665
|
+
|
|
666
|
+
components/settings/
|
|
667
|
+
├── RagTab.tsx (NEW)
|
|
668
|
+
├── RagEmbeddingSelect.tsx (NEW component)
|
|
669
|
+
└── RagIndexStatus.tsx (NEW component)
|
|
670
|
+
|
|
671
|
+
app/api/
|
|
672
|
+
├── rag/
|
|
673
|
+
│ ├── rebuild/route.ts (POST to rebuild index)
|
|
674
|
+
│ ├── status/route.ts (GET index stats)
|
|
675
|
+
│ └── search/route.ts (POST semantic search)
|
|
676
|
+
└── search/
|
|
677
|
+
└── route.ts (existing, add ?type=hybrid param)
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
---
|
|
681
|
+
|
|
682
|
+
## 6. KEY FILES SUMMARY
|
|
683
|
+
|
|
684
|
+
| File | Purpose | Key Exports |
|
|
685
|
+
|------|---------|-------------|
|
|
686
|
+
| `lib/settings.ts` | Core settings I/O | `readSettings()`, `writeSettings()`, `ServerSettings` interface |
|
|
687
|
+
| `lib/custom-endpoints.ts` | Provider unified interface | `Provider`, `parseProviders()`, `migrateProviders()` |
|
|
688
|
+
| `lib/agent/providers.ts` | Provider metadata & env vars | `PROVIDER_PRESETS`, `getApiKeyEnvVar()`, `ProviderId` type |
|
|
689
|
+
| `lib/core/search.ts` | BM25 search | `searchFiles()`, `bm25Score()` |
|
|
690
|
+
| `lib/core/search-index.ts` | Inverted index | `SearchIndex` class, persistence |
|
|
691
|
+
| `lib/fs.ts` | App-level search & caching | `searchFiles()`, cache invalidation |
|
|
692
|
+
| `app/api/settings/route.ts` | Settings REST API | GET/POST handlers |
|
|
693
|
+
| `app/api/search/route.ts` | Search REST API | GET handler, BM25 results |
|
|
694
|
+
| `components/settings/AiTab.tsx` | Provider UI | Provider selection, key input, test button |
|
|
695
|
+
|
|
696
|
+
---
|
|
697
|
+
|
|
698
|
+
## 7. IMPORTANT DESIGN DECISIONS
|
|
699
|
+
|
|
700
|
+
1. **Unified Provider Model**: All LLM providers use same `Provider` interface, making it easy to add new ones.
|
|
701
|
+
|
|
702
|
+
2. **Atomic File Writes**: Settings use temp file + rename to prevent corruption on crash.
|
|
703
|
+
|
|
704
|
+
3. **Lazy Index Building**: Search index built on first search, not at startup.
|
|
705
|
+
|
|
706
|
+
4. **Incremental Updates**: File mutations update search index O(tokens) instead of full rebuild.
|
|
707
|
+
|
|
708
|
+
5. **Multi-Engine Web Search**: No API keys needed (free HTML scraping with fallback chain).
|
|
709
|
+
|
|
710
|
+
6. **CJK Support**: Proper word segmentation with fallback to bigrams.
|
|
711
|
+
|
|
712
|
+
7. **Auto-Migration**: Old config formats auto-detected and migrated transparently.
|
|
713
|
+
|
|
714
|
+
8. **Environment Variable Priority**: Settings can be overridden by env vars for CI/deployment.
|
|
715
|
+
|
|
716
|
+
---
|
|
717
|
+
|
|
718
|
+
## 8. EXTENSION CHECKLIST FOR EMBEDDING RAG
|
|
719
|
+
|
|
720
|
+
- [ ] Add `rag?: RagConfig` to `ServerSettings` interface
|
|
721
|
+
- [ ] Add RAG parsing function in `lib/settings.ts`
|
|
722
|
+
- [ ] Add `RagTab.tsx` UI component in `components/settings/`
|
|
723
|
+
- [ ] Add `EmbeddingClient` abstraction in `lib/rag/`
|
|
724
|
+
- [ ] Create `EmbeddingIndex` class for vector storage
|
|
725
|
+
- [ ] Add API routes for RAG operations
|
|
726
|
+
- [ ] Implement hybrid search combining BM25 + semantic
|
|
727
|
+
- [ ] Add index persistence at `~/.mindos/embedding-index.json`
|
|
728
|
+
- [ ] Add staleness detection (model name, provider, file changes)
|
|
729
|
+
- [ ] Add env var support: `RAG_EMBEDDING_PROVIDER`, `RAG_EMBEDDING_API_KEY`
|
|
730
|
+
- [ ] Wire up settings validation tests
|
|
731
|
+
- [ ] Add migration logic for future config format changes
|
|
732
|
+
|