UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

201 lines (200 loc) 6.83 kB
/** * 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;