autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
201 lines (200 loc) • 6.83 kB
TypeScript
/**
* SessionStore — Bootstrap 会话级存储 (合并 EpisodicMemory + ToolResultCache)
*
* 内部子系统:
* 1. DimensionReports — 跨维度分析报告 + 结构化证据 + 交叉引用 (from EpisodicMemory)
* 2. ReadOnlyCache — 只读工具结果缓存 (from ToolResultCache, 排除副作用工具 B3 fix)
*
* 替代关系:
* EpisodicMemory.js → 全部维度报告/证据/反思逻辑
* ToolResultCache.js → LRU 缓存逻辑 (仅只读工具)
*
* 新增能力 (vs 原模块):
* - getDistilledForProducer(dimId): Producer 专用蒸馏上下文 (B2 fix)
* - NON_CACHEABLE 内置: 副作用工具自动排除 (B3 fix)
* - buildContextForDimension 增强: 消费 workingMemoryDistilled (B1 fix, 已在 EpisodicMemory 修复)
* - 统一的 getStats(): 合并维度 + 缓存统计
*
* 生命周期: 与 Bootstrap 会话一致。
* 持久化: 通过 saveCheckpoint / loadCheckpoint 实现断点续传。
*
* @module SessionStore
*/
import type { SessionStoreSerialized } from './session-store-schema.js';
/** Finding 结构 */
export interface Finding {
finding: string;
evidence?: string;
importance: number;
dimId?: string;
timestamp?: number;
}
/** 候选摘要 */
export interface CandidateSummary {
dimId: string;
title: string;
subTopic: string;
summary: string;
}
/** 跨维度引用 */
export interface CrossReference {
from: string;
to: string;
relation: string;
detail: string;
}
/** 层反思 */
export interface TierReflection {
tierIndex: number;
completedDimensions: string[];
topFindings: Finding[];
crossDimensionPatterns: string[];
suggestionsForNextTier: string[];
}
/** WorkingMemory 蒸馏内容 */
export interface WorkingMemoryDistilled {
keyFindings?: Finding[];
toolCallSummary?: Array<string | {
tool: string;
summary: string;
}>;
stats?: Record<string, number>;
plan?: Record<string, unknown> | null;
totalObservations?: number;
compressedCount?: number;
}
/** 维度摘要 */
export interface DimensionDigest {
summary?: string;
candidateCount?: number;
keyFindings?: Array<string | Finding>;
crossRefs?: Record<string, string>;
gaps?: string[];
[key: string]: unknown;
}
/** 维度报告 */
export interface DimensionReport {
dimId: string;
completedAt: number;
analysisText: string;
findings: Finding[];
referencedFiles: string[];
candidatesSummary: CandidateSummary[];
workingMemoryDistilled: WorkingMemoryDistilled | null;
digest: DimensionDigest | null;
}
/** 维度报告输入 */
export interface DimensionReportInput {
analysisText?: string;
findings?: Array<{
finding?: string;
evidence?: string | string[] | unknown;
importance?: number;
}>;
referencedFiles?: string[];
candidatesSummary?: CandidateSummary[];
workingMemoryDistilled?: WorkingMemoryDistilled | null;
digest?: DimensionDigest | null;
}
/** SessionStore 构造选项 */
export interface SessionStoreConfig {
projectContext?: Record<string, unknown>;
ttlMs?: number;
cleanupIntervalMs?: number;
/** 项目名 (便捷传入, 会合并到 projectContext) */
projectName?: string;
primaryLang?: string;
fileCount?: number;
modules?: string[];
[key: string]: unknown;
}
/** 工具参数 */
interface ToolArgs {
pattern?: string;
filePath?: string;
[key: string]: unknown;
}
export declare class SessionStore {
#private;
constructor(config?: SessionStoreConfig);
/** 维度完成后存储完整报告 */
storeDimensionReport(dimId: string, report: DimensionReportInput): void;
getDimensionReport(dimId: string): DimensionReport | undefined;
getCompletedDimensions(): string[];
addEvidence(filePath: string, evidence: Omit<Finding, 'timestamp'>): void;
getEvidenceForFile(filePath: string): Finding[];
/** @returns >} */
searchEvidence(query: string, dimId?: string): {
filePath: string;
evidence: Finding;
}[];
addSubmittedCandidate(dimId: string, candidate: Omit<CandidateSummary, 'dimId'>): void;
addDimensionDigest(dimId: string, digest: DimensionDigest): void;
addTierReflection(tierIndex: number, reflection: TierReflection): void;
/** 获取所有 TierReflection (F17: EpisodicConsolidator 需要) */
getTierReflections(): TierReflection[];
getRelevantReflections(currentDimId: string): string | null;
/**
* 构建给 Analyst 的跨维度上下文
*
* @param [focusKeywordsOrOpts] 关键词数组或 options 对象
*/
buildContextForDimension(currentDimId: string, focusKeywordsOrOpts?: string[] | {
focusKeywords?: string[];
tokenBudget?: number;
}): string;
/** 兼容 DimensionContext.buildContextForDimension 返回格式 */
buildContextSnapshot(currentDimId: string): {
previousDimensions: Record<string, DimensionDigest>;
submittedCandidates: CandidateSummary[];
};
/**
* 获取维度的蒸馏上下文 (供 Producer 使用)
* @returns |null}
*/
getDistilledForProducer(dimId: string): {
keyFindings: Finding[];
toolCallSummary: (string | {
tool: string;
summary: string;
})[];
referencedFiles: string[];
} | null;
/** 获取缓存的工具结果 */
getCachedResult(toolName: string, args: ToolArgs): unknown | null;
/** 缓存工具结果 (自动排除副作用工具) */
cacheToolResult(toolName: string, args: ToolArgs, result: unknown): void;
/** 兼容 ToolResultCache.get() */
get(toolName: string, args: ToolArgs): unknown | null;
/** 兼容 ToolResultCache.set() */
set(toolName: string, args: ToolArgs, result: unknown): void;
saveCheckpoint(projectRoot: string): Promise<void>;
loadCheckpoint(projectRoot: string): Promise<boolean>;
toJSON(): SessionStoreSerialized;
static fromJSON(json: Record<string, unknown>): SessionStore;
/** 获取所有已引用文件 (去重, F10) */
getAllReferencedFiles(): Set<string>;
/** 获取统计数据 (合并维度 + 缓存统计, F12) */
getStats(): {
completedDimensions: number;
totalFindings: number;
totalEvidence: number;
totalCandidates: number;
crossReferences: number;
tierReflections: number;
referencedFiles: number;
cache: {
hitRate: string;
searchCacheSize: number;
fileCacheSize: number;
hits: number;
misses: number;
evictions: number;
};
};
/** 清空所有缓存 */
clearCache(): void;
/** 销毁实例,释放定时器 */
dispose(): void;
}
export default SessionStore;