/** * A2A Memory Plugin - Shared Types * * 이 파일은 모든 모듈이 공유하는 타입 정의입니다. * 변경 시 모든 의존 모듈에 영향을 미치므로 신중하게 수정하세요. */ export type MemoryCategory = 'error_solution' | 'code_pattern' | 'decision' | 'context' | 'project_knowledge' | 'convention' | 'learning' | 'skill' | 'rule'; export type MemoryTier = 'working' | 'episodic' | 'semantic'; /** * ADR-017 L1: 4-Type 분류 (WHY — 보존 전략 결정) * - FACT: 객관적 사실 (λ=0.005, TTL=180d) * - EXPERIENCE: 1인칭 경험 (λ=0.03, TTL=60d) * - PROCEDURE: 절차 지식 (λ=0.001, TTL=unlimited) * - EPISODE: 세션 컨텍스트 (λ=0.05, TTL=30d) */ export type MemoryType = 'fact' | 'experience' | 'procedure' | 'episode'; export interface Memory { id: string; content: string; category: MemoryCategory; memoryType?: MemoryType; tier: MemoryTier; tags: string[]; embedding?: number[]; projectPath?: string; sessionId?: string; createdAt: string; updatedAt: string; accessCount: number; lastAccessedAt?: string; qualityScore?: number; invalidAt?: string; parentId?: string; chunkIndex?: number; chunkTotal?: number; deprecatedBy?: string; mergedInto?: string; archivedAt?: string; memoryrank?: number; clusterId?: string; } export interface MemoryCreateInput { content: string; category: MemoryCategory; memoryType?: MemoryType; tier: MemoryTier; tags?: string[]; projectPath?: string; sessionId?: string; parentId?: string; chunkIndex?: number; chunkTotal?: number; qualityScore?: number; } export interface MemorySearchOptions { query: string; limit?: number; category?: MemoryCategory; tier?: MemoryTier; projectPath?: string; minScore?: number; } export interface MemorySearchResult { memory: Memory; score: number; matchType: 'vector' | 'fts' | 'hybrid'; } export interface SessionMessage { parentUuid?: string; uuid: string; type: 'human' | 'assistant' | 'system'; message: { role: string; content: string | SessionContentBlock[]; }; timestamp: string; gitBranch?: string; cwd?: string; } export interface SessionContentBlock { type: 'text' | 'tool_use' | 'tool_result'; text?: string; name?: string; input?: Record; content?: string; } export interface SessionInfo { sessionId: string; projectPath: string; filePath: string; messageCount: number; startTime?: string; endTime?: string; sizeBytes: number; modifiedAt: number; } export interface ExtractionResult { memories: MemoryCreateInput[]; sessionInfo: SessionInfo; stats: { totalMessages: number; extractedPatterns: number; filteredSensitive: number; processingTimeMs: number; }; } export interface TeamConfig { teamId: string; teamPath: string; nodeId: string; } export type VectorClockState = Record; export interface LLMConfig { enabled: boolean; provider: 'openai' | 'anthropic' | 'none'; apiKey?: string; model?: string; maxTokens?: number; } export type QuantizationLevel = 'none' | 'float32' | 'int8'; export interface EmbeddingConfig { enabled: boolean; provider: 'local' | 'openai' | 'e5'; dimensions: number; quantization?: QuantizationLevel; } export type StorageTier = 'hot' | 'warm' | 'cold'; export interface TieringConfig { enabled: boolean; hotThresholdDays: number; warmThresholdDays: number; coldCompressionEnabled: boolean; autoPromote: boolean; } export interface TieringResult { promoted: number; demoted: number; compressed: number; totalProcessed: number; } export interface LifecycleConfig { ttlDays: number; maxMemories: number; maxMemoriesPerProject?: number; cleanupOnSessionEnd: boolean; qualityThreshold: number; tiering?: TieringConfig; } export type ContradictionClassification = 'metric_update' | 'decision_reversal' | 'fact_correction' | 'no_conflict'; export interface ContradictionResult { classification: ContradictionClassification; confidence: number; reason: string; winner: 'newer' | 'existing'; } export interface ContradictionReview { id: string; newMemoryId: string; existingMemoryId: string; classification: ContradictionClassification; confidence: number; rawCosine: number; reason: string; status: 'pending' | 'approved' | 'rejected'; createdAt: string; resolvedAt?: string; } export interface ContradictionConfig { enabled: boolean; cosineThreshold: number; confidenceThreshold: number; decayFactor: number; maxCandidatesPerSession: number; } export interface MemoryQuality { relevance: number; freshness: number; usage: number; overall: number; } export type LogLevel = 'debug' | 'info' | 'warn' | 'error'; export interface LoggingConfig { enabled: boolean; level: LogLevel; outputDir: string; maxFileSizeMB: number; maxFiles: number; } export interface SkillConversionConfig { enabled: boolean; evaluationInterval: number; minRepetitions: number; similarityThreshold: number; minConfidence: number; reviewCycleDays: number; maxSkills: number; llmValidation: boolean; } export interface ProficiencyConfig { enabled: boolean; actr: { decayRate: number; baseLevelConstant: number; maxAssociativeStrength: number; fanEffectFactor: number; mismatchPenalty: number; retrievalThreshold: number; }; levelFormula: 'activation' | 'powerLaw'; maxLevel: number; } export interface A2AConfig { server: { url: string; apiKey?: string; }; mode: 'local' | 'team'; team?: TeamConfig; llm?: LLMConfig; embedding?: EmbeddingConfig; lifecycle?: LifecycleConfig; contradiction?: ContradictionConfig; autoCapture: { enabled: boolean; triggers: string[]; excludePatterns: string[]; significanceThreshold: number; }; autoInject: { enabled: boolean; maxMemories: number; maxTokens: number; projectScopeOnly?: boolean; minQuality?: number; }; search?: { rerank?: { enabled: boolean; nu: number; floor: number; expand: boolean; expandLimit: number; mmrLambda: number; }; }; contextrank?: { autoRebuild: { enabled: boolean; lagDays: number; nullThreshold: number; }; }; sessionSummary: { enabled: boolean; minActions: number; }; db: { path: string; maxSizeMB: number; }; autoSync: { enabled: boolean; pushOnSessionEnd: boolean; pullOnSessionStart: boolean; timeoutMs: number; intervalMs: number; staleHoursThreshold?: number; pendingThreshold?: number; encryption?: { enabled: boolean; algorithm: 'aes-256-gcm'; }; }; logging?: LoggingConfig; skillConversion?: SkillConversionConfig; proficiency?: ProficiencyConfig; realtimeInject?: RealtimeInjectConfig; emotionTracking?: { enabled: boolean; maxPerSession: number; }; abTest?: { enabled: boolean; }; tieredRetrieval?: { enabled: boolean; }; frozenSnapshot?: { enabled: boolean; midSessionAutoSync?: boolean; }; dialectic?: { enabled: boolean; minSessionMessages?: number; }; locale?: 'en' | 'ko'; } export declare const DEFAULT_CONFIG: A2AConfig; export interface HookContext { hookName: 'SessionStart' | 'PostToolUse' | 'SessionEnd' | 'UserPromptSubmit' | 'PreCompact'; sessionId: string; projectPath: string; cwd: string; /** * #90 (ADR-053 T4): 현재 세션의 transcript(.jsonl) 절대 경로. * * `normalizeHookInput`(`hooks/shared.ts:61`)이 `raw.transcript_path`를 이미 정규화해 넘기고 * 있었으나 타입에 노출되지 않아 접근할 수 없었다. * * SessionStart에서 이 파일의 **존재 여부**가 신규/이어받기를 가르는 직접 신호다 — * 신규 세션은 hook 실행 시점에 파일이 아직 없다(실측: hook 10:42:53~10:43:02 vs 파일 생성 10:43:10). */ transcriptPath?: string; } export interface SessionStartContext extends HookContext { hookName: 'SessionStart'; } export interface PostToolUseContext extends HookContext { hookName: 'PostToolUse'; toolName: string; toolInput: Record; toolResult: string; } export interface SessionEndContext extends HookContext { hookName: 'SessionEnd'; capturedMemoryIds: string[]; modifiedFiles: string[]; } export interface UserPromptSubmitContext extends HookContext { hookName: 'UserPromptSubmit'; userPrompt: string; } export interface PreCompactContext extends HookContext { hookName: 'PreCompact'; transcript: string; } export interface RealtimeInjectConfig { enabled: boolean; maxMemories: number; maxTokens: number; cacheSize: number; cacheTTLSeconds: number; timeoutMs: number; } export interface SignificanceSignal { name: string; score: number; matched: boolean; } export interface SignificanceResult { totalScore: number; signals: SignificanceSignal[]; shouldCapture: boolean; } export declare const SENSITIVE_PATTERNS: RegExp[]; //# sourceMappingURL=index.d.ts.map