diff --git a/src/resources/extensions/sf/code-intelligence.js b/src/resources/extensions/sf/code-intelligence.js index 7f25911b7..4ac1e3587 100644 --- a/src/resources/extensions/sf/code-intelligence.js +++ b/src/resources/extensions/sf/code-intelligence.js @@ -554,6 +554,11 @@ export function ensureSiftIndexWarmup(projectRoot, prefs, options = {}) { }; } const scope = resolveSiftSearchScope(projectRoot, options.scope ?? "."); + // ── Vector retriever hang workaround ───────────────────────────────────── + // When the embedding model (sentence-transformers/all-MiniLM-L6-v2) hangs + // during inference, page-index-hybrid with vector retriever stalls forever. + // Restrict retrievers to bm25+phrase and disable ML reranking so warmup + // completes without the vector path (#vector-hang-fix). const siftArgs = [ "search", "--json", @@ -565,6 +570,10 @@ export function ensureSiftIndexWarmup(projectRoot, prefs, options = {}) { String( options.retrieverTimeoutMs ?? DEFAULT_SIFT_WARMUP_RETRIEVER_TIMEOUT_MS, ), + "--retrievers", + "bm25,phrase", + "--reranking", + "none", scope, options.query ?? DEFAULT_SIFT_WARMUP_QUERY, ]; diff --git a/src/resources/extensions/sf/tools/sift-search-tool.js b/src/resources/extensions/sf/tools/sift-search-tool.js index f4f541620..86851d5e5 100644 --- a/src/resources/extensions/sf/tools/sift-search-tool.js +++ b/src/resources/extensions/sf/tools/sift-search-tool.js @@ -54,6 +54,15 @@ function buildSiftArgs(params, projectRoot = process.cwd()) { String(params.retrieverTimeoutMs ?? DEFAULT_RETRIEVER_TIMEOUT_MS), ]; + // Allow callers to restrict retrievers (e.g. bm25,phrase) when the + // vector retriever or ML reranking is hanging (#vector-hang-fix). + if (params.retrievers) { + args.push("--retrievers", String(params.retrievers)); + } + if (params.reranking) { + args.push("--reranking", String(params.reranking)); + } + if (params.agent === true) { args.push("--agent"); if (params.agentMode) {