autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
174 lines (173 loc) • 6.23 kB
TypeScript
/**
* ExternalSubmissionTracker — 外部 Agent 提交追踪与质量评估
*
* 质量门控的外部 Agent 对应模块。
* 内部 Agent 使用 EvidenceCollector 从 toolCall 中收集证据 (bootstrap-gate.js),
* 外部 Agent 使用 ExternalSubmissionTracker 从 submit_knowledge 调用中积累证据。
*
* 职责:
* - 追踪每个维度的 submit_knowledge 提交 (recipe 元数据 + 引用文件)
* - 从提交内容构建 evidenceMap (filePath → 引用摘要)
* - 从 dimension_complete 的 analysisText 提取负空间信号
* - 计算维度级质量评分 (对应 bootstrap-gate.js 的 buildQualityScores)
* - 为下游维度提供结构化跨维度证据
*
* 设计对应关系:
* 内部 Agent 外部 Agent
* ───────────────── ─────────────────
* EvidenceCollector.processToolCall → recordSubmission
* evidenceMap (代码片段) → evidenceMap (提交引用)
* negativeSignals (搜索未命中) → negativeSignals (analysisText 提取)
* buildQualityScores (4维评分) → buildQualityReport (4维评分)
* explorationLog (工具序列) → submissionLog (提交序列)
*
* @module bootstrap/ExternalSubmissionTracker
*/
/** 一次 submit_knowledge 的提交记录 */
interface SubmissionRecord {
recipeId: string;
title: string;
knowledgeType: string;
kind: string;
category: string;
sources: string[];
coreCodePreview: string;
contentLength: number;
confidence: number;
submittedAt: number;
}
/** 负空间信号 */
interface NegativeSignal {
pattern: string;
source: string;
dimId?: string;
}
/** submit_knowledge 原始参数中需要的字段 */
interface SubmissionArgs {
title?: string;
knowledgeType?: string;
kind?: string;
category?: string;
trigger?: string;
coreCode?: string;
content?: {
markdown?: string;
[key: string]: unknown;
};
reasoning?: {
sources?: string[];
confidence?: number;
[key: string]: unknown;
};
[key: string]: unknown;
}
/** 质量评分 4 维度 */
interface QualityScores {
coverageScore: number;
evidenceScore: number;
diversityScore: number;
coherenceScore: number;
}
/** 维度级质量报告 */
export interface DimensionQualityReport {
scores: QualityScores;
totalScore: number;
suggestions: string[];
pass: boolean;
}
/** 跨维度文件共享信息 */
interface SharedFileInfo {
filePath: string;
dimensions: string[];
}
/** 已完成维度摘要(供跨维度证据使用) */
interface CompletedDimSummary {
dimId: string;
submissionCount: number;
titles: string[];
knowledgeTypes: string[];
referencedFiles: string[];
}
/** getAccumulatedEvidence 返回值 */
export interface AccumulatedEvidence {
completedDimSummaries: CompletedDimSummary[];
sharedFiles: SharedFileInfo[];
negativeSignals: NegativeSignal[];
usedTriggers: string[];
}
export declare class ExternalSubmissionTracker {
#private;
/**
* 记录一次成功的 submit_knowledge 提交
*
* @param dimId 当前活跃维度 (由调用方根据 session 进度推断)
* @param submissionArgs submit_knowledge 的原始参数
* @param recipeId 提交成功后返回的 recipe ID
*/
recordSubmission(dimId: string, submissionArgs: SubmissionArgs, recipeId: string): void;
/**
* 记录被拒绝的提交 (RecipeReadiness 或 dedup 拒绝)
*
* @param title 被拒绝候选的标题
* @param reason 拒绝原因
*/
recordRejection(dimId: string, title: string, reason: string): void;
/**
* 从 dimension_complete 的 analysisText 中提取负空间信号
*
* 识别模式:
* - "未找到..." / "不存在..." / "没有发现..."
* - "Not found" / "No evidence of" / "does not use"
* - "项目未使用..." / "没有使用..."
*/
extractNegativeSignals(analysisText: string, dimId: string): void;
/**
* 计算维度级质量报告
*
* 4 维度评分 (各 0-100, 加权总分):
* coverageScore (30%) — 提交数量 + 引用文件覆盖
* evidenceScore (30%) — 提交内容丰富度 (长度 + coreCode + confidence)
* diversityScore (20%) — 知识类型 + category 多样性
* coherenceScore (20%) — analysisText 结构化程度
*
* 与内部 Agent 的 buildQualityScores 对齐:
* 内部 depthScore → 外部 coverageScore
* 内部 evidenceScore → 外部 evidenceScore
* 内部 breadthScore → 外部 diversityScore
* 内部 coherenceScore → 外部 coherenceScore
*
* @param [analysisText] dimension_complete 提供的分析文本
* @param [referencedFiles] 引用文件列表
*/
buildQualityReport(dimId: string, analysisText?: string, referencedFiles?: string[]): DimensionQualityReport;
/**
* 获取跨维度累积证据摘要 — 供下一维度参考
*
* @param currentDimId 当前维度 (将排除在结果之外)
* @returns { completedDimSummaries, sharedFiles, negativeSignals, usedTriggers }
*/
getAccumulatedEvidence(currentDimId: string): AccumulatedEvidence;
/** 获取指定维度的提交列表 */
getSubmissions(dimId: string): SubmissionRecord[];
/** 获取所有负空间信号 */
getNegativeSignals(): NegativeSignal[];
/** 获取全局文件证据地图 */
getFileEvidenceMap(): Map<string, Set<string>>;
/** 获取追踪统计 */
getStats(): {
dimensions: number;
totalSubmissions: number;
totalRejections: number;
uniqueFiles: number;
negativeSignals: number;
usedTriggers: number;
};
/**
* 获取所有已提交候选的标题集合(小写,用于跨维度硬去重)
*
* @param [excludeDimId] 可选,排除指定维度的标题
* @returns Set<string> 小写标题集合
*/
getAllSubmittedTitles(excludeDimId?: string): Set<string>;
}
export default ExternalSubmissionTracker;