autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
214 lines (213 loc) • 6.28 kB
TypeScript
/**
* MCP Handlers — 搜索类
*
* v2: 合并原 4 个搜索函数(search / contextSearch / keywordSearch / semanticSearch)
* 为统一 search() 入口,通过 mode 参数路由。
* consolidated.ts 的 mode 路由直接指向本函数。
*
* 设计原则:
* 1. 通过 container.get('searchEngine') 获取 singleton 实例(含 vectorStore + aiProvider)
* 2. 统一 responseTime、byKind 分组、kind 过滤
* 3. 投影使用 SearchTypes.slimSearchResult()(消除 3 处重复投影)
*/
import { type SlimSearchResult } from '#service/search/SearchTypes.js';
import type { McpContext, SearchArgs, SearchResultItem } from './types.js';
/**
* 统一搜索入口 — 支持 auto / keyword / weighted / semantic / context 五种模式
*
* 合并了原 search / contextSearch / keywordSearch / semanticSearch 4 个函数。
* mode 路由:
* - auto (默认): FieldWeighted + semantic 融合 + Ranking Pipeline
* - keyword: SQL LIKE 精确匹配,适合已知函数名/类名
* - weighted: 加权字段评分搜索(原 bm25 模式,已替换为 FieldWeightedScorer)
* - bm25: weighted 的向后兼容别名
* - semantic: 向量语义搜索(不可用时降级 weighted)
* - context: weighted + Ranking Pipeline + 会话上下文加成
*
* 所有模式共享: kind 过滤 → slimSearchResult 投影 → byKind 分组
*/
export declare function search(ctx: McpContext, args: SearchArgs): Promise<{
success: boolean;
errorCode: string | null;
message: string;
data: {
metadata?: {
responseTimeMs: number;
totalResults: any;
kindCounts: {
rule: number;
pattern: number;
fact: number;
};
} | undefined;
degraded?: boolean | undefined;
degradedReason?: string | undefined;
query: string;
mode: any;
kind: string | undefined;
totalResults: any;
items: any;
byKind: {
rule: {
kind?: string;
}[];
pattern: {
kind?: string;
}[];
fact: {
kind?: string;
}[];
};
kindCounts: {
rule: number;
pattern: number;
fact: number;
};
} | null;
meta: {
source?: string | undefined;
responseTimeMs?: number | undefined;
version: string;
tool?: string | undefined;
};
}>;
/** contextSearch — mode='context' 的别名 */
export declare function contextSearch(ctx: McpContext, args: SearchArgs): Promise<{
success: boolean;
errorCode: string | null;
message: string;
data: {
metadata?: {
responseTimeMs: number;
totalResults: any;
kindCounts: {
rule: number;
pattern: number;
fact: number;
};
} | undefined;
degraded?: boolean | undefined;
degradedReason?: string | undefined;
query: string;
mode: any;
kind: string | undefined;
totalResults: any;
items: any;
byKind: {
rule: {
kind?: string;
}[];
pattern: {
kind?: string;
}[];
fact: {
kind?: string;
}[];
};
kindCounts: {
rule: number;
pattern: number;
fact: number;
};
} | null;
meta: {
source?: string | undefined;
responseTimeMs?: number | undefined;
version: string;
tool?: string | undefined;
};
}>;
/** keywordSearch — mode='keyword' 的别名 */
export declare function keywordSearch(ctx: McpContext, args: SearchArgs): Promise<{
success: boolean;
errorCode: string | null;
message: string;
data: {
metadata?: {
responseTimeMs: number;
totalResults: any;
kindCounts: {
rule: number;
pattern: number;
fact: number;
};
} | undefined;
degraded?: boolean | undefined;
degradedReason?: string | undefined;
query: string;
mode: any;
kind: string | undefined;
totalResults: any;
items: any;
byKind: {
rule: {
kind?: string;
}[];
pattern: {
kind?: string;
}[];
fact: {
kind?: string;
}[];
};
kindCounts: {
rule: number;
pattern: number;
fact: number;
};
} | null;
meta: {
source?: string | undefined;
responseTimeMs?: number | undefined;
version: string;
tool?: string | undefined;
};
}>;
/** semanticSearch — mode='semantic' 的别名 */
export declare function semanticSearch(ctx: McpContext, args: SearchArgs): Promise<{
success: boolean;
errorCode: string | null;
message: string;
data: {
metadata?: {
responseTimeMs: number;
totalResults: any;
kindCounts: {
rule: number;
pattern: number;
fact: number;
};
} | undefined;
degraded?: boolean | undefined;
degradedReason?: string | undefined;
query: string;
mode: any;
kind: string | undefined;
totalResults: any;
items: any;
byKind: {
rule: {
kind?: string;
}[];
pattern: {
kind?: string;
}[];
fact: {
kind?: string;
}[];
};
kindCounts: {
rule: number;
pattern: number;
fact: number;
};
} | null;
meta: {
source?: string | undefined;
responseTimeMs?: number | undefined;
version: string;
tool?: string | undefined;
};
}>;
/** @deprecated Use `slimSearchResult` from `SearchTypes.ts` instead */
export declare function _slimSearchItem(item: SearchResultItem): SlimSearchResult;