Context
When the user has an embedding provider configured (Roo's CodeIndexManager already wires Ollama / OpenAI-compatible / Anthropic), we get better recall than BM25 — especially for paraphrased queries. We piggyback on the existing config so users don't have to set it up twice.
Foundational; depends on W1.1 being merged so the Ranker interface exists.
Developer Notes
- New
src/services/tools/EmbeddingsRanker.ts implementing the same Ranker interface from W1.1.
- Reuse the embedding provider exposed by
CodeIndexManager (likely needs a thin facade exporting embedText(text: string) → Promise<number[]>).
- Maintain an in-memory
Map<toolKey, vector> cache. Invalidate on MCP server config change (W1.3 owns the invalidation hook; this ticket just respects it).
- Cosine similarity for ranking. Top-K by score.
- Auto-selection: in the
Ranker factory, prefer EmbeddingsRanker if CodeIndexManager.hasEmbeddingProvider() returns true; fall back to Bm25Ranker if not, or if any embedding call throws.
- Files:
src/services/tools/EmbeddingsRanker.ts, src/services/tools/index.ts (factory).
- Validation: unit test with mock embedding provider returning known vectors — verify cosine ranking. Integration test: trigger embedding error → factory returns BM25 result instead, no user-visible failure.
Context
When the user has an embedding provider configured (Roo's
CodeIndexManageralready wires Ollama / OpenAI-compatible / Anthropic), we get better recall than BM25 — especially for paraphrased queries. We piggyback on the existing config so users don't have to set it up twice.Foundational; depends on W1.1 being merged so the
Rankerinterface exists.Developer Notes
src/services/tools/EmbeddingsRanker.tsimplementing the sameRankerinterface from W1.1.CodeIndexManager(likely needs a thin facade exportingembedText(text: string) → Promise<number[]>).Map<toolKey, vector>cache. Invalidate on MCP server config change (W1.3 owns the invalidation hook; this ticket just respects it).Rankerfactory, preferEmbeddingsRankerifCodeIndexManager.hasEmbeddingProvider()returns true; fall back toBm25Rankerif not, or if any embedding call throws.src/services/tools/EmbeddingsRanker.ts,src/services/tools/index.ts(factory).