autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
149 lines (148 loc) • 4.01 kB
TypeScript
/**
* EvidenceCollector.js — 从 Analyst 工具调用中收集结构化证据
*
* Bootstrap 质量门控核心组件: 将 Analyst 阶段的 toolCall 序列转化为
* 类型化的证据地图、探索日志和负空间信号,供 Producer 阶段直接引用。
*
* 被 bootstrap-gate.js (buildAnalysisArtifact) 调用。
*
* 设计原则:
* - 不保留原始工具返回值 (体积过大)
* - 按工具类型萃取关键信息 (代码片段、搜索命中、类结构)
* - 记录负空间: 搜索但未找到的模式 → 告知 Producer "这不存在"
* - 预算控制: 代码片段总量 ≤ 32KB (Layer 2 Detail)
*
* @module EvidenceCollector
*/
/** 代码片段 */
export interface CodeSnippet {
startLine: number;
endLine: number;
content: string;
analystNote?: string;
}
/** 文件证据条目 */
export interface EvidenceEntry {
filePath: string;
codeSnippets: CodeSnippet[];
summary: string;
role?: string;
}
/** 探索日志条目 */
export interface ExplorationEntry {
round: number;
tool: string;
intent: string;
resultSummary: string;
effective: boolean;
}
/** 负空间信号 */
export interface NegativeSignal {
searchPattern: string;
result: 'not_found' | 'empty' | 'irrelevant';
implication: string;
}
/** 收集结果 */
export interface EvidenceCollectorResult {
evidenceMap: Map<string, EvidenceEntry>;
explorationLog: ExplorationEntry[];
negativeSignals: NegativeSignal[];
}
/** 工具调用参数 */
interface ToolCallArgs {
filePath?: string;
filePaths?: string[];
startLine?: number;
pattern?: string;
patterns?: string[];
query?: string;
className?: string;
protocolName?: string;
directory?: string;
path?: string;
rootClass?: string;
methodName?: string;
finding?: string;
dimensionId?: string;
[key: string]: unknown;
}
/** 工具调用 */
export interface ToolCall {
tool?: string;
name?: string;
params?: ToolCallArgs;
args?: ToolCallArgs;
result?: ToolResult;
}
/** 搜索匹配条目 */
interface SearchMatch {
file?: string;
line?: number;
context?: string;
}
/** EvidenceCollector 选项 */
interface EvidenceCollectorOptions {
snippetBudget?: number;
}
/** 工具结果对象 (所有可能的结果属性联合) */
interface ToolResultObject {
files?: Array<{
path?: string;
filePath?: string;
content?: string;
startLine?: number;
}>;
path?: string;
filePath?: string;
content?: string;
startLine?: number;
matches?: SearchMatch[];
batchResults?: Record<string, {
matches?: SearchMatch[];
}>;
className?: string;
superClass?: string;
protocols?: string[];
methods?: Array<string | {
name?: string;
selector?: string;
}>;
properties?: unknown[];
protocolName?: string;
conformers?: string[];
summary?: string;
entries?: unknown[];
children?: unknown[];
classes?: unknown[];
hierarchy?: unknown[];
[key: string]: unknown;
}
/** 工具结果类型 */
type ToolResult = string | ToolResultObject | null | undefined;
export declare class EvidenceCollector {
#private;
/** @param [options.snippetBudget=32000] 代码片段总字符预算 */
constructor(options?: EvidenceCollectorOptions);
/**
* 处理单个工具调用,提取证据
*
* @param toolCall { tool/name, params/args, result }
* @param [round=0] 调用序号
*/
processToolCall(toolCall: ToolCall, round?: number): void;
/**
* 构建收集结果
*
* @returns {{
* evidenceMap: Map<string, EvidenceEntry>,
* explorationLog: ExplorationEntry[],
* negativeSignals: NegativeSignal[]
* }}
*/
build(): {
evidenceMap: Map<string, EvidenceEntry>;
explorationLog: ExplorationEntry[];
negativeSignals: NegativeSignal[];
};
}
export default EvidenceCollector;